我是否必须实现GetHashCode()来遵循最佳实践?

本文关键字:最佳 是否 实现 GetHashCode | 更新日期: 2023-09-27 18:01:39

在我的类中,我有以下重写:

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

它在GUI中用于确定combox预选值,它工作得很好。然而,r#提醒并建议,如果我重写了Equals(object),那么我也应该重写GetHashCode()。当我添加以下代码时,它提示代码正在调用基方法。

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

我必须返回一些东西,所以基本上它希望我实现一个虚拟方法返回一个任意整数(它没有在代码的任何地方被使用,因为我得到相同的行为,不管我是否把它注释掉。

由于最佳实践是省略不需要的代码,我很困惑什么是合适的设计。

我是否必须实现GetHashCode()来遵循最佳实践?

GetHashCode的MSDN页面显示

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

如果你重写等号,当对象id相等时返回true,你必须定义你的GetHashCode方法,当给定相同的id时返回相同的哈希码。

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

在你的例子中,方法很简单:

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

,因为您只是比较Equals方法中的id。