这可能有一个简单的答案......但它似乎在逃避我。这是一个简化的示例:
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);
}
那么,如何覆盖 == 和 != 运算符以实现值相等并仍然考虑空对象?
我希望答案不是简单得令人痛苦。:-)