当对象的标识符为空时,GetHashCode应该返回什么?
考虑到identity属性可以为null,以下哪项是正确/更好的。
public override int GetHashCode()
{
if (ID == null) {
return base.GetHashCode();
}
return ID.GetHashCode();
}
要么
public override int GetHashCode()
{
if (ID != null) {
return ID.GetHashCode();
}
return 0;
}
更新1:更新了第二个选项。
更新2:以下是Equals实现:
public bool Equals(IContract other)
{
if (other == null)
return false;
if (this.ID.Equals(other.ID)) {
return true;
}
return false;
}
public override bool Equals(object obj)
{
if (obj == null)
return base.Equals(obj);
if (!obj is IContract) {
throw new InvalidCastException("The 'obj' argument is not an IContract object.");
} else {
return Equals((IContract)obj);
}
}
ID为string
类型。
没有找到相关结果
已邀请:
3 个回复
讼乐
编辑:基于你的Equals方法,看起来你可以制作你的GetHashCode方法:
请注意,您的
方法也可能如下所示:
如果
为null,您当前的实现将实际抛出异常... 另外,你的
方法是不正确的 - 如果你传递了一个不合适的对象类型,你不应该抛出异常,如果
为null,你应该返回
...同上。所以你实际上可以使用:
但是,我关注基于接口的相等性。通常,即使实现相同的接口,也不应认为两类不同类型是相等的。
玩翁文醚碱
,你需要为相同的值返回相同的HashCode,并且0经常不会被ID.GetHashCode()返回,所以这样的Hash函数可以满足任何需求。由于你没有组合任何值(比如ID和Name Hashes),它非常清晰的ID是HashCode的定义源,因此Null ID的固定0听起来合理。 否则,您对GetHashCode的整个方法覆盖只考虑ID字段是错误的(并且您需要组合几个字段来计算它们的哈希值) 在您编辑之后,我可以说第二个Equals覆盖有太多代码,只需将其替换为
你的Equals(IContract合同)覆盖对我来说是错误的,因为只有定义合同的东西是ID,如果IContract有更多的字段而不是ID,那么它将是一个糟糕的Equals覆盖。 PS:实际上如果IContract是一个接口你可能需要将你的
替换为具体的
合同,因为它的设计很糟糕,能够返回实现相同接口的不同类实例是相同的,因为定义相等需要检查对象在相等检查的第一阶段具有相同的类型(通常在99.9%的情况下)
姬第柔炒
重要的是,如果两个具有空ID的对象被认为是相等的吗?