代码之家  ›  专栏  ›  技术社区  ›  Leon

如何在常规基类中重写GetHashCode

c#
  •  2
  • Leon  · 技术社区  · 16 年前

    互联网上有很多关于如何在重写Equals时重写GetHashCode()的信息。但是,所有这些示例都是关于包含一些可以生成哈希的字段的类。 我试图找到的是一个很好的GetHashCode实现,它是我用于所有businesslogica层对象的基类。这个名为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。

    明智的做法是什么?或者这个级别的GetHashCode不可用,我真的应该在我的每个BusinessLogica类中重写它吗?

    5 回复  |  直到 16 年前
        1
  •  2
  •   LukeH    16 年前

    因为你只使用 ID 属性来测试是否相等,那么这几乎可以肯定,您也应该使用它来派生哈希代码。

    如果 身份证件 是一个 Int32 然后回来 this.ID 从 GetHashCode 方法应该是好的。如果 身份证件 是其他类型的然后你可以返回 this.ID.GetHashCode() 相反。

        2
  •  2
  •   Community Mohan Dere    9 年前

    我认为总的想法是-如果你重新定义了equals,那么下面的不变量必须成立

    两个相等的对象必须具有相同的哈希代码(另一方面可能不是真的)。

    另请参见此问题的实现- Why is it important to override GetHashCode when Equals method is overridden? . 不过,在您的示例中,我认为您可以使用ID属性生成hashcode。

        3
  •  0
  •   herzmeister    16 年前

    Equals(...) 和 GetHashCode(...) 应始终同等地实施。

    如果你确定你的物体是相等的 ID 身份证件

        4
  •  0
  •   Andrew Bezzub    16 年前

    因为您使用ID来确定对象是否等于 GetHashCode 实现也应该使用ID:

    public override int GetHashCode()
    {
      return this.ID.GetHashCode();
    }
    
        5
  •  0
  •   Ronald Wildenberg    16 年前

    写一篇文章时最重要的是要记住 Equals 和 GetHashCode 方法是,你不应该有一个没有另一个,他们同意对方。所以在这种情况下 ID 作为哈希码(或 身份证件