我试图了解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]);
我原以为“猫”会覆盖“狗”或某种错误,告诉我“钥匙已存在”但输出是
“Cat”
“Dog”
解决方法
GetHashCode只是第一个检查,用于确定不相等和可能的相等.之后,检查Equals.对于哪些对象默认为引用相等,而对于结构是成员比较.覆盖等于提供适当的实现(与哈希代码配对),它应该给出您期望的结果(重复键).
顺便说一句,IDE可能已经给你一个警告,GetHashCode和Equals应该一起处理……