2009-08-03 7 views

答えて

26

guidelines for overriding Equals() and operator==を参照してください。

引用:デフォルト

、オペレータ== 2つの参照が同じオブジェクトを示すかどうかを決定することにより、基準等価のテスト。したがって、参照型はこの機能を得るために演算子==を実装する必要はありません。型が不変である場合、つまりインスタンスに含まれるデータは変更できないため、参照equalityではなく値equalityを比較する演算子==のオーバーロードは、不変オブジェクトとしてlongと同じとみなすことができるので便利です彼らは同じ価値を持っているからです。非不変型の演算子==を上書きすることはお勧めできません。基本的には

は:!あなたがしたい場合

==と=あなたは、演算子を実装する必要が!Equals(..)Equals(..)のように振る舞うとします。通常、これは不変の型でのみ行います。

+1

+1非常に明確かつ簡潔です。 –

1

equalsメソッドをオーバーライドしていても、等値(または不等号)をチェックできるようにするには、おそらく==および!=メソッドをオーバーライドする必要があります。

1

これは必須ではありませんが、スマートなことです。

オブジェクトを使用する以外のフレームワークと別の開発者を作成する場合は、==と!=を上書きする必要があります。そうすれば、開発者はそれを使うことができます。少なくとも、メモリ内で同じではなく2つのオブジェクトを比較する正しいロジックがあります。

私は== &!=あなたのequalsメソッドを呼び出すことを保証します。

5

対等を実装参照型(クラス)、「ほとんどの参照型、でも人のために「==あなたはEqualsメソッドをオーバーライドする任意の時間を実装」

値型(構造体)についてGuidelines for Implementing Equals and the Equality Operator (==)

を参照してください。メソッドは、==をオーバーライドすべきではありません。例外は、不変クラスと値のような意味を持つクラスに対するものです。

1

あれば、予期しないだろうとそれは、お勧めのようになります。に異なる挙動を

if (foo == bar) 

...:それは必要ありません

if (foo.Equals(bar)) 
+1

'foo == bar'が' foo.Equals(bar) 'とは異なる動作をするケースがたくさんあります。彼らの等価性に対する誤った信念は、彼らがいつも同じように行動するとは限らないという認識よりもはるかに難しい原因になる可能性があります[実際には、フレームワークは、IMHOの間違った欲望'==']にマッチさせる。 – supercat

+0

@supercat良い例は、null可能な型を比較す​​るとき、等価はスマートで、各側のHasValueをチェックします。 – Gary

+0

@Gary:私はDecimalのようなものをもっと考えていました。ランク付けされたオブジェクトが等しくないとみなされる比較手段を持たせることは有益ですが、均等にランク付けされたオブジェクト(1.0dや1.00dなど)を区別できるようにする均等テスト手段を持つことも有益です。 IMHOでは、そのようなオブジェクトは、 '=='と '.Equals'を使って逆の比較結果をもたらすはずです。 – supercat

1

そうでない場合は、誰もあなたを殺すませんそれを行う。

ただし、A.Equals(B)よりも書き込む方が自然である(A == B)ことに注意してください。両方の方法を提供すると、コードの消費者にとってより簡単になります。

2

ここでのすべての回答に加えて、GetHashCode()も確実に一致させることを忘れないでください。

1

(B)Aはnullにはなれません。A == BのいずれかにNULLがあります。

1

オーバーライド==それを呼び出すためにオーバーライドすると、参照型の一般的に悪い考えとして私に当てはまります。 ==をオーバーライドしてEqualsを呼び出すと、コードのユーザーが2つのオブジェクト参照が同じオブジェクト(同じプロパティを持つオブジェクト)を参照しているかどうかをテストする方法はないと思います。

クラスのインスタンスが値の等しいかどうかをテストしたい場合は、参照equalityを具体的にテストするためにequalsを呼び出すだけで、equalsを呼び出す必要があります。

+1

'Object.ReferenceEquals'を使用して、参照の等価性を具体的にチェックできます。 –

+0

ああ、ありがとうセバスチャン - 私はそれについて知らなかった。 –

+1

'Object.ReferenceEquals'を使うことは可能ですが、それはかなり厄介です。私は、オーバーロード可能なequality-testオペレータとreference-equality-testオペレータの両方の '=='トークンのC#使用を、言語の最大の設計ミスの1つと考えています。 – supercat

関連する問題