2015-06-07 32 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,因爲這用於將項目分組爲桶。否則,你可以避免這樣做。

相關問題