例如,对象 A 返回的散列值为1。因此,它进入散列表的第一个容器。然后更改对象 A,使其返回的散列值为2。当一个散列表去寻找它时,它在 bin 2中查找,但是找不到它——该对象在 bin 1中是孤立的。这就是为什么散列代码不能改变 对象的生存期,这也是为什么编写 GetHashCode 实现非常麻烦的一个原因。
public class SomeThing
{
public string Name {get; set;}
public override GetHashCode()
{
return Name.GetHashcode();
}
public override Equals(object other)
{
SomeThing = other as Something;
if( other == null ) return false;
return this.Name == other.Name;
}
}
这个实现已经违反了可以在 MSDN 中找到的规则。
假设您有这个类的两个实例; instance1的 Name 属性设置为“ Pol”,instance2的 Name 属性设置为“ Piet”。
两个实例返回不同的散列码,而且它们也不相等。
现在,假设我将 instance2的 Name 改为‘ Pol’,然后,根据 Equals 方法,两个实例应该是相等的,并且根据 MSDN 的一个规则,它们应该返回相同的 hashcode。
但是,这是不可能的,因为 instance2的 hashcode 将会更改,并且 MSDN 声明这是不允许的。