それを行うことをお勧めしますか? なぜですか?Equalsメソッドをオーバーライドするときに、==および!=演算子をオーバーライドする必要がありますか? (.NET)
答えて
guidelines for overriding Equals() and operator==を参照してください。
引用:デフォルト
、オペレータ== 2つの参照が同じオブジェクトを示すかどうかを決定することにより、基準等価のテスト。したがって、参照型はこの機能を得るために演算子==を実装する必要はありません。型が不変である場合、つまりインスタンスに含まれるデータは変更できないため、参照equalityではなく値equalityを比較する演算子==のオーバーロードは、不変オブジェクトとしてlongと同じとみなすことができるので便利です彼らは同じ価値を持っているからです。非不変型の演算子==を上書きすることはお勧めできません。基本的には
は:!あなたがしたい場合
==と=あなたは、演算子を実装する必要が!Equals(..)
Equals(..)
のように振る舞うとします。通常、これは不変の型でのみ行います。
equalsメソッドをオーバーライドしていても、等値(または不等号)をチェックできるようにするには、おそらく==および!=メソッドをオーバーライドする必要があります。
これは必須ではありませんが、スマートなことです。
オブジェクトを使用する以外のフレームワークと別の開発者を作成する場合は、==と!=を上書きする必要があります。そうすれば、開発者はそれを使うことができます。少なくとも、メモリ内で同じではなく2つのオブジェクトを比較する正しいロジックがあります。
私は== &!=あなたのequalsメソッドを呼び出すことを保証します。
対等を実装参照型(クラス)、「ほとんどの参照型、でも人のために「==あなたはEqualsメソッドをオーバーライドする任意の時間を実装」
値型(構造体)についてGuidelines for Implementing Equals and the Equality Operator (==)
を参照してください。メソッドは、==をオーバーライドすべきではありません。例外は、不変クラスと値のような意味を持つクラスに対するものです。
あれば、予期しないだろうとそれは、お勧めのようになります。に異なる挙動を
if (foo == bar)
...:それは必要ありません
if (foo.Equals(bar))
'foo == bar'が' foo.Equals(bar) 'とは異なる動作をするケースがたくさんあります。彼らの等価性に対する誤った信念は、彼らがいつも同じように行動するとは限らないという認識よりもはるかに難しい原因になる可能性があります[実際には、フレームワークは、IMHOの間違った欲望'==']にマッチさせる。 – supercat
@supercat良い例は、null可能な型を比較するとき、等価はスマートで、各側のHasValueをチェックします。 – Gary
@Gary:私はDecimalのようなものをもっと考えていました。ランク付けされたオブジェクトが等しくないとみなされる比較手段を持たせることは有益ですが、均等にランク付けされたオブジェクト(1.0dや1.00dなど)を区別できるようにする均等テスト手段を持つことも有益です。 IMHOでは、そのようなオブジェクトは、 '=='と '.Equals'を使って逆の比較結果をもたらすはずです。 – supercat
そうでない場合は、誰もあなたを殺すませんそれを行う。
ただし、A.Equals(B)よりも書き込む方が自然である(A == B)ことに注意してください。両方の方法を提供すると、コードの消費者にとってより簡単になります。
ここでのすべての回答に加えて、GetHashCode()
も確実に一致させることを忘れないでください。
(B)Aはnullにはなれません。A == BのいずれかにNULLがあります。
オーバーライド==それを呼び出すためにオーバーライドすると、参照型の一般的に悪い考えとして私に当てはまります。 ==をオーバーライドしてEqualsを呼び出すと、コードのユーザーが2つのオブジェクト参照が同じオブジェクト(同じプロパティを持つオブジェクト)を参照しているかどうかをテストする方法はないと思います。
クラスのインスタンスが値の等しいかどうかをテストしたい場合は、参照equalityを具体的にテストするためにequalsを呼び出すだけで、equalsを呼び出す必要があります。
'Object.ReferenceEquals'を使用して、参照の等価性を具体的にチェックできます。 –
ああ、ありがとうセバスチャン - 私はそれについて知らなかった。 –
'Object.ReferenceEquals'を使うことは可能ですが、それはかなり厄介です。私は、オーバーロード可能なequality-testオペレータとreference-equality-testオペレータの両方の '=='トークンのC#使用を、言語の最大の設計ミスの1つと考えています。 – supercat
- 1. hashCodeとequalsメソッドをcompareToメソッドでオーバーライドする必要がありますか?
- 2. いつequalsメソッドとhashcodeメソッドをオーバーライドする必要がありますか?
- 3. なぜオーバーライド==はequalsをオーバーライドする必要がありますか?
- 4. 新しいクラスでGetHashCodeとEqualsをオーバーライドする必要がありますか?
- 5. equalsをオーバーライドする必要がない場合のHashCodeのオーバーライド
- 6. javaの "equals()"メソッドをオーバーライドする方法はありますか?
- 7. なぜオーバーライドequals()メソッドのreturn文は、代わりの&&と||を使用する必要がありますか?
- 8. クラスのインスタンスにメソッドをオーバーライドする必要があります
- 9. このメソッドはスーパークラスメソッドをオーバーライドする必要があります
- 10. エラー「InventMovement.pdsCWRemainPhysicalメソッドをオーバーライドする必要があります」
- 11. キーワードとEqualsメソッドのオーバーライド「が」
- 12. 単項演算子をPythonでバイナリ演算子でオーバーライドする可能性はありますか?
- 13. Rubyの<<演算子をオーバーライドする方法はありますか?
- 14. CreateObjRef()をオーバーライドするときに必要なことは?私はする必要がありますか?
- 15. C#のインターフェイスでequals演算子==をオーバーライドするにはどうすればよいですか?
- 16. C++演算子のオーバーライド
- 17. 等価演算子のオーバーライド
- 18. Rubyのオーバーライド==演算子
- 19. ORMで==演算子をオーバーライドするとどのような利点がありますか?
- 20. swift 4.0: 'prepare'をオーバーライドする宣言と同じようにオーバーライドする必要があります。
- 21. Javaで演算子をオーバーライドすることはできますか?
- 22. カスタムValidationAttributeを実装するときに、どのIsValidメソッドをオーバーライドする必要がありますか
- 23. auto_ptrにテンプレートコピーコンストラクタとオーバーライド演算子関数があるのはなぜですか?
- 24. Objective-Cで+ allocをオーバーライドする必要がありますか?
- 25. Reflect.construct()なぜオブジェクトプロトタイプをオーバーライドする必要がありますか?
- 26. コンストラクタがオーバーライド可能なメソッドを呼び出す必要があるときにコンシューマをDRYにする
- 27. C++のオーバーライド演算子とthis
- 28. 静的メソッドはJavaでオーバーライドする必要がありますか?
- 29. LINQを使用するためにどのようなメソッドをオーバーライドする必要がありますか?
- 30. StartActivity型のonInit(int)メソッドはスーパークラスメソッドをオーバーライドする必要があります
+1非常に明確かつ簡潔です。 –