2012-01-25 11 views
45

Chciałbym usłyszeć od społeczności o tym, jak powinienem wdrożyć GetHashCode (lub przesłonić go) dla mojego obiektu. Rozumiem, że muszę to zrobić, jeśli zastąpię metodę równości. Zaimplementowałem go dość często, czasami po prostu wywołując metodę bazową. Rozumiem, że mój obiekt powinien być równy innej instancji obiektu, jeśli zawiera te same szczegóły (członkowie). Jaki jest najlepszy sposób na uzyskanie kodu skrótu od członków klasy?Implementowanie kodu GetHash poprawnie

+2

Zastanów zamknięcie jako duplikat http://stackoverflow.com/a/720282/93922 –

+2

Zanim to zrobisz, polecam przeczytanie i zrozumienie mojego artykułu na ten temat: http://blogs.msdn.com/b /ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx –

+0

Dzięki, rozumiem, że może to być typowe pytanie i powinienem był trochę więcej polować. Dzięki za pomoc – Zivka

Odpowiedz

34

Powiedzmy klasa wygląda następująco:

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

Powiedzmy zdefiniować równa się więc, że dwa przypadki Frob są równe, jeśli ich Foo i ich Bar są równe, ale FooBar nie ma znaczenia.

Następnie należy zdefiniować GetHashCode pod względem Foo i Bar. Jeden sposób jest taki:

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

Zasadniczo, chcesz tylko uwzględnić wszystkie pola, które określają równość. Jednym ze sposobów jest po prostu nagromadzenie i pomnożenie przez 17, tak jak zrobiłem. Jest szybki, prosty, poprawny i zwykle zapewnia dobrą dystrybucję.

+5

Mam wrażenie, że powinno to być samo pytanie, ale dlaczego 23? –

+1

Czynnik podstawowy, aby odróżnić {2,1} i {1,2}. –

+6

może wskazywać, że GetHashCode mówi tylko, czy dwa obiekty ** mogą ** zostać uznane za równe. Nadal istnieje możliwość kolizji hash. – geofftnz

Powiązane problemy