ou il est conseillé de le faire? Pourquoi? P>
9 Réponses :
Si vous remplacez la méthode des égaux et que vous souhaitez toujours pouvoir vérifier l'égalité (ou l'inégalité), vous devez probablement remplacer les méthodes == et! =. P>
Ce n'est pas nécessaire, mais une chose intelligente à faire. p>
Si vous créez un cadre et un autre développeur autre que vous allez utiliser l'objet, vous devriez remplacer le == et! =. Ainsi, lorsqu'un développeur peut l'utiliser, ils ont au moins la logique droite de comparer les 2 objets plutôt que de simplement être identiques en mémoire. P>
Je voudrais vous assurer que votre == &! = Appelez votre méthode Equals. P>
voir Lignes directrices pour la mise en œuvre d'un équivalent et l'opérateur d'égalité ( ==) p>
Pour les types de valeur (Structs) "Implémente == Chaque fois que vous remplacez la méthode des égaux" p>
Pour les types de référence (classes), "la plupart des types de référence, même ceux qui implémentent la méthode des égaux, ne doivent pas remplacer ==." L'exception concerne des classes immuables et celles avec une sémantique ressemblant à une valeur de valeur. P>
Il serait souhaitable, car il serait inattendu si: ... se comporte différemment à: p>
Il existe de nombreux cas où foo == bar code> se comportera différemment de
foo.equals (bar) code>. Une croyance erronée en leur équivalence est susceptible de causer des problèmes de bienfaits que de reconnaître qu'ils ne peuvent pas toujours se comporter de la même manière et que le framework contient des incohérences dans ce que
est égal à code>. Un désir d'un IMHO a mal placé de le faire correspondre
== code>].
@supercat Un bon exemple est lorsque la comparaison des types nullables, est égal à Smart et vérifie HasValue de chaque côté.
@ Gary: Je pensais plus de choses comme décimal code>. Il est utile d'avoir un moyen de comparaison qui considère les objets classés comme égaux si ni ne se classe plus au-dessus de l'autre, mais il est également utile d'avoir un moyen de test d'égalité pouvant reconnaître des objets de manière égale (par exemple 1.0D et 1.00D). IMHO, de tels objets doivent donner des résultats de comparaison opposés avec
== code> et
.fequals code>.
Ce n'est pas nécessaire, personne ne vous tuera si vous ne le faites pas. P>
Toutefois, remarquez-vous qu'il est souvent plus naturel d'écrire (A == B) que d'aisés (b). Si vous fournissez les deux méthodes, il sera plus facile pour les consommateurs de votre code. P>
Voir le Lignes directrices pour remplacer les équivalents () et opérateur == . p>
Quote: P>
Par défaut, l'opérateur == Tests pour l'égalité de référence en déterminant si deux références indiquent le même objet. Par conséquent, les types de référence ne doivent pas nécessairement mettre en œuvre l'opérateur == afin de gagner cette fonctionnalité. Lorsqu'un type est immuable, c'est-à-dire que les données contenues dans l'instance ne peuvent pas être modifiées, l'opérateur de surcharge == pour comparer la valeur égalité au lieu d'une égalité de référence peut être utile car, comme des objets immuables, ils peuvent être considérés comme les mêmes comme ils ont la même valeur. Ce n'est pas une bonne idée de remplacer l'opérateur == dans des types non immuables. P> blockQuote>
Fondamentalement: P>
Si vous voulez == et! = Pour se comporter comme
égale (..) code> et
! Equals (..) code> Vous devez mettre en œuvre les opérateurs. Vous ne faites généralement que cela uniquement avec des types immuables. P>
En plus de toutes les réponses déjà ici, n'oubliez pas d'assurer gethascode () code> est également cohérent. P>
ineequals (b) A ne peut pas être nul dans un == B soit peut être null p>
Premier remplacement == Pour que l'appeler est égal à ce que cela me frappe comme une idée généralement mauvaise pour les types de référence. Si vous remplacez == pour l'appeler égale, je ne pense pas qu'il y ait un moyen pour un utilisateur de votre code de tester si deux références d'objet font référence au même objet (par rapport à un objet avec des propriétés égales). P >
Si les gens veulent tester des instances de vos classes pour une valeur égalité de la valeur, ils devraient simplement appeler égales, sauvegarder == pour tester l'égalité de référence spécifique. P>
Vous pouvez utiliser objet.reefervantsequives code> pour vérifier spécifiquement l'égalité de référence.
Bien qu'il soit possible d'utiliser objet.reefereferequens code>, c'est assez maladroit. Je considère l'utilisation C # du jeton code> == code> pour les opérateurs de test de test et d'égalité de référence surchargeable et d'égalité de référence comme l'une des principales erreurs de conception dans la langue.