それともそうすることをお勧めしますか?なんで?
9 に答える
Equals() および operator== をオーバーライドするためのガイドラインを参照してください。
見積もり:
デフォルトでは、演算子 == は、2 つの参照が同じオブジェクトを示しているかどうかを判断することにより、参照が等しいかどうかをテストします。したがって、参照型は、この機能を得るために operator == を実装する必要はありません。型が不変の場合、つまり、インスタンスに含まれるデータを変更できない場合、演算子 == をオーバーロードして、参照の等価性ではなく値の等価性を比較すると便利です。不変オブジェクトとして、それらは long と同じと見なすことができるからです。値が同じだからです。不変でない型で operator == をオーバーライドすることはお勧めできません。
基本的:
== と != のように動作させたい場合は、演算子を実装する必要がEquals(..)
あります。!Equals(..)
通常、これは不変型でのみ行います。
等号と等値演算子 (==) の実装に関するガイドラインを 参照してください。
値型 (構造体) の場合、「Equals メソッドをオーバーライドするたびに == を実装する」
参照型 (クラス) については、「ほとんどの参照型は、Equals メソッドを実装するものであっても、== をオーバーライドすべきではありません。」例外は、不変クラスと値のようなセマンティクスを持つクラスです。
GetHashCode()
すでにここにあるすべての回答に加えて、一貫性があることも忘れないでください。
equals メソッドをオーバーライドしていて、それでも等号 (または不等号) をチェックできるようにしたい場合は、おそらく == および != メソッドもオーバーライドする必要があります。
必須ではありませんが、賢明なことです。
フレームワークを作成し、別の開発者がオブジェクトを使用する場合は、== と != をオーバーライドする必要があります。そのようにして、開発者がそれを使用する場合、メモリ内で同じであるだけでなく、少なくとも2つのオブジェクトを比較するための正しいロジックを持っています.
== & != が equals メソッドを呼び出すことを確認します。
次の場合は予想外であるため、推奨されます。
if (foo == bar)
...次のように動作が異なります:
if (foo.Equals(bar))
必要ありません。そうしなければ誰もあなたを殺しません。
ただし、A.Equals(B) よりも (A == B) と書く方が自然であることが多いことに注意してください。両方のメソッドを提供すると、コードの消費者にとってより簡単になります。
in A.Equals(B) A は null にできません A == B は null にできます
== をオーバーライドして Equals を呼び出すようにすることは、参照型の一般的に悪い考えだと思います。== をオーバーライドして Equals を呼び出す場合、コードのユーザーが 2 つのオブジェクト参照がまったく同じオブジェクトを参照しているかどうか (プロパティが等しいオブジェクトに対して) をテストする方法はないと思います。
値の等価性についてクラスのインスタンスをテストしたい場合は、Equals を呼び出して、参照の等価性を具体的にテストするために == を保存する必要があります。