有几种方法可以做到这一点。默认情况下,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