参照型に対して特別なことを何もしなくても、Equals()
参照の等価性 (つまり、同じオブジェクト) を意味します。参照型をオーバーライドすることを選択した場合Equals()
、2 つのオブジェクトの値が等しいことを常に意味する必要がありますか?
この可変Person
クラスを考えてみましょう:
class Person
{
readonly int Id;
string FirstName { get; set; }
string LastName { get; set; }
string Address { get; set; }
// ...
}
まったく同じ人物を表す 2 つのオブジェクトの は常に同じId
ですが、他のフィールドは時間の経過とともに (つまり、住所変更の前後で) 異なる場合があります。
このオブジェクトの場合、Equals を定義して、異なることを意味することができます。
- 値が等しい: すべてのフィールドが等しい (同一人物を表すが住所が異なる 2 つのオブジェクトは false を返します)
- ID の等価性:
Ids
は等しい (同一人物を表すがアドレスが異なる 2 つのオブジェクトは true を返します) - 参照の等価性: つまり、Equals を実装しないでください。
質問:このクラスに適しているのはどれですか? (または、「このクラスのほとんどのクライアントは、Equals() がどのように動作することを期待するでしょうか?」という質問が必要かもしれません)。
ノート:
Hashset
値の等価性を使用すると、このクラスをまたはで使用することがより困難になります。Dictionary
Identity Equality を使用すると、Equals と演算子の間の関係が
=
奇妙になります (つまり、2 つの Person オブジェクト (p1 と p2) のチェックが に対して true を返した後でEquals()
も、「新しい」 Person オブジェクトを指すように参照を更新する必要がある場合があります。同等の値ではありません)。たとえば、次のコードは奇妙に見えます。何もしていないように見えますが、実際には p1 を削除して p2 を追加しています。HashSet<Person> people = new HashSet<Person>(); people.Add(p1); // ... p2 is an new object that has the same Id as p1 but different Address people.Remove(p2); people.Add(p2);
関連する質問: