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

时间:2014-05-21 14:33:07

标签: c# object null overloading operation

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

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

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

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

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

我该怎么检查?

5 个答案:

答案 0 :(得分: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);
}

此处Object.ReferenceEquals用于执行参考标识比较。您可以在外部使用此功能(在您当前正在考虑更改的代码中),但只有让==正常运行才会更清晰。

答案 1 :(得分:4)

您需要转换为对象,

(object)obj == null

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

答案 2 :(得分:0)

您必须在执行overriden ==时检查null,遵循以下准则: http://msdn.microsoft.com/en-us/library/ms173147%28v=vs.80%29.aspx

您也可以使用

object.ReferenceEquals(myInstance, null);

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

答案 3 :(得分:0)

正如您所发现的那样,

覆盖==运算符具有非明显的副作用,通常应该避免。

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

答案 4 :(得分:0)

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

if(object is null)...