7
votes

Quelles sont les meilleures pratiques pour la mise en œuvre de l'opérateur == pour une classe en C #?

Lors de la mise en œuvre d'un opérateur == , 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 à:

  • Comment gérer proprement la comparaison de référence?
  • devrait-il être mis en œuvre via une interface iequatable -itant? Ou remplacer objet.equals ?
  • et qu'en est-il de l'opérateur ! =

    (cette liste pourrait ne pas être exhaustive).


4 Réponses :


10
votes

Je suivrais que je suivrais Microsoft's Lignes directrices pour surcharger des égaux ( ) et opérateur == .

Modifier : les directives de Microsoft contiennent cette remarque importante, qui semble confirmer la réponse de Henk:

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é


4 commentaires

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 == ?" Suivi par "Je suivrais que les directives de Microsoft " citant une seule ligne de ce qui était autrefois une seule page ("éviter de le faire en types mutables") n'est pas une réponse particulièrement bonne, non. Ce n'est pas complet; C'est une demi-pensée qui n'a pas été utile pour quelqu'un qui souhaite connaître l'ensemble complet de meilleures pratiques autour de la mise en œuvre d'un opérateur == .


Citation étendue au paragraphe complet, il a été tiré.



4
votes
  • Si vous implémentez ==, remplacez-les et. Gethashcode
  • implémentez! = aussi bien
  • Vérifiez les références NULL à l'aide d'objet.reeferefeuplages, sinon l'opérateur recueille

1 commentaires

En fait, vous devez mettre en œuvre! = Aussi, sinon C # ne vous laissera pas compiler.



5
votes

Chaque fois que vous implémentez l'opérateur == code>, assurez-vous d'implémenter également ! = code>, iéquatif code> et pour remplacer Objet.equals () code> et objet.gethashcode () code> pour la cohérence de l'utilisateur de votre classe.

Considérant une classe, voici ma mise en œuvre habituelle: P>

    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);
    }


1 commentaires

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



3
votes

L'approche la plus courante est pas pour le gérer. La valeur par défaut est la comparaison de référence qui en général est correcte pour les objets de classe.

Ainsi, vous voulez d'abord être très sûr de besoin de comportement de type de valeur.


1 commentaires

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.