2010-11-04 64 views

回答

10

不,他們已經這樣做了。

是否必須重寫它們,取決於它將如何使用。在大多數情況下,這不是必需的。

3

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

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

但請記住,如果您選擇重寫其中一個,則還需要重寫另一個,以確保散列表和字典鍵等功能與派生類一起正常工作。 GetHashCode方法需要反映與Equals方法相同的邏輯。在這裏看到更多的解釋和例子:

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

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

+0

另請參閱:http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method-is-overriden-in-c – 2010-11-04 12:34:18

0

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

如果您使用某種方式,您應該明確地實施它們正確

0

當你覆蓋Equals,基本上。 當你想提供一個不同的 平等的想法比簡單的參考 平等。

字符串是一個很好的例子 - 2個 字符串相等(下一個簡單 的Equals呼叫),如果他們表示字符的 相同的序列。代碼散列 反映了這種情況,因此如果兩個字符串相等,它們將具有相同的散列碼 。 (反過來不是 必然是真的 - 兩個不相等的字符串 可以具有相同的哈希碼,但它不太可能是 。)

(字符串是在其他方面非常棘手, 提醒你 - 有許多基於文化和 外殼平等的不同 想法,但String.Equals只是看起來 在UTF-16代碼點,這使得 了串,並在 最簡單可設想的方式比較它們)

by Jon Skeet

相關問題