76 votes

Ce qui doit être changé dans une structure pour assurer l'égalité fonctionne correctement?

Comme le titre le dit: j'ai besoin de remplacer l' == opérateur? que diriez - .Equals() méthode? Rien de ce que je suis absent?

93voto

UpTheCreek Points 7719

Un exemple à partir de msdn

public struct Complex 
{
   double re, im;
   public override bool Equals(Object obj) 
   {
      return obj is Complex && this == (Complex)obj;
   }
   public override int GetHashCode() 
   {
      return re.GetHashCode() ^ im.GetHashCode();
   }
   public static bool operator ==(Complex x, Complex y) 
   {
      return x.re == y.re && x.im == y.im;
   }
   public static bool operator !=(Complex x, Complex y) 
   {
      return !(x == y);
   }
}

47voto

Dzmitry Huba Points 3333

Vous devriez également mettre en œuvre IEquatable<T>. Voici un extrait de Cadre des lignes Directrices de Conception:

NE mettre en œuvre IEquatable sur les types de valeur. L'Objet.Méthode Equals sur la valeur des types de causes de boxe, et de ses l'implémentation par défaut n'est pas très efficace, car il utilise réfection. IEquatable.Est égal peut offrir beaucoup mieux, et peut-être mis en œuvre de manière à ne pas causer de boxe.

public struct Int32 : IEquatable<Int32> {
    public bool Equals(Int32 other){ ... }
}

Suivez les mêmes directives que pour primordial de l'Objet.Est égal à quand la mise en œuvre de IEquatable.D'égal à égal. Voir la section 8.7.1 détaillées directives sur le remplacement de l'Objet.Est égal à

17voto

Ajk Points 58

Malheureusement je n'ai pas assez de réputation pour commenter d'autres entrées. Donc, je vais l'afficher amélioration possible de la solution ici.

Corrigez-moi si je me trompe, mais la mise en œuvre mentionnées ci-dessus

public struct Complex 
{
   double re, im;
   public override bool Equals(Object obj) 
   {
      return obj is Complex && this == (Complex)obj;
   }
   public override int GetHashCode() 
   {
      return re.GetHashCode() ^ im.GetHashCode();
   }
   public static bool operator ==(Complex x, Complex y) 
   {
      return x.re == y.re && x.im == y.im;
   }
   public static bool operator !=(Complex x, Complex y) 
   {
      return !(x == y);
   }
}

A défaut majeur. Je suis en référence à

  public override int GetHashCode() 
   {
      return re.GetHashCode() ^ im.GetHashCode();
   }

XORing est symétrique, si Complexe(2,1) et Complexe(1,2) donnerait même hashCode.

Nous devrions probablement faire quelque chose de plus comme:

  public override int GetHashCode() 
   {
      return re.GetHashCode() * 17 ^ im.GetHashCode();
   }

6voto

Henk Holterman Points 153608

Oui,

== , != , Equals() et n'oubliez pas de vous assurer que GetHashCode() est cohérent aussi.

3voto

Paolo Tedesco Points 22442

La différence fondamentale entre les deux est que l' == opérateur est statique, c'est à dire sur la méthode à appeler est déterminé au moment de la compilation, tandis que l' Equals méthode est appelée dinamically sur une instance.
La définition est probablement la meilleure chose à faire, même si cela est moins important dans le cas de structures, car les structures ne peut pas être prolongé (une structure ne peut pas hériter d'une autre).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X