2012-03-03 7 views
21

msdnIStructuralEquatableとEquals?

に応じIStructuralEquatable

は、構造 平等のためのオブジェクトの比較をサポートするメソッドを定義します。構造上の等価とは、2つのオブジェクトが等しいことを意味します。これは、 の値が等しいためです。 2つのオブジェクト参照が同じ物理オブジェクトである を参照するため、2つのオブジェクト参照が等しいことを示す は、参照の等価とは異なります。

は何ですかEqualsはすべきですか? (IEquatableを上書きするとき)?

+0

@ CodeInChaos私の読んだところ - 複合型(いくつかの要素を含んでいます)のためだけです。 - そうでなければ - もしそれがただ一つのオブジェクトだったら、私はequalsを実装することができた ....? –

+1

私の理解では、型のようなコレクションに使用され、比較の構造部分をカプセル化しますが、要素の比較をユーザーが渡した比較者に任せました。しかし、私は本当にそれを持っているかどうかは分かりません。 – CodesInChaos

+0

http://stackoverflow.com/a/5601068/445517しかし、私は受け入れられた答えはまだ(彼はそれを修正したと主張している)間違っていると思う/ 'IStructuralEquatable'のポイントを取得していないと思う。 – CodesInChaos

答えて

2

なぜIStructuralEquatableが必要なのかは、すべてのオブジェクトに適した新しい比較方法を定義するためです。

IStructuralEquatableインターフェイスを使用すると、コレクション オブジェクトの構造的等価性をチェックするためにカスタマイズされた 比較を実装することができます。つまり、構造 の独自の定義を作成し、IStructuralEquatableインターフェイスを受け入れるコレクション コレクションでこの定義を使用するように指定することができます。

たとえば、すべての要素を特定の定義で並べ替えるリストが必要な場合は、 この場合、クラスの実装を変更して、Equalsメソッドをオーバーライドする必要はありません。

これは、アプリケーションのオブジェクトを比較する一般的な方法を定義します。

0

2つのオブジェクトがの論理的にであるかどうかを示す点で、EqualsのコントラクトはIStructuralEquatableのコントラクトと異なります。

デフォルトでは、参照型のEqualsは、2つのオブジェクト参照が同じオブジェクトインスタンスを参照しているかどうかを示します。ただし、アプリケーションのロジックに応じてEqualsをオーバーライドできます。

例として、Employeeクラスの2つの異なるインスタンスが、両方がシステム内の同じエンティティを表す場合、等しいと見なすことができます。これを実現するために、SSNプロパティと一致する従業員オブジェクトは、構造的に等しくない場合でも論理的に等価として扱われます。

+4

Er ...もしあなたが*論理*同等を望むならば、あなたは 'Object.Equals(Object other)'を上書きします。 *参照*同値が必要な場合は、単にそれを上書きしないでください。あなたが 'struct'を持っていて、*ほとんどの場合*論理比較が必要な場合は、そのメソッドをオーバーライドし、' IEquatable .Equals(T other) 'も実装します。しかし、なぜあなたは 'IStructuralEquatable'を必要としますか? – Mehrdad