IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

boucle, cast et performances


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 302
    Billets dans le blog
    2
    Par défaut boucle, cast et performances
    Bonjour,

    Imaginons que j'ai une classe Mere, ainsi qu'une classe Fille qui herite de Mere.
    Maintenant j'ai une collection de Mere, qui contient des Mere et des Fille.
    Et je voudrais effectuer un traitement sur chaque element de cette collection mais seulement sur les objets de type Fille.

    Un exemple concret: j'ai une classe MyControlType qui herite de Control.
    Ma Form possede une collection de Control, dans lequel j'insere des MyControlType, mais qui possede egalement des controles "normaux" (boutons etc.). Et je voudrais faire une boucle sur Controls, de facon a appeler une fonction DoSomething() de MyControlType. Pour l'instant, j'ai le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach (Control c in Controls)
        if (c is MyControlType)
            ((MyControlType)c).DoSomething();
    Ca marche, mais le compilateur me lance un "performance warning". Car effectivement, il y a des casts dans tous les sens dans cette boucle. J'imagine par exemple que le is effectue un "cast cache".

    Comment faire, donc, pour faire cela proprement?

  2. #2
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    Et comme ça ?

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach (MyControlType mc in Controls.Where(c => c is MyControlType)) {
         mc.DoSomething();
    }

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Bonjour,

    tu peux créer une méthode virtuelle DoSomething() dans ta classe mère que tu override dans ta classe fille avec les opérations à faire. Tu ne mets rien dans la méthode de la classe mère et ensuite tu boucles juste en appelant la méthode. Si c'est une mère, la méthode est vide, si c'est une fille, la méthode contient les opérations à faire.
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  4. #4
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    Citation Envoyé par MaximePalmisano Voir le message
    tu peux créer une méthode virtuelle DoSomething() dans ta classe mère que tu override dans ta classe fille avec les opérations à faire. Tu ne mets rien dans la méthode de la classe mère et ensuite tu boucles juste en appelant la méthode. Si c'est une mère, la méthode est vide, si c'est une fille, la méthode contient les opérations à faire.
    Si tu peux éditer la classe mère c'est sans doute le plus simple en effet pour éviter les cast.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 302
    Billets dans le blog
    2
    Par défaut
    Merci pour vos reponses.
    Malheureusement non, je ne peux pas editer la classe mere, qui est une classe du framework. Je ne peux meme pas modifier la collection, qui appartient a la classe Windows.Form.

    Je pense donc que la solution va etre celle de Er3van.


  6. #6
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonjour,

    Tout en restant en Linq et basé sur la solution d'Er3van il faut savoir qu'il existe déjà exactement ce qui est demandé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach (MyControlType mc in Controls.OfType<MyControlType>()) {
         mc.DoSomething();
    }
    Cordialement !

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Par défaut
    Bonjour,

    Sauf erreur de ma part, l'IL généré par le compilateur à partir du code d'Er3van
    sera du même acabit que celui issu de ton premier code.

    En effet il y a un cast caché dans le foreach, on fait dans tout les cas le test avec "is".
    Pour moi ça reviens strictement a la même chose, sauf que dans un cas le compilateur est capable de t'indiquer qu'il y a un potentiel problème de performance, et pas dans l'autre.

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    moi je ne vois rien qui mène à se poser des questions de performance là dessus
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    Citation Envoyé par Guulh
    Tu refuses ici les objets d'un type dérivé de MyControlType.
    Citation Envoyé par r0d
    Et je voudrais effectuer un traitement sur chaque element de cette collection mais seulement sur les objets de type Fille.
    Faudrait savoir ^^

    C'est sur qu'un Equals doit être plus couteux ...
    Mais ça retire le double cast

    Soit dit en passant ...
    Je sais très bien que c'est super laid ce que j'ai écrit ^^

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par brachior Voir le message
    Faudrait savoir ^^
    Bah les objets dérivés de Fille sont aussi des Fille...

  11. #11
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    Rah ça chipote là ^^

  12. #12
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par brachior Voir le message
    Rah ça chipote là ^^
    Bah c'est surtout que c'est un principe de base de la POO : un utilisateur d'une classe ne doit pas se comporter différemment selon qu'une référence donnée soit d'un type mère ou de l'un de ses types fils. Ca doit correspondre à ça, si je ne me trompe.

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Ca doit correspondre à ça, si je ne me trompe.
    C'est aussi ce que j'aurais dit...

  14. #14
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    Je comprends bien le coup du mec qui se perd et tout et tout ...
    Mais c'est pas comme ci dès le deuxième post je le précisais Oo

    Citation Envoyé par brachior Voir le message
    Soit dit en passant ...
    Je sais très bien que c'est super laid ce que j'ai écrit ^^
    Pour ce qui est des points ...
    Le coup d'en gagner parce qu'on à cliqué sur Résolu ...
    Je ne vois pas en quoi ça prouve quelque chose ...

    Citation Envoyé par tomlev Voir le message
    Pas sûr que C# existe encore en 2029
    Lol ^^
    Ce langage me pose tellement de problème bizarre
    (et Visual Studio par la même occasion ^^)
    Que j'aimerai bien que tes dires soient vrais

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par brachior Voir le message
    Que j'aimerai bien que tes dires soient vrais
    Pas moi ! Par contre j'espère que VB.NET aura disparu d'ici là

  16. #16
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    En 2029 des automates seront capables de coder à partir des spécifications fonctionnelles !

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Er3van Voir le message
    En 2029 des automates seront capables de coder à partir des spécifications fonctionnelles !
    OK, mais qui codera les automates ?

Discussions similaires

  1. Utilisartion d'une arraylist dans une boucle, question de performance
    Par Djobird dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 20/07/2007, 17h28
  2. performance des 'cast'
    Par me_myself dans le forum C++
    Réponses: 27
    Dernier message: 06/12/2006, 15h49
  3. Réponses: 2
    Dernier message: 28/08/2006, 13h16
  4. Problème de Boucle (Perform: Ouille!)
    Par ted the Ors dans le forum Cobol
    Réponses: 13
    Dernier message: 23/07/2006, 21h00
  5. [Performance] LEFT JOIN vs SELECT dans une boucle (PHP)
    Par frochard dans le forum Requêtes
    Réponses: 4
    Dernier message: 28/10/2005, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo