2009-03-06 9 views
5

Surcharger l'opérateur de comparaison, comment comparer si les deux variables des points sur le même objet (i.e.. Pas de valeur)Après avoir surchargé l'opérateur ==, comment comparer si deux variables pointent sur le même objet?

public static bool operator ==(Landscape a, Landscape b) 
{ 
    return a.Width == b.Width && a.Height == b.Height; 
} 

public static bool operator !=(Landscape a, Landscape b) 
{ 
    return !(a.Width == b.Width && a.Height == b.Height); 
} 
+1

J'essaie d'éviter de surcharger ces opérateurs pour les types de référence car la plupart des gens s'attendront à ce que == teste l'égalité des objets. –

Répondre

8

Utilisez les Object.ReferenceEquals méthode statique. Bien sûr, pour que la méthode == et! = Conservent leur fonctionnalité complète, vous devez également remplacer Equals et GetHashCode afin qu'ils retournent un ensemble cohérent de réponses aux appelants.

4
+0

'ReferenceEquals (objet, objet)' est une méthode statique de la classe 'Object' et ne peut pas être utilisée comme cela à moins que vous n'écriviez une méthode d'extension pour cela. Pour l'utiliser, il faut appeler: 'object.ReferenceEquals (a, b)' –

4

Pour vérifier si les deux pointent sur le même objet. Vous devez utiliser la méthode Object.ReferenceEquals. Il retournera vrai si les deux sont identiques ou si les deux sont NULL. Sinon, il retournera faux

0

Je sais que c'est une vieille question, mais si vous allez surcharger la méthode == ou Object.Equals, vous devriez aussi surcharger l'opérateur inverse! =.

Et dans ce cas, puisque vous comparez des nombres internes, vous devez surcharger les autres opérateurs de comparaison <,>, < =,> =. Les personnes qui consomment votre classe à l'avenir, qu'il s'agisse de consommateurs tiers ou de développeurs qui prennent en charge votre code, pourraient utiliser quelque chose comme CodeRush ou Refactor, qui va automatiquement "inverser" la logique (également appelée inversion). le conditionnel) puis l'aplatir, pour sortir du syndrome des 25 imbriqués. Si leur code le fait, et que vous avez surchargé l'opérateur == sans surcharger l'opérateur! =, Cela pourrait changer la signification voulue de votre code.

Questions connexes