簡體   English   中英

何時重寫GetHashCode()?

[英]When to override GetHashCode()?

我們什么時候應該覆蓋' System '命名空間中' Object '類提供的GetHashCode ()方法?

當你重寫Equals ,基本上。 當你想提供一個不同的平等概念而不是簡單的引用平等。

String就是一個很好的例子 - 如果它們代表相同的字符序列,則兩個字符串相等(在簡單的Equals調用下)。 哈希碼反映了這一點,這樣如果兩個字符串相等,它們將具有相同的哈希碼。 (反過來不一定正確 - 兩個不相等的字符串可以具有相同的哈希碼,但不太可能。)

(字符串在其他方面很棘手,請注意 - 基於文化和套管有很多不同的平等概念,但String.Equals只是查看構成字符串的UTF-16代碼點,並在最簡單的情況下對它們進行比較可以想象的時尚。)

如果你的類型應該遵循值語義(比較內容)而不是引用語義(比較對象標識),你應該編寫自己的實例對象覆蓋.Equals()。

如果重寫Equals ,則必須覆蓋GetHashCode

“GetHashCode方法可以被派生類型覆蓋。值類型必須覆蓋此方法,以提供適合該類型的哈希函數,並在哈希表中提供有用的分布。為了獲得最佳結果,哈希代碼必須基於關於實例字段或屬性的值而不是靜態字段或屬性。

用作Hashtable對象中的鍵的對象還必須覆蓋GetHashCode方法,因為這些對象必須生成自己的哈希代碼。 如果用作鍵的對象不提供GetHashCode的有用實現,則可以在構造Hashtable對象時指定哈希代碼提供程序。 在.NET Framework 2.0版之前,哈希代碼提供程序基於System.Collections .. ::。IHashCodeProvider接口。 從2.0版開始,哈希碼提供程序基於System.Collections .. ::。IEqualityComparer接口。“

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM