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

问题描述

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 中字段的哈希码?

解决方法

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

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

最好构造哈希码,以便

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...