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实现.

翻译自:https://stackoverflow.com/questions/508126/what-is-the-correct-implementation-for-gethashcode-for-entity-classes

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