为什么我们在对象模型项目中需要GetHashCode()函数?

时间:2012-06-21 16:07:59

标签: c# .net class override gethashcode

  

可能重复:
  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()

2 个答案:

答案 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.HashTableSystem.Collections.Generic.Dictionary<TKey, TValue>的实例正常工作。

假设没有必要覆盖自定义类中的GetHashCode,基于哈希的集合必须使用基类“Object.GetHashCode,这可能无法为您的所有实例提供正确的结果自定义类。

  

如果您观察到已发布的代码,则会对Equals方法进行比较   IDNameSSN为2个实例返回相等的结果   并且相同的属性用于散列算法   ({^ 1}}方法中的(ID ^ Name ^ SSN)。