Funkcja ta nie jest tak oczywista jak się to zdaje i napisanie poprawnej jej wersji sprawia wiele problemów. Tworząc własny typ powinniśmy unikać jej implementacji, jednak jeżeli nasz typ zamierzamy użyć jako klucz słownika, jesteśmy zmuszeni do jej zdefiniowania. Kolekcje klucz - wartość wykorzystują rezultat funkcji GetHashCode w celu efektywnego wyszukiwania elementów w kolekcji.
Implementacja metody GetHashCode musi spełniać 3 warunki:
- jeżeli dwa obiekty są równe (operator==) - muszą generować ten sam hash
- niezależnie od zmienianych wartości w obiekcie, funkcja ta musi zwracać zawsze ten sam rezultat
- funkcja powinna generować losową wartość Integer dla danych wejściowych z całego zakresu tego typu danych.
W przypadku struktur funkcja ta zwraca hash dla pierwszego zadeklarowanego pola w niej. Przykładowo:
Code:
dla tej struktury hash zostanie wygenerowany na podstawie pola Name.
Implementacja w przypadku klasy:
Code:
Oraz użycie:
Code:
Warto zauważyć tutaj dwie rzeczy:
- Właściwość Name jest tylko do odczytu - co zapewni nam że nie zostanie przez to zmieniony hash
- Mamy dodatkową metodę SetName, która zwraca nowy obiekt typu Person. W użyciu widać że w przypadku gdy zmienimy Name, należy stary obiekt wyrzucić ze słownika i zastąpić nowym. Rozwiązanie to umożliwia uniknięcie trudnych do wykrycia błędów związanych z tworzeniem hash-a.
Brak komentarzy:
Prześlij komentarz