Pour une classe, les valeurs par défaut sont essentiellement l'égalité des références, et cela convient généralement. Si vous écrivez une structure, il est plus courant de remplacer l'égalité (notamment pour éviter la mise en boîte), mais il est très rare que vous écriviez une structure de toute façon !
Lorsque vous outrepassez l'égalité, vous devez toujours avoir un équivalent Equals()
et GetHashCode()
(c'est-à-dire que pour deux valeurs, si Equals()
retourne vrai s'ils debe retournent le même code de hachage, mais l'inverse est no nécessaire) - et il est courant de fournir également des ==
/ !=
opérateurs, et souvent pour mettre en œuvre IEquatable<T>
aussi.
Pour générer le code de hachage, il est courant d'utiliser une somme factorisée, car cela évite les collisions sur les valeurs appariées - par exemple, pour un hachage de base à 2 champs :
unchecked // disable overflow, for the unlikely possibility that you
{ // are compiling with overflow-checking enabled
int hash = 27;
hash = (13 * hash) + field1.GetHashCode();
hash = (13 * hash) + field2.GetHashCode();
return hash;
}
Cela présente l'avantage de :
- le hash de {1,2} n'est pas le même que le hash de {2,1}
- Le hachage de {1,1} n'est pas le même que celui de {2,2}.
etc - ce qui peut être courant si l'on utilise simplement une somme non pondérée, ou xor ( ^
), etc.
0 votes
Jetez un coup d'œil au commentaire que j'ai laissé sur l'article : stackoverflow.com/questions/763731/gethashcode-extension-method
0 votes
Voir aussi stackoverflow.com/questions/1139767/object-gethashcode
44 votes
D'ailleurs, vous pouvez obtenir le hashcode par défaut (même lorsque
GetHashCode()
a été remplacée) en utilisantSystem.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj)
0 votes
@MarcGravell merci pour cette contribution, je cherchais exactement cette réponse.
0 votes
@MarcGravell Mais comment faire avec une autre méthode ?