Lors de la mise en œuvre d'un opérateur (cette liste pourrait ne pas être exhaustive). P> == code>, j'ai le sentiment que je manque des points essentiels.
Par conséquent, je cherche quelques meilleures pratiques autour de cela.
Voici quelques questions connexes que je pense à: p>
iequatable
objet.equals code>? Li>
! = code> li>
ul>
4 Réponses :
Je suivrais que je suivrais Microsoft's Lignes directrices pour surcharger des égaux ( ) et opérateur == . p>
Modifier strong>: les directives de Microsoft contiennent cette remarque importante, qui semble confirmer la réponse de Henk: p>
Par défaut, l'opérateur == Tests pour l'égalité de référence par
déterminer si deux références indiquent le même objet, alors référence
Les types n'ont pas besoin d'implémenter l'opérateur == afin de gagner cela
Fonctionnalité. Lorsqu'un type est immuable, ce qui signifie que les données contenues dans
L'instance ne peut pas être modifiée, Opérateur de surcharge == pour comparer
la valeur égalité au lieu d'égalité de référence peut être utile car, comme
objets immuables, ils peuvent être considérés comme les mêmes que longtemps qu'ils
avoir la même valeur. Opérateur remplaçant == dans des types non immuables est
non recommandé p>
blockQuote>
Le lien est mort en 2018. (C'est pourquoi nous devrions citer des parties pertinentes des documents en plus de la liaison.)
@rianjs n'est-ce pas exactement ce que j'ai fait?
"Quelles sont les meilleures pratiques pour implémenter l'opérateur == code>?" Suivi par "Je suivrais que les directives de Microsoft
== code>.
Citation étendue au paragraphe complet, il a été tiré.
En fait, vous devez mettre en œuvre! = Aussi, sinon C # ne vous laissera pas compiler.
Chaque fois que vous implémentez l'opérateur Considérant une classe, voici ma mise en œuvre habituelle: P> == code>, assurez-vous d'implémenter également
! = code>,
iéquatif
Objet.equals () code> et
objet.gethashcode () code> pour la cohérence de l'utilisateur de votre classe.
public bool Equals(MyClass other) {
if (ReferenceEquals(other, null))
return false;
if (ReferenceEquals(other, this))
return true;
return // your equality code here
}
public override bool Equals(object obj) {
return Equals(obj as MyClass);
}
public override int GetHashCode() {
return // your hash function here
}
public static bool operator ==(MyClass left, MyClass right) {
return Equals(left, right);
}
public static bool operator !=(MyClass left, MyClass right) {
return !(left == right);
}
Cette. De plus, si vous implémentez un opérateur <(moins que) initialement, vous pouvez utiliser cet opérateur seul pour implémenter chaque autre opérateur. IE: == peut être exprimé comme! (gauche
L'approche la plus courante est Ainsi, vous voulez d'abord être très sûr de besoin de comportement de type de valeur. P>
Devant qu'il y ait une réponse claire de la question plutôt que des conseils de dire à quelqu'un de changer la façon dont ils font les choses.
Vérifiez ces threads: , Stackoverflow.com/questions/1421289/IFOMOMADABLE-AIGALS < / a>, Stackoverflow.com/questions/660566/... , Stackoverflow.com/Questtions/567642/...