2

可能重复:
为什么在 C# 中重写 Equals 方法时重写 GetHashCode 很重要?

我正在研究我的以下课程,但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()

4

2 回答 2

0

您需要同时处理这两个问题,因为 GetHashCode() 被许多集合实现(如 Dictionary)与 Equals 方法一起使用。重要的是,如果您重写 Equals 的实现,那么您必须重写 GetHashCode,使得根据您的新实现相等的任何两个对象也必须返回相同的哈希码。

如果他们不这样做,那么他们将无法在 Dictionary 中正常工作。一般没有那么难。我经常这样做的一种方法是获取我用于相等的对象的属性,并将它们连接到一个 String 对象中,然后返回 String.GetHashCode。

String 有一个很好的 GetHashCode 实现,它为各种值返回范围广泛的整数,从而在稀疏集合中产生良好的传播。

于 2012-06-21T16:12:08.327 回答
0

GetHashCode当您的自定义类覆盖时,有必要提供覆盖Equals。如果省略GetHashCode,您将收到编译器警告,提示“公共类型覆盖 System.Object.Equals 但不覆盖 System.Object.GetHashCode”。

GetHashCode 基于适合散列算法和数据结构(如散列表)的当前实例返回一个值。相同类型且相等的两个对象必须返回相同的哈希码,以确保实例System.Collections.HashTable正确System.Collections.Generic.Dictionary<TKey, TValue>工作。

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

如果您观察您发布的代码,您的Equals方法会比较 IDName并且SSN对于 2 个实例返回相等结果并且相同的属性被用于您的GetHashCode方法中的散列算法 (ID^Name^SSN)。

于 2012-06-21T16:13:43.723 回答