2009-01-04 66 views
50

如果要比較的對象,他們實現IEquatable <>界面,我有幾個問題:瞭解IEquatable

  1. 爲什麼我必須重載Equals(對象),如果我要機具的Equals <>
  2. 我可以使用==和!=一旦我實現IEquatable?

回答

50

關於#1:

MSDN:

如果實現IEquatable<T>,你也應該覆蓋的 Object::Equals(Object)GetHashCode()的 基類的實現,使他們的行爲是 一致方法的 IEquatable<T>::Equals 方法。如果您確實覆蓋了 Object::Equals(Object),您的 覆蓋的實現也會調用 調用靜態 Equals(System.Object, System.Object) 您的類的方法。這確保了 方法的所有調用都返回一致的結果。

2) 不,這些做簡單的參考比較,不使用Equals方法。

+0

所以當你處理對象時,==假設只意味着完全相同的內存地址(相同的實例) – leora 2009-01-04 19:21:33

+0

非常多。更多信息: http://msdn.microsoft.com/en-us/library/53k8ybth(VS.80).aspx – 2009-01-04 19:23:37

39

1)正如Ray所說,覆蓋Equals(object)以確保一致性,當從不知道(靜態)知道您實施IEquatable<T>的類的方法被調用時。例如,非泛型集合類將使用Equals(object)進行比較。您還應該覆蓋GetHashCode()

2)實施IEquatable<T>不超載的==和!=自動運營商,但沒有什麼可以阻止你這樣做,就像System.String一樣。但是,如果你這樣做,你應該非常清楚地記錄下來,並且當你在其他類型的引用(例如MyType和Object)之間進行比較時要小心,它們仍將使用標識比較。我懷疑這不是一個好主意,除非它將成爲代碼中非常常用的類型,每個人都會對它非常熟悉其中重載==的語法糖真的會對其產生積極影響可讀性。