重写GetHashCode只是为了返回base.GetHashCode?

时间:2015-06-07 23:59:21

标签: c# equals hashcode

我超越了Equals方法和相等运算符,Resharper发出警告说我也应该覆盖GetHashCode。所以我做了。我刚刚这样做了:

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

但是现在它给了我另一个警告,说GetHashCode调用base.GetHashCode。 那么,我变坏了吗?为什么Resharper会发出此警告?我应该创建自己的GetHashCode实现吗?事实上,我在想为什么我甚至不愿意改写它。

2 个答案:

答案 0 :(得分:1)

两个相等的对象应具有相同的哈希码。否则,哈希码无意义且毫无价值。这就是Resharper警告你的原因。 (相反的关系不正确,因为不同的对象可能有不同的哈希码。)

基本实现返回一个基于对象句柄的值,并且很可能返回一个不同的值(由Equals定义)对象。如果您不使用它,这不是问题,但DictionaryHashSet会这样做。如果您没有正确实施GetHashCode,它们将会严重破坏。

答案 1 :(得分:0)

如果该项目将用作GetHashCodeDictionary等中的键,则必须覆盖HashSet,因为这用于将项目分组到存储桶中。否则,你可以避免这样做。

相关问题