这个问题已经在这里有了答案:




已关闭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);
}

10-04 15:05