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
Odpowiedz
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ę.
Mam wrażenie, że powinno to być samo pytanie, ale dlaczego 23? –
Czynnik podstawowy, aby odróżnić {2,1} i {1,2}. –
może wskazywać, że GetHashCode mówi tylko, czy dwa obiekty ** mogą ** zostać uznane za równe. Nadal istnieje możliwość kolizji hash. – geofftnz
- 1. Implementowanie podobnych przypadków użycia wygląda następująco: powielanie kodu
- 2. Implementowanie interfejsu View.IOnTouchListener
- 3. Cython - implementowanie wywołań zwrotnych
- 4. Implementowanie interfejsu z metodami ogólnymi
- 5. Implementowanie pierwszego pasującego algorytmu:
- 6. Implementowanie niekompatybilnych interfejsów
- 7. Implementowanie niebezpiecznych interfejsów Java
- 8. Implementowanie History.js HTML4 Fallback
- 9. Implementowanie protokołu AirDrop
- 10. Implementowanie Java Comparator
- 11. Implementowanie wewnętrznego niestatycznego interfejsu
- 12. Implementowanie alternatywnych formularzy LDA
- 13. Implementowanie wzorca polecenia
- 14. Implementowanie zakresów w Pundit
- 15. Implementowanie StringLiteralConvertible na NSURL
- 16. Implementowanie właściwości interfejsu w interfejsach?
- 17. Implementowanie programu ładującego klasy filtrowania
- 18. Android - Implementowanie obsługi pakietów ikon
- 19. Implementowanie akcesoriumButtonTappedForRowWithIndexPath: w Swift 2
- 20. Implementowanie motywu WrapBootstrap w aplikacji Rails
- 21. Implementowanie wartości klucza w XSLT
- 22. Implementowanie ClickHandler w niestandardowym Widget
- 23. Implementowanie logowania bezpiecznego dla wątków
- 24. Obserwowalne implementowanie wzorców w Javie
- 25. implementowanie foreach (doseq) w clojure
- 26. Implementowanie kolejki opartej na plikach
- 27. Implementowanie stosu przy użyciu BST
- 28. Implementowanie przewijania kołowego w PagerAdapterie
- 29. Implementowanie funkcjonalności stron głównych. PHP
- 30. Przetwarzanie obrazu - Implementowanie filtra Sobel
Zastanów zamknięcie jako duplikat http://stackoverflow.com/a/720282/93922 –
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 –
Dzięki, rozumiem, że może to być typowe pytanie i powinienem był trochę więcej polować. Dzięki za pomoc – Zivka