当覆盖 GetHashCode() 时,您还应该考虑基类的 HashCode 吗?

发布时间:2021-03-07 05:32
class A
{
    public int Age{get;set;}
    public override GetHashCode()
    {
        return Age.GetHashCode();
    }
}

class B : A
{
    public int Name{get;set;}
    public override GetHashCode()
    {
        return HashCode.Combine(base.GetHashCode(), Name);
    }
}

类型 B 中的 GetHashCode 方法如何正确覆盖 GetHashCode,还是只计算类型 B 中字段的哈希码?

回答1

GetHashCode() 的目的是让不同的算法能够快速确定您的类的两个对象是否绝对不相等,然后他们必须咨询可能效率低下的 Equals 方法,并允许数据结构像 HashSet 或 Dictionary 将对象分类到桶中。

GetHashCode 的唯一要求是比较相等的两个对象(通过 Equals 方法)必须产生相同的哈希码(另一方面,它是如果产生相同哈希码的两个对象不相等,则OK)。

最好构造哈希码,以便

  • 很少发生碰撞
  • 但实现仍然是高性能的。

最好的方法是什么,取决于您的课程的性质和用途,只有您可以决定。

顺便说一句:(通常)在哈希中包含可变属性是一个坏主意,因为这使得无法使用您的类,例如作为字典中的键。