开发者

Why GetHashCode() matters?

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 = n开发者_如何学Cew 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"


GetHashCode is 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. Override Equals to 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 GetHashCode and Equals should always be treated together...


Hash codes are used as a first check to divide objects into groups. If a collection holds the hash code of each item therein, it can search for an item by first searching for items whose hash code matches that of the item sought. Once it finds one or more such items, it can examine them in more detail. Ideally, objects which are not equal would always return different hash codes, but that's not practical. If objects which are not equal return identical hash codes, it may be necessary to examine all of them in detail any time one of them is sought.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜