web-dev-qa-db-fra.com

Implémentation correcte de GetHashCode

J'aimerais entendre la communauté sur la façon dont je dois procéder pour implémenter GetHashCode (ou le remplacer) pour mon objet. Je comprends que je dois le faire si je remplace la méthode des égaux. Je l'ai implémenté un bon nombre de fois, appelant parfois 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 des membres de la classe?

56
Zivka

Disons que votre classe ressemble à ceci:

class Frob {
    public string Foo { get; set; }
    public int Bar { get; set; }
    public double FooBar { get; set; }
}

Supposons que vous définissiez des égaux de sorte que deux instances de Frob soient égales si leur Foo et leur Bar sont égaux, mais FooBar n'a pas d'importance.

Ensuite, vous devez définir GetHashCode en termes de Foo et Bar. Une façon est comme ça:

return this.Foo.GetHashCode() * 17 + this.Bar.GetHashCode();

Fondamentalement, vous souhaitez simplement intégrer tous les champs qui entrent dans la définition de l'égalité. Une façon est de continuer à accumuler et à multiplier par 17 comme je l'ai fait. C'est rapide, c'est simple, c'est correct, et ça donne généralement une bonne distribution.

46
jason