我想了解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]);
我原以为“猫”会覆盖“狗”或某种错误,告诉我“钥匙已经存在”但输出是
“猫” “犬”
答案 0 :(得分:12)
GetHashCode
只是第一次检查,用于确定不相等和可能的相等。之后,检查Equals。对于哪些对象默认为引用相等,而对于结构是成员比较。覆盖Equals
以提供适当的实现(与哈希代码配对),它应该给出您期望的结果(重复键)。
顺便说一下,IDE可能已经发出警告,GetHashCode
和Equals
应始终一起对待......
答案 1 :(得分:2)
哈希码用作第一次检查以将对象划分为组。如果集合在其中保存每个项目的哈希码,则它可以通过首先搜索其哈希码与所寻找的项目的哈希码匹配的项目来搜索项目。一旦找到一个或多个这样的项目,它就可以更详细地检查它们。理想情况下,不相等的对象总是返回不同的哈希码,但这不实用。如果不相等的对象返回相同的哈希码,则可能需要在寻找其中一个哈希码时详细检查所有这些哈希码。