次のようなオブジェクトがある場合:
public class Person
{
public int id {get;set;}
public string name {get;set;}
}
そして私はその振る舞いが欲しい:
Person a = new Person();
Person b = new Person();
a == b;
a == bがtrueを返す場合、Object.Equals()メソッドをオーバーライドする必要がありますか?または、Equalsメソッドをオーバーライドせずにそれを行う他の方法はありますか?
編集
呼び出す外部メソッドが新しいオブジェクトを返すのか、新しいオブジェクトとは異なるデータを持つオブジェクトを返すのかを知りたいので、データを比較したい
これを行うにはいくつかの方法があります。デフォルトEquals()
では==
、参照が等しいかどうかを確認します。つまり、次のようになります。
Person a = new Person();
Person b = a:
a.Equals(b); //true
a == b; //true
したがって、オブジェクトは値の同等性について比較されません。つまり、次のようになります。
Person a = new Person { id = 1, name = "person1" };
Person b = new Person { id = 1, name = "person1" };
a.Equals(b); //false
a == b; //false
オブジェクトの値を比較するには、次のようにメソッドEquals()
とGetHashcode()
メソッドをオーバーライドできます。
public override bool Equals(System.Object obj)
{
if (obj == null)
return false;
Person p = obj as Person;
if ((System.Object)p == null)
return false;
return (id == p.id) && (name == p.name);
}
public bool Equals(Person p)
{
if ((object)p == null)
return false;
return (id == p.id) && (name == p.name);
}
public override int GetHashCode()
{
return id.GetHashCode() ^ name.GetHashCode();
}
これで、比較すると他の結果が表示されます。
Person a = new Person { id = 1, name = "person1" };
Person b = new Person { id = 1, name = "person1" };
Person c = a;
a == b; //false
a == c; //true
a.Equals(b); //true
a.Equals(c); //true
==
オペレータは上書きされませんので、まだ参照の比較を行います。これは、!=
演算子だけでなくオーバーロードすることで解決できます。
public static bool operator ==(Person a, Person b)
{
if (System.Object.ReferenceEquals(a, b))
return true;
if ((object)a == null || (object)b == null)
return false;
return a.id == b.id && a.name == b.name;
}
public static bool operator !=(Person a, Person b)
{
return !(a == b);
}
チェックを実行すると、次のようになります。
Person a = new Person { id = 1, name = "person1" };
Person b = new Person { id = 1, name = "person1" };
Person c = a;
a == b; //true
a == c; //true
a.Equals(b); //true
a.Equals(c); //true
もっと読む:
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加