簡體   English   中英

所有c#類應該實現Equals和GetHashCode嗎?

[英]should all c# classes implement Equals and GetHashCode?

是否所有c#類都重寫Equals和GetHashCode? 為了正確

不,他們已經做到了。

是否必須覆蓋它們,取決於它將如何使用。 在大多數情況下,不需要它。

所有類都已從基類System.Object繼承這些方法。

如果需要能夠比較對象的兩個實例而不是簡單的引用相等性,則可以選擇覆蓋派生類中的方法,否則就沒有必要。

但請記住,如果您選擇覆蓋其中一個,則還需要覆蓋另一個,以確保Hashtables和字典鍵(以及其他功能)與您的派生類一起正常工作。 GetHashCode方法需要反映與Equals方法相同的邏輯。 有關更多說明和示例,請參見此處:

http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

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

System.Object繼承此類的所有類。

如果需要為類提供特定的Equals或GetHashCode,則應覆蓋類中的方法。 否則就離開他們..

http://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=VS.71).aspx

也許不是全部,但所有類都將被放入某種包(IList,ICollection,IDictionary,Hashset等)並需要一些簡單的方法來區分它們(只需考慮Sort()Contains()BinarySearch()等)。

如果你以這種方式使用一個類,你肯定應該正確地實現它們。

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

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

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

作者:Jon Skeet

暫無
暫無

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

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