2015-06-07 33 views
-2

我忽略了Equals方法和等于运算符,并且Resharper发出警告说我应该重写GetHashCode。所以我做了。我只是这样做:为了返回base.GetHashCode,重写GetHashCode是否很糟糕?

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

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

+0

它只是增加了复杂性。 –

+3

如果你不知道你在做什么,返回0;否则当相同的对象被放入不同的桶时,你会遇到难以理解的错误。 – MrDosu

+1

@MrDosu:不是最好的建议。然后你想弄明白为什么你的表演是坦克,并猜测是什么?无论如何你都被迫了解你在做什么。建议:确保你了解你在任何时候都在做什么。不要意外编码。 – sstan

回答

1

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

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

0

如果该项目将被用作Dictionary,HashSet等中的密钥,则必须覆盖GetHashCode,因为这用于将项目分组为桶。否则,你可以避免这样做。

相关问题