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?
Réponses
Trop de publicités?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);
}
}
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 à
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();
}
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).