下面是一个实体基类的重写 Object.Equals() 的示例实现,应用程序中的所有其他实体都派生自该实体基类。
所有实体类都有 Id 属性,它是一个可为 null 的 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()
- 你做not想要包括object.GetHashCode
在哈希代码中实现,因为这基本上最终成为对象标识。
请注意您的平等定义won't return true
如果两个实体都没有 Id,但两个对象将返回相同的哈希码。您可能希望考虑更改您的 Equals 实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)