编写equals运算符时处理null的最佳方法

Geo*_*uer 7 c# equals operator-overloading

可能重复:
如何在没有无限递归的情况下检查'=='运算符重载中的空值?

当我为对象重载==运算符时,我通常写这样的东西:

    public static bool operator ==(MyObject uq1, MyObject uq2) {
        if (((object)uq1 == null) || ((object)uq2 == null)) return false;
        return uq1.Field1 == uq2.Field1 && uq1.Field2 == uq2.Field2;
    }
Run Code Online (Sandbox Code Playgroud)

如果你没有向下转换为对象,那么函数可以自我复制,但我不得不怀疑是否有更好的方法?

Phi*_*eck 7

正如微软所说,

operator ==的重载中的常见错误是使用(a == b),(a == null)或(b == null)来检查引用相等性.这反而导致调用重载的运算符==,导致无限循环.使用ReferenceEquals或将类型转换为Object,以避免循环.

所以使用ReferenceEquals(a,null)|| ReferenceEquals(b,null)是一种可能性,但是对象的转换同样好(实际上是等价的,我相信).

所以是的,似乎应该有更好的方法,但你使用的方法是推荐的方法.

但是,正如已经指出的那样,当覆盖==时,你真的应该重写Equals.LINQ提供程序使用不同的语言编写,并在运行时进行表达式解析,即使您自己拥有所有代码,谁知道什么时候您不会这样做.

  • 我想你误解了上面的ReferenceEquals调用.我只是用NULL来测试相等性,另外还要理解做一个实际的相等性检查.不要调用referenceequals来测试参数的相等性. (2认同)

Jua*_*nma 2

ReferenceEquals(对象 obj1, 对象 obj2)