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 :

[C#] Pour comparer 2 objets de type référence, peut-on utiliser == ou Equals ?


Sujet :

C#

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 545
    Points
    545
    Par défaut [C#] Pour comparer 2 objets de type référence, peut-on utiliser == ou Equals ?
    Bonjour,

    Pour comparer 2 objets de type référence en C#, peut on utiliser == ou doit on utiliser Equals() comme en Java ?
    Je sais que pour les chaines de caractères en C# l'opérateur == compare bien les valeurs mais je ne sais pas pour les objets quelconques de type référence.
    Merci.

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Comme tout dérive de Object alors .Equals() reste toujours possible
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Par défaut, == et Equals comparent les références, donc sont interchangeables (avec le bonus que pour ==, les deux objets peuvent être nuls sans que ça complique les choses :)

    Maintenant la principale différence est que Equals est une méthode virtuelle. Donc si on veut que les instances d'une classe soit comparables par rapport à leur contenu et pas à leur référence, c'est du côté d'Equals qu'il faut regarder. Pour l'opérateur, sauf cas particulier, il vaut mieux le laisser tranquille et qu'il continue à comparer les références. En revanche, si on touche à l'opérateur ==, il *faut* aligner le comportement de Equals (et de l'opérateur !=) dessus.

    Exemple bateau de la différence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public bool AreEqual1( object x, object y )
    {
      return x.Equals( y );
    }
     
    public bool AreEqual2( object x, object y )
    {
      return x == y;
    }
    Si le type de x est censé être comparé par valeur et qu'il redéfinit Equals pour le faire, la première méthode fera la bonne comparaison. En revanche, la deuxième méthode fera toujours une comparaison des références, même si l'opérateur == du type concerné est redéfini.
    C'est un opérateur, il est statique, il n'est appelé que quand on passe directement par le type lui-même. Si on passe par object, par une interface ou par une classe de base, un opérateur == redéfini plus bas dans la hiérarchie est ignoré.

    Equals en revanche est toujours appelé sur la vraie classe.


    Un inconvénient qui devrait sauter aux yeux dans la première méthode : si x est nul, ça explose :)

    En bref :
    - si tu veux comparer des références -> ==
    - si tu veux comparer des valeurs -> Equals (en faisant gaffe à null)

    Si tu es sûr qu'une des deux variables n'est pas nulle, tu peux utiliser systématiquement Equals, ça évite d'avoir à se demander si la classe en question est censée être comparée par valeur ou par référence.

    Cas particuliers, des classes comme string, qui ne sont pas dérivables et ne sont pas basées sur des interfaces. L'opérateur == est utilisable dans tous les cas parce que l'appel se fera forcément sur la bonne classe. *Sauf* si un objet de type string est passé à une méthode comme étant de type object et que cette méthode fait une comparaison avec ==. Là ça fera une comparaison de références :)


    Qui a dit qu'il était facile de comparer deux variables ? :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 545
    Points
    545
    Par défaut
    Réponse géniale et très claire. Merci beaucoup.

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

Discussions similaires

  1. [AC-2007] quel type de variable pour récupérer des objets de type Ole
    Par rominous41 dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/05/2011, 16h59
  2. objet de type Range - pour utilisation temporaire
    Par angipici dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/08/2008, 00h13
  3. Réponses: 7
    Dernier message: 17/07/2008, 11h10
  4. Souci pour comparer deux objets avec equals()
    Par xillibit dans le forum Langage
    Réponses: 7
    Dernier message: 30/09/2007, 15h41
  5. Réponses: 1
    Dernier message: 14/05/2007, 23h31

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