2009-10-02 14 views
7

私のオブジェクトに明示的にEqualsとGetHashCodeを実装する際のポイントがあります。C#Explicit Equality演算子の実装が必要です

しかし、それはまた、明示的に==を実装し、=、このような事業者すべての理にかなっているのだろうか:!==が呼び出されたときに

public static bool operator ==(Salutation left, Salutation right) 
{ 
    return Equals(left, right); 
} 

は、C#の自動Equalsメソッドを使用しませんか?

答えて

8

等価演算子をEqualsと一緒に上書きすることは確かに意味があります。実際、それは非常にお勧めです。

マイクロソフトは、MSDNに公式Guidelines for Implementing Equals and the Equality Operator (==)を投稿しました。私は間違いなくそこにお勧めの練習に行くだろう。 2主なポイントは以下のとおりです。あなたが対等に メソッドを実装するたび

  • がGetHashCodeメソッドを実装します。これにより、Equalsと のGetHashCodeが同期したままになります。
  • 等価演算子 (==)を実装し、それらが同じことを行うたびに、Equalsメソッドをオーバーライドします。 などのインフラストラクチャコードは、 のEqualsメソッドを使用して、 の方法で、 等価演算子を使用して記述されたユーザーコードと同じように動作することができます。

ジョンスキートも参照/値の型にデフォルトでどのようにEquals==オペレータの作業をまとめ、テーマについてuseful MSDN blog postを書きました。ザ・メソッドは単にSystem.Objectの中で定義された仮想 一つであり、どちらのクラスで上書き がそうする を選択等しい

最も重要な部分を以下に引用されています。 ==演算子は 演算子であり、 クラスでオーバーロードされる可能性がありますが、通常は の識別動作を持ちます。正確対等 実装がSystem.Objectのに何である - ==をオーバーロードされていない た基準タイプについて

、それは 2つの参照が同じ オブジェクトを参照するかどうかを比較します。

値タイプではデフォルトで==に対してオーバーロードが行われません 。しかし、 のほとんどは、 フレームワークによって提供されている値の型が独自のオーバーロードを提供します。 デフォルトの実装では、値型に対して を等しいValueTypeにすることによって提供され、それは通常 があろう タイプ固有の実装よりも大幅に遅くなり 比較を行うためにリフレクションを使用しています。この実装でも、 は、比較対象の2つの値の中の参照のペアで等しい値 を呼び出します。

+0

ありがとうございました。私はあなたの答えを受け入れましたが、ジョエルが言ったことのいくつかを編集していただけますか?オーバーライドされない場合、どのように動作するか。 – Tigraine

+0

@Tigraine:問題ありません。 Jon Skeetが書いた、私がリンクしているページでは、実際にJoelが言っていること(そしてそれ以上のこと)はすべて言及されています。あなたが好きなら、私はそれを引用します。 – Noldorin

+0

ありがとう.. :) これで読みやすくなります; – Tigraine

2

これをオーバーロードしないと、==は参照の等価性をチェックします。両辺は同じオブジェクトを参照していますか?

値の等しい必要がある場合(両側の異なるオブジェクトが同じ値を持つかどうか)、演算子をオーバーロードすることができます。この時点で、ほとんどの場合、.Equals()と.GetHashCode()をオーバーロードし、==オーバーロードコール.Equals()を使用します。