不使用==检查对象是否为null

adr*_*ryr 3 c# null overloading object operation

在我的程序中,我有从Dictionary派生的对象.我需要检查两个对象是否相等,所以我做了一个重载运算符==.

但是稍后,我需要检查对象是否为空.

If (object == null)  
{...}
Run Code Online (Sandbox Code Playgroud)

所以在这一点上,程序进入我定义的重载操作,但是会抛出NullReferenceException,因为要比较的其中一个对象是null.

所以在重载操作中,我需要检查一个对象是否为null,但不使用==,因为这会给我一个StackOverflowException.

我怎么检查这个?

Jon*_*eet 11

在我的程序中,我有从Dictionary派生的对象.

我会强烈重新考虑从一开始就产生的Dictionary.这很少是一个好主意.一般来说,喜欢组合而不是继承,并且非常仔细地考虑如何在面对可变数据时表现出相等(和哈希码)的行为.如果两个对象在一个点上相等然后在之后不相等,那通常是一个坏迹象.

所以在这一点上,程序进入我定义的重载操作,但是会抛出NullReferenceException,因为要比较的其中一个对象是null.

这就是问题所在.你超载==运营商应该不是抛出一个异常-它应该比较值null.

通常==看起来像这样的重载:

public static bool ==(Foo left, Foo right)
{
    if (ReferenceEquals(left, right))
    {
        return true;
    }
    if (ReferenceEquals(left, null))
    {
        return false;
    }
    // Equals should be overridden, and should be handling the case where
    // right is null (by checking with ReferenceEquals too). Also consider
    // implementing IEquatable<Foo>
    return left.Equals(right);
}
Run Code Online (Sandbox Code Playgroud)

这里Object.ReferenceEquals用于执行参考标识比较.你可以在外面使用它(在你正在考虑改变的代码中),但只是为了使==行为正确.


Den*_*s_E 5

您要么需要强制转换为对象,

(object)obj == null
Run Code Online (Sandbox Code Playgroud)

或使用object.ReferenceEquals(obj, null); (对象不是对象的好名字)