2010-09-07 32 views
6

Próbuję zrozumieć, do czego służy object.GetHashCode(). Czytałem, że jest używane przez kolekcje do jednoznacznej identyfikacji kluczy. Ale chciałem to sprawdzić i wynik nie jest tym, czego się spodziewałem.Dlaczego funkcja GetHashCode() ma znaczenie?

struct Animal 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 

    public Animal(string name, int age) : this() 
    { 
     Name = name; 
     Age = age; 
    } 

    public override int GetHashCode() 
    { 
     return Age.GetHashCode(); 
    } 
} 

object doggy = new Animal("Dog", 25); 
object cat = new Animal("Cat", 25); 

Hashtable table = new Hashtable(); 
table.Add(doggy, "Dog"); 
table.Add(cat, "Cat"); 

Console.WriteLine("{0}", table[cat]); 
Console.WriteLine("{0}", table[doggy]); 

Liczyłam „Cat” by nadpisać „Dog” lub jakiś rodzaj błędu informujący mnie, że „klucz już istnieje”, ale wyjście jest

„Cat” „Dog”

+3

btw - nie jest to związane z pytaniem, ale 'struct' jest bardzo złym wyborem dla tego scenariusza. W razie wątpliwości użyj 'class'. Jeśli nie masz wątpliwości, prawdopodobnie nadal używasz 'class'. Niezwykle rzadko można (zgodnie z prawem) zadeklarować 'struct' w języku C#. –

+0

Tak, zgadzam się, faktycznie test był pierwotnie z klasą, ale próbowałem zastąpić do struct, aby zobaczyć, czy to się stało różnicy :) –

Odpowiedz

12

GetHashCode jest tylko pierwszy sprawdzić, używany do określenia non-równości i możliwie równości. Następnie sprawdzane jest Równa się. Które dla obiektów domyślnie odnosi się do równouprawnienia, a dla struktur jest to porównanie proporcjonalne. Przesłoń Equals, aby podać odpowiednią implementację (powiązaną z hash-code), i powinna dać oczekiwane wyniki (duplikat klucza).

btw, IDE jest prawdopodobnie już daje ostrzeżenie, że GetHashCode i Equals powinny być zawsze traktowane razem ...

+0

Jako dodatek, MSDN stwierdza: "klasy pochodne, które nadpisują GetHashCode muszą również przesłonić Equals, aby zagwarantować, że dwa obiekty uznane za równe mają ten sam kod skrótu, w przeciwnym razie typ tablicy Hashtable może nie działać poprawnie. " http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx –

2

Hash kody służą jako pierwszego czeku do podziału obiektów na grupy. Jeśli kolekcja zawiera kod skrótu każdego z tych elementów, może wyszukać element, najpierw szukając elementów, których kod skrótu odpowiada poszukiwanemu elementowi. Po znalezieniu jednego lub więcej takich przedmiotów można je bardziej szczegółowo zbadać. Idealnie, obiekty, które nie są równe, zawsze zwracają różne kody skrótów, ale to nie jest praktyczne. Jeśli obiekty, które nie są równe, zwracają identyczne kody hashów, może być konieczne szczegółowe zbadanie ich wszystkich za każdym razem, gdy jeden z nich jest poszukiwany.

Powiązane problemy