24

2つの異なるクラスがあり、それぞれにEqualsの独自の実装があるとします。どちらを使用しますか?それらのうちの1つだけが1つ持っている場合はどうなりますか?またはそれらのどれも?次の行のいずれかが同等ですか?

object .Equals( first, second )
first .Equals( second )
second .Equals( first )

最初の2つは同等かもしれないと思いますが、実際には手がかりがありません。

それは本当に何をしますか?

4

2 に答える 2

45

基本的にそれは3つのことをします:

  • 参照が等しいかどうかを確認します(そうである場合はtrueを返します)
  • 参照のnullをチェックします(いずれかの値がnullの場合はfalseを返します。これまでにnull == nullの場合は処理されています)
  • 値が等しいかどうかを確認しますfirst.Equals(second)

両方の値が正常に動作する等式実装を持っている場合、順序は重要ではありませんx.Equals(y)。等式は、を意味するように実装する必要があるためy.Equals(x)です。ただし、インストールしたオフラインドキュメントには、first.Equals(second)(または実際のパラメーターの命名を使用する場合はobjA.equals(objB))が指定されていると記載されています。興味深いことに、オンラインドキュメントにはこれについては触れられていません。

このすべてを具体的にするために、実装は次のようになります。

public static bool Equals(object x, object y)
{
    if (x == y) // Reference equality only; overloaded operators are ignored
    {
        return true;
    }
    if (x == null || y == null) // Again, reference checks
    {
        return false;
    }
    return x.Equals(y); // Safe as we know x != null.
}
于 2009-09-20T17:02:38.563 に答える
1

デフォルトでは、オブジェクトの同等性は、メモリ内のオブジェクトのアドレスによって決定されます。両方のインスタンスが同じメモリアドレスを持っている場合、それらは等しくなります。

ただし、これはオブジェクト内でオーバーロードできるため、開発者は同じメモリ位置にない2つのオブジェクトを比較しても、等しいと見なすことができますたとえば、各オブジェクトがデータベースからのデータレコードのIDを持つデータアクセス層がある場合、IDに基づいてオブジェクトの同等性を比較できます。

演算子をオーバーロードして、この機能を生成できます。

于 2009-09-20T17:06:03.003 に答える