为什么GetHashCode()很重要?

Mad*_*sen 6 .net c#

我试图了解object.GetHashCode()它的用途.我读到集合使用它来唯一地标识密钥.但我想测试一下,结果不是我的预期.

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]);
Run Code Online (Sandbox Code Playgroud)

我原以为"猫"会覆盖"狗"或某种错误,告诉我"钥匙已存在"但输出是

"猫狗"

Mar*_*ell 12

GetHashCode只是第一次检查,用于确定不平等和可能的平等.之后,检查Equals.对于哪些对象默认为引用相等,而对于结构是成员比较.覆盖Equals以提供适当的实现(与哈希代码配对),它应该给出您期望的结果(重复键).

顺便说一句,在IDE可能已经给你一个警告,GetHashCodeEquals应始终集中处理...