首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >重写==运算符。如何与null进行比较?

重写==运算符。如何与null进行比较?
EN

Stack Overflow用户
提问于 2010-11-19 04:29:19
回答 8查看 70K关注 0票数 146

可能重复:

How do I check for nulls in an ‘==’ operator overload without infinite recursion?

对于this...but,可能有一个简单的答案,它似乎让我难以理解。下面是一个简化的示例:

代码语言:javascript
复制
public class Person
{
   public string SocialSecurityNumber;
   public string FirstName;
   public string LastName;
}

假设对于这个特定的应用程序,如果社会保险号匹配,并且两个名字都匹配,那么我们指的是同一个“人”,这是有效的。

代码语言:javascript
复制
public override bool Equals(object Obj)
{
    Person other = (Person)Obj;
    return (this.SocialSecurityNumber == other.SocialSecurityNumber &&
        this.FirstName == other.FirstName &&
        this.LastName == other.LastName);
}

为了保持一致,我们还为团队中不使用.Equals方法的开发人员覆盖了==和!=运算符。

代码语言:javascript
复制
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时会发生什么

你不能写:

代码语言:javascript
复制
if (person == null)
{
    //fail!
}

由于这将导致==操作符重写运行,并且代码将在以下位置失败:

代码语言:javascript
复制
person.Equals()

方法调用,因为您不能在空实例上调用方法。

另一方面,您不能在==覆盖中显式地检查此条件,因为它将导致无限递归(以及Stack Overflow .com)

代码语言:javascript
复制
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);
}

那么,如何覆盖==和!=运算符以实现值相等,并仍然考虑空对象呢?

我希望答案不是简单得令人痛苦。:-)

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-11-19 04:31:39

使用object.ReferenceEquals(person1, null)或新的is operator代替==运算符:

代码语言:javascript
复制
public static bool operator ==(Person person1, Person person2)
{
    if (person1 is null)
    {
         return person2 is null;
    }

    return person1.Equals(person2);
}
票数 266
EN

Stack Overflow用户

发布于 2010-11-19 04:32:26

你可以随时重写并放入

代码语言:javascript
复制
(Object)(person1)==null

我可以想象这会起作用,但不确定。

票数 12
EN

Stack Overflow用户

发布于 2010-11-19 10:17:24

使用这些方法比使用任何一种方法都要简单

代码语言:javascript
复制
public static bool operator ==(Person person1, Person person2)   
{   
    EqualityComparer<Person>.Default.Equals(person1, person2)
} 

这与其他人提出的方法具有相同的空等式语义,但框架的问题在于找出细节:)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4219261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档