【问题标题】:Check if object is null without using ==检查对象是否为空而不使用 ==
【发布时间】:2014-05-21 14:33:07
【问题描述】:

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

但稍后,我需要检查一个对象是否为空。

If (object == null)  
{...}

所以此时,程序进入我定义的重载操作,但会抛出 NullReferenceException,因为要比较的对象之一是 null。

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

我该如何检查?

【问题讨论】:

  • 为什么不在重载的 '==' 中做一个 try-catch 来处理空对象?

标签: c# object null overloading operation


【解决方案1】:

在我的程序中,我有从 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);
}

这里Object.ReferenceEquals 用于执行参考身份比较。您可以在外部使用它(在您当前考虑更改的代码中),但让== 行为正确会更简洁。

【讨论】:

  • 谢谢。使用 ReferenceEquals(left, null) 有效。
【解决方案2】:

你要么需要转换为对象,

(object)obj == null

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

【讨论】:

  • 其实你是第一个 +1 :)
【解决方案3】:

您必须在 overriden == 的实现中检查 null,例如遵循以下准则: http://msdn.microsoft.com/en-us/library/ms173147%28v=vs.80%29.aspx

你也可以使用

object.ReferenceEquals(myInstance, null);

请注意,覆盖 == 等基本运算符和/或直接覆盖 Dictionary 等 .Net 基本类型都不是很好的做法。

【讨论】:

    【解决方案4】:

    正如您所发现的,重写 == 运算符具有不明显的副作用,通常应该避免。

    您可以考虑让您的对象实现 IComparable,然后调用 CompareTo 而不是 ==。

    【讨论】:

      【解决方案5】:

      使用 c# 7 中的 is null 运算符

      if(object is null)...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        相关资源
        最近更新 更多