Oui, c'est important si votre élément peut être utilisé comme une clé dans un dictionnaire, ou HashSet<T>
, etc - depuis ce est utilisé (en l'absense d'une coutume IEqualityComparer<T>
) pour regrouper les éléments dans des seaux. Si le hash-code pour les deux éléments ne correspondent pas, ils peuvent jamais être considérées comme égales (Equals
sera tout simplement jamais être appelé).
L' GetHashCode()
méthode doit refléter l' Equals
logique; les règles sont les suivantes:
- si deux choses sont égales (
Equals(...) == true
) alors qu'ils doivent retourner la même valeur pour l' GetHashCode()
- si l'
GetHashCode()
est égal, il n'est pas nécessaire pour eux d'être le même; c'est une collision, et Equals
sera appelé pour voir si c'est une égalité réelle ou pas.
Dans ce cas, il ressemble à "return FooId;
" est adapté GetHashCode()
mise en œuvre. Si vous testez plusieurs propriétés, il est courant de les combiner à l'aide d'un code comme ci-dessous, afin de réduire la diagonale des collisions (c'est à dire afin qu' new Foo(3,5)
a un autre hash-code new Foo(5,3)
):
int hash = 13;
hash = (hash * 7) + field1.GetHashCode();
hash = (hash * 7) + field2.GetHashCode();
...
return hash;
Oh - pour plus de commodité, vous pouvez également envisager de fournir ==
et !=
opérateurs lors du remplacement d' Equals
et GethashCode
.
Une démonstration de ce qui se passe quand vous obtenez cette erreur est ici.