有幾種方法可以做到這一點。默認情況下,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
更多閱讀:
這可以通過重載它還有
!=
操作來解決
有關實現自定義GetHashCode實現的更好方法,請參閱http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode。另外,爲什麼不在比較null時使用ReferenceEquals並避免投射?名稱比較是否區分大小寫?我猜並不是因爲在名稱方面,案件通常不重要。 – tvanfosson