c# – 实体类的GetHashCode()的正确实现是什么?

以下是覆盖应用程序中所有其他实体的实体基类的覆盖Object.Equals()的示例实现.

所有实体类都具有属性Id,它是一个可空的int. (它是实体类对应的任何表的主键)

public override bool Equals(object obj)
        {
            if (obj == null || GetType() != obj.GetType())
                return false;

            if (base.Equals(obj))
                return true;

            return Id.HasValue && ((EntityBase) obj).Id.HasValue &&
                   Id.Value == ((EntityBase) obj).Id.Value;
        }

鉴于Equals()的实现,您如何正确实现GetHashCode()?

最佳答案
如果你从某些已经覆盖GetHashCode的东西推导出来,我会将其实现为:

public override int GetHashCode()
{
    unchecked
    {
        int hash = 37;
        hash = hash * 23 + base.GetHashCode();
        hash = hash * 23 + Id.GetHashCode();
        return hash;
    }
}

Id的空值将为Id.GetHashCode()返回0.

如果你的类只是从Object派生,我只是返回Id.GetHashCode() – 你不想在你的哈希码中包含object.GetHashCode实现,因为它基本上是对象的身份.

请注意,如果两个实体都没有Id,则您的相等定义将不会返回true,但是将从两个对象返回相同的哈希码.您可能希望考虑更改您的Equals实现.

转载注明原文:c# – 实体类的GetHashCode()的正确实现是什么? - 代码日志