可能重复:
Why is it important to override GetHashCode when Equals method is overriden in C#?
我正在查看Object Model
中的以下课程,并且无法理解在GetHashCode()
中添加Class
的重要性。
public class SampleClass
{
public int ID { get; set; }
public String Name { get; set; }
public String SSN_Number { get; set; }
public override bool Equals(Object obj)
{
if (obj == null || GetType() != obj.GetType())
return false;
SampleClass cls = (SampleClass)obj;
return (ID == cls.ID) &&
(Name == cls.Name) &&
(SSN_Number == cls.SSN_Number);
}
public override int GetHashCode()
{
return ID.GetHashCode() ^ Name.GetHashCode() ^ SSN_Number.GetHashCode();
}
}
假设我有一个Sample Class
对象列表,我想获得一个特定的索引。然后Equals()
可以帮助我获得该记录。我为什么要使用GetHashCode()
?
答案 0 :(得分:0)
您需要同时处理两者,因为GetHashCode()被许多集合实现(如Dictionary)与Equals方法一起使用。重要的是,如果覆盖Equals的实现,那么必须覆盖GetHashCode,使得根据新实现的任何两个Equal对象也必须返回相同的Hash代码。
如果他们不这样做,那么他们将无法正常使用Dictionary。这通常不是那么难。我经常这样做的一种方法是通过获取我用于相等的对象的属性,并在String对象中将它们连接在一起,然后返回String.GetHashCode。
String有一个很好的GetHashCode实现,可以为各种值返回大范围的整数,从而在稀疏集合中实现良好的扩展。
答案 1 :(得分:0)
当您的自定义类覆盖GetHashCode
时,有必要覆盖Equals
。如果省略GetHashCode
,则会收到编译器警告,说“公共类型会覆盖System.Object.Equals但不会覆盖System.Object.GetHashCode”。
GetHashCode返回一个基于当前实例的值,该实例适用于散列算法和数据结构(如哈希表)。两个相同类型且相同的对象必须返回相同的哈希代码,以确保System.Collections.HashTable
和System.Collections.Generic.Dictionary<TKey, TValue>
的实例正常工作。
假设没有必要覆盖自定义类中的GetHashCode
,基于哈希的集合必须使用基类“Object.GetHashCode
,这可能无法为您的所有实例提供正确的结果自定义类。
如果您观察到已发布的代码,则会对
Equals
方法进行比较ID
,Name
和SSN
为2个实例返回相等的结果 并且相同的属性用于散列算法 ({^ 1}}方法中的(ID ^ Name ^ SSN)。