J'aimerais connaître l'avis de la communauté sur la façon dont je devrais implémenter GetHashCode (ou le surcharger) pour mon objet. Je comprends que je dois le faire si je surcharge la méthode equals. Je l'ai implémentée un bon nombre de fois, parfois en appelant simplement la méthode de base. Je comprends que mon objet doit être égal à une autre instance de l'objet s'il contient les mêmes détails (membres). Quelle est la meilleure façon d'obtenir un code de hachage à partir des membres de la classe ?
Réponse
Trop de publicités?Disons que votre classe ressemble à ceci :
class Frob {
public string Foo { get; set; }
public int Bar { get; set; }
public double FooBar { get; set; }
}
Disons que vous définissez equals de sorte que deux instances de Frob
sont égaux si leurs Foo
et leurs Bar
sont égaux, mais FooBar
n'a pas d'importance.
Vous devez alors définir GetHashCode
en termes de Foo
y Bar
. Une façon de faire est la suivante :
return this.Foo.GetHashCode() * 17 + this.Bar.GetHashCode();
Fondamentalement, vous voulez simplement incorporer tous les champs qui entrent dans la définition de l'égalité. Une façon de procéder est de continuer à accumuler et à multiplier par 17 comme je l'ai fait. C'est rapide, c'est simple, c'est correct, et cela donne généralement une bonne distribution.