オペレーターを実装し==
ていると、いくつかの重要なポイントが欠けているような気がします。
したがって、私はその周りのいくつかのベストプラクティスを探しています。
これが私が考えているいくつかの関連する質問です:
- 参照比較をきれいに処理する方法は?
IEquatable<T>
のようなインターフェイスを介して実装する必要がありますか?またはオーバーライドしますobject.Equals
か?- そして、
!=
オペレーターはどうですか?
(このリストは網羅的ではないかもしれません)。
オペレーターを実装し==
ていると、いくつかの重要なポイントが欠けているような気がします。
したがって、私はその周りのいくつかのベストプラクティスを探しています。
これが私が考えているいくつかの関連する質問です:
IEquatable<T>
のようなインターフェイスを介して実装する必要がありますか?またはオーバーライドします object.Equals
か?!=
オペレーターはどうですか?(このリストは網羅的ではないかもしれません)。
Equals()とOperator==をオーバーロードするためのMicrosoftのガイドラインに従います。
編集:マイクロソフトのガイドラインには、ヘンクの答えを裏付けるように思われるこの重要なコメントが含まれています。
デフォルトでは、演算子==は、2つの参照が同じオブジェクトを示しているかどうかを判断することによって参照の同等性をテストするため、この機能を取得するために参照型で演算子==を実装する必要はありません。型が不変である場合、つまりインスタンスに含まれるデータを変更できない場合、演算子==をオーバーロードして、参照の同等性の代わりに値の同等性を比較すると便利です。不変のオブジェクトとして、それらが同じ値。不変でない型で演算子==をオーバーライドすることはお勧めしません
==
演算子を実装するたびに、クラスのユーザーの一貫性を保つために、を実装し!=
、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);
}
最も一般的なアプローチは、それを処理しないことです。デフォルトは参照比較であり、これは一般にクラスオブジェクトに適しています。
したがって、最初に、値型の動作が必要であることを確認する必要があります。