我是否必须实施GetHashCode()才能遵循最佳做法?

时间:2016-08-09 20:25:29

标签: c# oop hash

在我班上,我有以下覆盖。

public override bool Equals(object input)
{
  Occasion comparee = input as Occasion;
  return comparee != null && comparee.Id == Id;
}

它在GUI中用于确定预先选择的combox值,并且完美运行。但是,R#nags并建议,如果我覆盖了 Equals(object),那么我也应该覆盖 GetHashCode()。当我添加以下代码时,它会唠叨代码正在调用基本方法。

public override int GetHashCode()
{
  return base.GetHashCode();
}

我必须返回一些东西,所以基本上它要我实现一个返回任意整数的虚方法(它在代码中的任何地方都没有被使用,因为我可以告诉它,因为我得到了相同的行为,无论我是否对它进行了评论是不是。

由于最佳做法是省略不需要的代码,我对适当的设计会感到困惑。

1 个答案:

答案 0 :(得分:4)

MSDN page for GetHashCode表示

  

如果覆盖GetHashCode方法,则还应该重写Equals,反之亦然。如果在测试两个对象的相等性时,重写的Equals方法返回true,则重写的GetHashCode方法必须为两个对象返回相同的值。

如果要覆盖equals以便在对象id相等时返回true,则必须定义GetHashCode方法,以便在给定相同的id时返回相同的哈希码。

哈希码用于集合中的插入和查找 - 因此它不太可能被您编写的任何代码直接使用,但它将被其他.NET代码使用。但是,如果您没有正确实现它,您可能会在处理对象集合时发现性能问题或更糟。例如,如果您弄错了或者没有实现它,那么您可能无法确定您的类的实例是否在集合中,或者您将无法检索您放入的实例

在您的情况下,方法很简单:

{
"type":"record",
"name":"myrecordname"
"fields": [
   {"name": "number", "type": "string"},
   {"name": "totalProductFee", "type": "string"},
   .......
   {"name": "Event_DA", "type": {"type":"record, "name":"Event_DA",
       "fields": [{"name":"recType", "type":"string"},
                  {"name":"AccountID", "type":"string"},
                  .......
                 ]
        }
   }
]}

因为您只是比较public override int GetHashCode() { return Id.GetHashCode(); } 方法中的ID。