L'implémentation de Equals par défaut prend en charge l'égalité des références uniquement, mais les classes dérivées peuvent substituer cette méthode pour prendre en charge l'égalité des valeurs.
Pour les types référence, l'égalité est définie comme une égalité d'objets, c'est-à-dire si les références renvoient ou non au même objet. Pour les types valeur, l'égalité est définie comme une égalité au niveau du bit. La classe ValueType prend en charge les types valeur.
Remarques à l'attention des implémenteurs
Cette méthode peut être substituée par une classe dérivée. Par exemple, de nombreux types de données de base retournent
true si les deux objets représentent la même valeur ; sinon,
false.
Cette méthode ne compare que des primitives et des objets. Elle doit être substituée pour comparer des structures plus complexes, telles que des tableaux d'objets.
Les instructions suivantes doivent avoir la valeur true pour toutes les implémentations de la méthode
Equals. Dans la liste, x, y et z représentent des références d'objet non référence Null (
Nothing en Visual Basic).
-
x.Equals(x) retourne true, sauf dans des scénarios qui impliquent des types virgule flottante. Consultez IEC 60559:1989, Binary Floating-point Arithmetic for Microprocessor Systems.
-
x.Equals(y) retourne la même valeur que y.Equals(x).
-
x.Equals(y) retourne true si x et y sont NaN.
-
(x.Equals(y) && y.Equals(z)) retourne true si et seulement si x.Equals(z) retourne true.
-
Les appels successifs à x.Equals(y) retournent la même valeur aussi longtemps que les objets référencés par x et y ne sont pas modifiés.
-
x.Equals(référence Null (Nothing en Visual Basic)) retourne false.
Pour les comportements supplémentaires nécessaires propres à la méthode
Equals, consultez
GetHashCode.
Les implémentations de
Equals ne doivent pas lever d'exception.
Pour certains types d'objets, il est souhaitable que
Equals teste l'égalité des valeurs plutôt que l'égalité des références. De telles implémentations de
Equals retournent
true si les deux objets possèdent la même « valeur », même s'il ne s'agit pas de la même instance. L'implémenteur du type décide ce qui constitue la « valeur » d'un objet, mais il s'agit généralement d'une partie ou de la totalité des données stockées dans les variables d'instance de l'objet. Par exemple, la valeur de
String se base sur les caractères de la chaîne. La méthode
Equals de la classe
String retourne
true lorsque deux instances de chaîne contiennent exactement les mêmes caractères dans le même ordre.
Les types qui implémentent
IComparable doivent substituer
Equals.
Les types qui substituent
Equals doivent également substituer
GetHashCode ; sinon, il se peut que
Hashtable ne fonctionne pas correctement.
Si votre langage de programmation prend en charge la surcharge d'opérateur et si vous choisissez de surcharger l'opérateur d'égalité pour un type donné, ce type doit substituer la méthode
Equals. De telles implémentations de la méthode
Equals doivent retourner les mêmes résultats que l'opérateur d'égalité. Suivez ces indications afin de garantir que le code de la bibliothèque de classes utilisant
Equals (notamment
ArrayList et
Hashtable) se comporte de manière cohérente avec le mode d'utilisation de l'opérateur d'égalité par le code d'application.
Les indications suivantes concernent l'implémentation d'un type valeur :
-
Pensez à substituer Equals afin d'améliorer les performances par rapport à celles qui sont fournies par l'implémentation par défaut de Equals sur ValueType.
-
Si vous substituez Equals et si le langage prend en charge la surcharge d'opérateur, vous devez surcharger l'opérateur d'égalité pour votre type valeur.
Les indications suivantes concernent l'implémentation d'un type référence :
-
Pensez à substituer Equals sur un type référence si la sémantique du type se base sur le fait que le type représente une ou plusieurs valeurs.
-
La plupart des types référence ne doivent pas surcharger l'opérateur d'égalité, même s'ils substituent la méthode Equals. Cependant, si vous implémentez un type référence qui doit avoir une sémantique de valeur, telle qu'un type nombre complexe, vous devez substituer l'opérateur d'égalité.