不使用“==”如何检查对象是否为null

3

在我的程序中,我有从字典派生的对象。我需要检查两个对象是否相等,因此我重载了运算符==。

但是在后面的某个时刻,我需要检查一个对象是否为空。

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

因此,在这一点上,程序进入我定义的过载操作,但会抛出NullReferenceException异常,因为要比较的对象之一为空。

因此,在过载操作中,我需要检查一个对象是否为空,但不能使用“==”,因为这会导致StackOverflowException异常。

我该如何检查这个问题?


1
为什么不在你重载的 '==' 中使用 try-catch 来处理空对象呢? - Rob Steiner
5个回答

12
在我的程序中,我有从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)起作用了。 - adryr

5

您需要将其转换为对象,

(object)obj == null

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


其实是的,你是第一个 +1 :) - user2140173

0

在你实现重载的 == 中,你必须检查 null,例如可以遵循以下指南: http://msdn.microsoft.com/en-us/library/ms173147%28v=vs.80%29.aspx

你也可以使用

object.ReferenceEquals(myInstance, null);

请注意,覆盖基本运算符,例如==和/或直接覆盖.NET基类型,例如Dictionary都不是很好的实践。

0

重载“==”运算符,正如您所发现的那样,具有非明显的副作用,通常应该避免使用。

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


0

使用来自C# 7的is null运算符

if(object is null)...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接