I am trying to understand what the object.GetHashCode() is used for. I read that it is used by collections to uniquely identify keys. But I wanted to test this and the result isn’t what I expected.
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]);
I would have expected “Cat” would overwrite “Dog” or some kind of error telling me that the “key already exists” but the output is
“Cat”
“Dog”
GetHashCodeis only the first check, used to determine non-equality and possible equality. After that, Equals is checked. Which for objects defaults to reference-equality, and for structs is a memberwise compare. OverrideEqualsto give an appropriate implementation (paired with the hash-code), and it should give the results you expect (duplicate key).btw, the IDE is probably already giving you a warning that
GetHashCodeandEqualsshould always be treated together…