65 votes

Implémentation correcte de GetHashCode

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 ?

55voto

Jason Points 125291

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.

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