2013-08-21 88 views
1

我知道重寫GetHashCode時我們重寫Equals方法的重要性。我假設Equals內部電話GetHashCode哪些方法在內部調用GetHashCode?

可能在內部使用GetHashCode的其他方法是什麼?

+0

的'的Equals實現()'通常不叫'GetHashCode的() ',但任何散列容器都會將其稱爲它的集合元素。 –

+0

Eric Lippert寫了一個很好的博客:http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx –

+0

我的道歉,當我打電話Overriden'Equals'方法。 'GetHashCode'在內部調用時沒有在Overriden'Equals'方法中明確提及。 因此想知道什麼情況下觸發'GetHashCode'的呼叫 – CarbineCoder

回答

3

Equals不在內部呼叫GetHashCode
GetHashCodeGetHashCode被許多類用作提高性能的手段:如果兩個實例的哈希碼不同,那麼實例並不等於,因此定義爲,因此可以跳過對Equals的調用。
只有當散列碼相同時,它需要調用Equals,因爲多個實例可以具有相同的散列碼,即使它們不同。

的是像這樣工作類具體的例子:

4

我認爲國內的Equals調用GetHashCode的。

實際上這會很不尋常。 GetHashCode主要用於字典和其他基於哈希集的實現;所以:Hashtable,Dictionary<,>,HashSet<>,和一系列其他的東西。基本上,GetHashCode有兩個目的:

  • 得到一個號碼,其鬆散表示的值,其可以用於,例如,用於通過經由模數的範圍內桶,或任何其他分發密鑰的集合數字分類
  • 證明的非平等(但從未證明平等)

參見:Why is it important to override GetHashCode when Equals method is overridden?

+1

作爲Marc例子的補充,值得注意的是Linq頻繁使用GetHashCode。 – Brian

相關問題