最佳答案
这个问题可能有一个简单的答案... ... 但我似乎不明白。这里有一个简单的例子:
public class Person
{
public string SocialSecurityNumber;
public string FirstName;
public string LastName;
}
假设对于这个特定的应用程序,如果社会保险号码匹配,而且两个名字都匹配,那么我们指的是同一个“人”,这种说法是正确的。
public override bool Equals(object Obj)
{
Person other = (Person)Obj;
return (this.SocialSecurityNumber == other.SocialSecurityNumber &&
this.FirstName == other.FirstName &&
this.LastName == other.LastName);
}
为了保持一致性,我们重写了 = = 和!= 操作符,也适用于团队中不使用 .Equals
方法的开发人员。
public static bool operator !=(Person person1, Person person2)
{
return ! person1.Equals(person2);
}
public static bool operator ==(Person person1, Person person2)
{
return person1.Equals(person2);
}
挺好的,是吧?
但是,当 Person 对象为 null
时会发生什么?
你不能写:
if (person == null)
{
//fail!
}
因为这将导致 = = 操作符重写运行,并且代码将在:
person.Equals()
方法调用,因为不能对空实例调用方法。
另一方面,不能在 = = 覆盖内显式检查这个条件,因为它会导致无限递归(以及 Stack Overflow [ dot com ])
public static bool operator ==(Person person1, Person person2)
{
if (person1 == null)
{
//any code here never gets executed! We first die a slow painful death.
}
return person1.Equals(person2);
}
那么,如何在覆盖 = = 和! = 运算符以获得值相等的同时仍然考虑空对象呢?
我希望答案不是那么简单: -)