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 :

Comparaison de deux objets en valeur avec equals()


Sujet :

C#

  1. #1
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 373
    Points : 110
    Points
    110
    Par défaut Comparaison de deux objets en valeur avec equals()
    Bonjour,
    Je sais que pour comparer deux objets en valeur, on utilise la méthode Equals().
    J'ai testé cet exemple:

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Test a = new Test(4);
                Test b = new Test(4);
                Console.WriteLine(a.Equals(b));
                Console.ReadLine();
            }
        }
     
        public class Test
        {
            int x;
            public Test(int y)
            {
                x = y;
            }
        }
    }
    La ligne Console.WriteLine(a.Equals(b)); retourne False, alors que j'attends la valeur True, parce que a et b sont égaux en valeur!

    donnez-moi une explication svp!

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    Bonjour,

    La classe Test hérite de Object.

    Pour Object, la méthode Equals retourne true si les deux références renvoient à la même instance d'objet. Le comportement obtenu est donc tout à fait normal étant donné que les deux objets, même si ils ont la même valeur pour votre code ne sont pas une seule et même instance.

    Vous pouvez substituer la méthode Equals dans la classe Test pour modifier le comportement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    public int X { get { return x; } }
     
    public override bool Equals (Object obj) {
    if(obj == null || this.GetType() != obj.GetType()) return false;
    return ((Test)obj).X = this.X;
    }
    En général, il faut également surcharger les opérateurs == et != pour avoir un comportement identique.

  3. #3
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Juste pour compléter, c'est parce que Test est une classe (type référence) que l'on a se comportement. Si Test était une structure (type valeur) le test d'égalité entre 2 instances de Test revient à tester l'égalité de chaque membre des instances concernées et dans le cas où ces membres sont égalements de type valeur il n'y a rien de spécial à faire. Tu aurais donc eu true comme résultat dans la console avec une structure au lieu d'une classe.
    Pas de questions techniques par MP

  4. #4
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 373
    Points : 110
    Points
    110
    Par défaut
    Merci pour ces explications, mais il me reste une petite question:
    Est-ce qu'il y a une différence entre Equals et ReferenceEquals?

  5. #5
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Citation Envoyé par insane_80 Voir le message
    Merci pour ces explications, mais il me reste une petite question:
    Est-ce qu'il y a une différence entre Equals et ReferenceEquals?
    Comme son nom l'indique ReferenceEquals compare si deux objets pointent vers la même référence.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Personne p1=new Personne();
    Personne p2=new Personne();
    Personne p3=p1;
     
    object.ReferenceEquals(p1,p2);//faux
    object.ReferenceEquals(p1,p3);//vrai

    Equals a le même comportement par défaut que ReferenceEquals à la difference que Equals tu peux la surcharger dans la classe personne et du coup définir une comparaison sur les propriétés de la classe Personne (Par exemple deux personne identiques ont le même numéro de la carte d'identité).
    Alors que ReferenceEquals est une méthode statique et donc non "surchargeable".
    Mehdi Feki : Modérateur .Net

  6. #6
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 373
    Points : 110
    Points
    110
    Par défaut
    Merci beaucoup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tester deux objets avec equals()
    Par Danger dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 12/07/2009, 11h05
  2. Souci pour comparer deux objets avec equals()
    Par xillibit dans le forum Langage
    Réponses: 7
    Dernier message: 30/09/2007, 15h41
  3. Problème comparaison objets avec equals
    Par belkasmi dans le forum Langage
    Réponses: 8
    Dernier message: 01/08/2007, 17h39
  4. Comparaison de deux valeurs.
    Par Mobistar dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 21/03/2007, 15h55
  5. Réponses: 8
    Dernier message: 09/03/2005, 10h47

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