首页 文章

如何在一般BaseClass中覆盖GetHashCode

提问于
浏览
2

互联网上有很多关于如何在重写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 回答

  • 2

    由于您只使用 ID 属性来测试相等性,因此几乎可以肯定您应该使用它来导出您的哈希码 .

    如果 IDInt32 ,那么从 GetHashCode 方法返回 this.ID 应该没问题 . 如果 ID 是其他类型,那么您可以返回 this.ID.GetHashCode() .

  • 0

    我认为一般的想法是 - 如果你重新定义了等号,那么必须保持以下不变量

    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就不应该改变 .

  • 0

    Equals(...)GetHashCode(...) 应始终等效实施 .

    如果您通过 ID 确定对象是相同的(虽然这是有争议的),那么您还应该返回 ID 的HashCode .

  • 2

    由于您使用ID来确定对象是否相等,因此 GetHashCode 实现也应使用ID:

    public override int GetHashCode()
    {
      return this.ID.GetHashCode();
    }
    
  • 0

    在编写 EqualsGetHashCode 方法时要记住的最重要的事情是,你不应该没有另一个并且他们同意彼此 . 所以在这种情况下,返回 ID 作为哈希码(或 ID 的哈希码,它是相同的)是完全可以的 .

相关问题