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 :

cast supplémentaire inutile ?


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    958
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 958
    Points : 141
    Points
    141
    Par défaut cast supplémentaire inutile ?
    Bonjour,

    soit la liste d'animaux suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    List<Animal> animaux = new List<Animal>();
                        Animal chien_1 = new Chien();
     
                        Animal chat_1 = new Chat();
     
                        Animal animal_1 = new Animal();
     
                        Chien chien_2 = new Chien();
    Soit la classe Chien avec sa méthode Aboyer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    class Chien : Animal
        {
            public Chien(): base() { }
     
            public Chien(string prenomDuChien):base(prenomDuChien)
        {
     
        }//fin de constructeur*/
     
         public void Aboyer()
         {
             Console.WriteLine("Wouaf !");
         }//fin de méthode Aboyer*/
        }//fin de classe
    Si j'écris ce code pour faire aboyer les chiens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    foreach (Animal a in animaux)
              {   
                   if (a is Chien)
              {
                  ((Chien)a).Aboyer();
               }//fin de if 
    }//fin de foreach
    Est que le cast en Chien s'executera aussi pour l'instance chien_2 alors qu'il n'est pas nécessaire, ou est ce que ce dernier cast ne sera pas réalisé car chien_2 est déjà un Chien qui peut Aboyer?


    Merci beaucoup de votre réponse

    Bien cordialement.

    new_wave
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    C# fait ce que tu lui demandes de faire.
    Si tu forces un CAST, il sera effectué.

    D'ailleurs ce code génère un avertissement S3247 à cause du double CAST.
    https://rules.sonarsource.com/csharp/RSPEC-3247/

    Il est préférable d'utiliser la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach (Animal a in animaux)
    {
        if (a is Chien chien)
        {
            chien.Aboyer();
        }
    }

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    ça s'appelle un modèle (ou pattern): la doc : https://learn.microsoft.com/fr-fr/do...-type-patterns

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    A noter qu'il est possible d'écrire autrement le code encore, en le simplifiant d'autant plus, si tu ne cherches à exécuter un traitement spécifique que sur une seule classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach (Chien chien in animaux.OfType<Chien>())
    {   
       chien.Aboyer();           
    }
    Par contre, s'il y en a plusieurs, il vaut mieux utiliser l'approche de popo (et avec un switch, c'est encore mieux).
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    958
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 958
    Points : 141
    Points
    141
    Par défaut CAST inutile
    Citation Envoyé par popo Voir le message
    C# fait ce que tu lui demandes de faire.
    Si tu forces un CAST, il sera effectué.

    D'ailleurs ce code génère un avertissement S3247 à cause du double CAST.
    https://rules.sonarsource.com/csharp/RSPEC-3247/

    Il est préférable d'utiliser la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach (Animal a in animaux)
    {
        if (a is Chien chien)
        {
            chien.Aboyer();
        }
    }

    Bonjour,

    Dans ce cas , si je comprends bien, quand a est déjà un Chien avec toutes les méthodes d'un Chien, il n'y a pas de conversion et quand a est un Chien avec les méthodes d'un Animal, il est converti en "vrai" Chien .
    is peut donc aussi permettre un CAST, si j'ai bien compris.

    Merci de ton retour.

    Bien cordialement.

    new_wave
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    958
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 958
    Points : 141
    Points
    141
    Par défaut CAST inutile
    C'est la solution que j'ai finalement retenue.Je pense que c'est la plus efficace!

    Bien cordialement.

    new_wave



    Citation Envoyé par François DORIN Voir le message
    A noter qu'il est possible d'écrire autrement le code encore, en le simplifiant d'autant plus, si tu ne cherches à exécuter un traitement spécifique que sur une seule classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach (Chien chien in animaux.OfType<Chien>())
    {   
       chien.Aboyer();           
    }
    Par contre, s'il y en a plusieurs, il vaut mieux utiliser l'approche de popo (et avec un switch, c'est encore mieux).
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Citation Envoyé par new_wave Voir le message
    Dans ce cas , si je comprends bien, quand a est déjà un Chien avec toutes les méthodes d'un Chien, il n'y a pas de conversion
    Non, tu n'a pas compris.
    Si tu forces un CAST, il sera effectué.

    Citation Envoyé par new_wave Voir le message
    quand a est un Chien avec les méthodes d'un Animal, il est converti en "vrai" Chien .
    Quand tu déclare une variable avec un type Animal, il faut obligatoirement le CASTER pour qu'il soit considérer comme un Chien.
    Si tu as un Chat et que tu forces le CAST en Chien, tu vas planter.

    Citation Envoyé par new_wave Voir le message
    is peut donc aussi permettre un CAST, si j'ai bien compris.
    is fait effectivement un CAST, tout comme [C]as|/C].


    Citation Envoyé par new_wave Voir le message
    C'est la solution que j'ai finalement retenue.Je pense que c'est la plus efficace!
    On ne prend pas une décision sur une impression.
    On la prend sur des faits et sur la réflexion qu'on réalise à partir de ces fait.
    Dans les faits, François DORIN t'as donné un avertissement sur cette syntaxe : il ne fonctionne que si tu gère uniquement des Chiens
    Dans les faits, tu gère aussi des chats d'après le code que tu as donné.
    Donc, à toi t'en tirer des conclusions.

Discussions similaires

  1. Double cast inutile..ou pas?
    Par eatherquake dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 15/10/2010, 22h43
  2. CAST ou autre ?
    Par 74160 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/07/2003, 15h00
  3. CAST DATETIME ----> SMALLDATETIME
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/06/2003, 12h07
  4. traduction en delphi "reinterpreted cast"
    Par Chupakabra dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2003, 15h49
  5. Réponses: 2
    Dernier message: 03/12/2002, 11h42

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