我超越了Equals方法和相等运算符,Resharper发出警告说我也应该覆盖GetHashCode。所以我做了。我刚刚这样做了:
public override int GetHashCode()
{
return base.GetHashCode();
}
但是现在它给了我另一个警告,说GetHashCode调用base.GetHashCode。 那么,我变坏了吗?为什么Resharper会发出此警告?我应该创建自己的GetHashCode实现吗?事实上,我在想为什么我甚至不愿意改写它。
答案 0 :(得分:1)
两个相等的对象应具有相同的哈希码。否则,哈希码无意义且毫无价值。这就是Resharper警告你的原因。 (相反的关系不正确,因为不同的对象可能有不同的哈希码。)
基本实现返回一个基于对象句柄的值,并且很可能返回一个不同的值(由Equals
定义)对象。如果您不使用它,这不是问题,但Dictionary
和HashSet
会这样做。如果您没有正确实施GetHashCode
,它们将会严重破坏。
答案 1 :(得分:0)
如果该项目将用作GetHashCode
,Dictionary
等中的键,则必须覆盖HashSet
,因为这用于将项目分组到存储桶中。否则,你可以避免这样做。