2つの異なるクラスがあり、それぞれにEqualsの独自の実装があるとします。どちらを使用しますか?それらのうちの1つだけが1つ持っている場合はどうなりますか?またはそれらのどれも?次の行のいずれかが同等ですか?
object .Equals( first, second )
first .Equals( second )
second .Equals( first )
最初の2つは同等かもしれないと思いますが、実際には手がかりがありません。
それは本当に何をしますか?
基本的にそれは3つのことをします:
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.
}
デフォルトでは、オブジェクトの同等性は、メモリ内のオブジェクトのアドレスによって決定されます。両方のインスタンスが同じメモリアドレスを持っている場合、それらは等しくなります。
ただし、これはオブジェクト内でオーバーロードできるため、開発者は同じメモリ位置にない2つのオブジェクトを比較しても、等しいと見なすことができます。たとえば、各オブジェクトがデータベースからのデータレコードのIDを持つデータアクセス層がある場合、IDに基づいてオブジェクトの同等性を比較できます。
演算子をオーバーロードして、この機能を生成できます。