互联网上有很多关于如何在重写Equals时覆盖GetHashCode()的信息 . 但是,所有这些示例都是关于包含一些可以生成哈希的字段的类 . 我想要找到的是我用于所有业务逻辑层对象的基类的良好GetHashCode实现 . 这个名为BusinessLogica的类包含ToString()实现,我的框架的一些基本功能以及以下Equals覆盖:
public override bool Equals(object obj)
{
bool retValue;
if (obj is BusinessLogica && this.GetType() == obj.GetType())
{
retValue = this.ID == ((BusinessLogica)obj).ID;
}
else
{
retValue = false;
}
return retValue;
}
现在,我到目前为止所做的是当我需要一个扩展此BusinessLogica的对象并将其用作字典中的键时,我在此特定类中重写GetHashCode并返回ID . 我也可以在BusinessLogica基类中使用此实现 . 这是'安全'吗?我还看到了ToString()的示例 . 返回了GetHashCode() .
什么是明智的使用?或者这个级别的GetHashCode是不可用的,我应该在每个BusinessLogica类中覆盖它吗?
5 回答
由于您只使用
ID
属性来测试相等性,因此几乎可以肯定您应该使用它来导出您的哈希码 .如果
ID
是Int32
,那么从GetHashCode
方法返回this.ID
应该没问题 . 如果ID
是其他类型,那么您可以返回this.ID.GetHashCode()
.我认为一般的想法是 - 如果你重新定义了等号,那么必须保持以下不变量
2 objects that are equal must have the same hashcode. (The other way around may not be true).
另请参阅此问题以实现 - Why is it important to override GetHashCode when Equals method is overridden? . 在您的示例中,我认为您可以使用ID属性生成哈希码 .
假设:它坚持上述不变量 . 它也是不可变的,一旦创建了一个对象,ID就不应该改变 .
Equals(...)
和GetHashCode(...)
应始终等效实施 .如果您通过
ID
确定对象是相同的(虽然这是有争议的),那么您还应该返回ID
的HashCode .由于您使用ID来确定对象是否相等,因此
GetHashCode
实现也应使用ID:在编写
Equals
和GetHashCode
方法时要记住的最重要的事情是,你不应该没有另一个并且他们同意彼此 . 所以在这种情况下,返回ID
作为哈希码(或ID
的哈希码,它是相同的)是完全可以的 .