在執行==
操作員時,我感覺我缺少一些要點。
因此,我正在尋找一些最佳做法。
下面是我想到的一些相關問題:在C#中爲一個類實現==操作符的最佳實踐是什麼?
- 如何幹淨地處理所述基準比較?
- 是否應該通過
IEquatable<T>
類接口來實現?或者覆蓋object.Equals
? - 那麼運營商
!=
呢?
(該列表可能並非詳盡無遺)。
在執行==
操作員時,我感覺我缺少一些要點。
因此,我正在尋找一些最佳做法。
下面是我想到的一些相關問題:在C#中爲一個類實現==操作符的最佳實踐是什麼?
IEquatable<T>
類接口來實現?或者覆蓋object.Equals
?!=
呢?(該列表可能並非詳盡無遺)。
我會關注微軟的Guidelines for Overloading Equals() and Operator ==。
編輯:微軟的指引包含這一重要言論,這似乎也印證了亨克的回答是:在 非穩定的類型不 建議
重寫==操作符。
其實,你還要實現!=,否則C#不會讓你編譯。 – 2009-10-06 11:21:15
好點。忘記了。 – dkackman 2009-10-06 11:45:53
每次執行==
經營者,一定要還實現!=
,IEquatable<T>
和覆蓋Object.Equals()
和Object.GetHashCode()
爲了您班級的用戶的一致性。
考慮一類,這是我通常的實現:
public bool Equals(MyClass other) {
if (ReferenceEquals(other, null))
return false;
if (ReferenceEquals(other, this))
return true;
return // your equality code here
}
public override bool Equals(object obj) {
return Equals(obj as MyClass);
}
public override int GetHashCode() {
return // your hash function here
}
public static bool operator ==(MyClass left, MyClass right) {
return Equals(left, right);
}
public static bool operator !=(MyClass left, MyClass right) {
return !(left == right);
}
這個。而且,如果您最初實現<(小於)運算符,則可以單獨使用該運算符來實現每個其他運算符。即:如果已經實現<運算符,==可以表示爲!(左<右||右<左)。 – 2009-10-06 12:33:57
最常見的方法是不來處理它。默認值是參考比較,通常適用於類對象。
所以首先你要非常確定你需要價值型行爲。
讓我們明確回答問題,而不是告訴某人改變他們做事的建議。 – 2009-10-06 11:22:38
檢查這些線程:http://stackoverflow.com/questions/962960/equals-method-implementation-helpers-c,http://stackoverflow.com/questions/1421289/icomparable-and-equals,http:/ /stackoverflow.com/questions/660566/override-equals-and-gethashcode-question,http://stackoverflow.com/questions/567642/how-to-best-implement-equals-for-custom-types – Groo 2009-10-06 11:16:27