这个问题已经在这里有了答案:
已关闭8年。
对此可能有一个简单的答案...但是它似乎使我难以理解。这是一个简化的示例:
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()
方法调用,因为您不能在空实例上调用方法。
另一方面,您无法在==覆盖内明确检查此条件,因为它将导致无限递归(以及堆栈溢出[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);
}
因此,如何覆盖==和!=运算符以实现值相等,同时仍然考虑空对象?
我希望答案不是很简单。 :-)
最佳答案
使用object.ReferenceEquals(person1, null)
代替==
运算符:
public static bool operator ==(Person person1, Person person2)
{
if (object.ReferenceEquals(person1, null))
{
return object.ReferenceEquals(person2, null);
}
return person1.Equals(person2);
}