如果要比較的對象,他們實現IEquatable <>界面,我有幾個問題:瞭解IEquatable
- 爲什麼我必須重載Equals(對象),如果我要機具的Equals <>
- 我可以使用==和!=一旦我實現IEquatable?
如果要比較的對象,他們實現IEquatable <>界面,我有幾個問題:瞭解IEquatable
關於#1:
如果實現
IEquatable<T>
,你也應該覆蓋的Object::Equals(Object)
和GetHashCode()
的 基類的實現,使他們的行爲是 一致方法的IEquatable<T>::Equals
方法。如果您確實覆蓋了Object::Equals(Object)
,您的 覆蓋的實現也會調用 調用靜態Equals(System.Object, System.Object)
您的類的方法。這確保了 方法的所有調用都返回一致的結果。
2) 不,這些做簡單的參考比較,不使用Equals方法。
1)正如Ray所說,覆蓋Equals(object)
以確保一致性,當從不知道(靜態)知道您實施IEquatable<T>
的類的方法被調用時。例如,非泛型集合類將使用Equals(object)
進行比較。您還應該覆蓋GetHashCode()
。
2)實施IEquatable<T>
不超載的==和!=自動運營商,但沒有什麼可以阻止你這樣做,就像System.String
一樣。但是,如果你這樣做,你應該非常清楚地記錄下來,並且當你在其他類型的引用(例如MyType和Object)之間進行比較時要小心,它們仍將使用標識比較。我懷疑這不是一個好主意,除非它將成爲代碼中非常常用的類型,每個人都會對它非常熟悉和其中重載==的語法糖真的會對其產生積極影響可讀性。
所以當你處理對象時,==假設只意味着完全相同的內存地址(相同的實例) – leora 2009-01-04 19:21:33
非常多。更多信息: http://msdn.microsoft.com/en-us/library/53k8ybth(VS.80).aspx – 2009-01-04 19:23:37