C#使用Custom ==运算符检查Class是否为Null

时间:2014-07-29 02:31:45

标签: c# operators nullreferenceexception

我正在创建一个简单的class来定义一个数字(实数,虚数或复数)。为了在使用class时让自己变得简单,我创建了自己的operator ==版本。

public class Number
{
    public double Real { get; set; }
    public double Imag { get; set; }

    ...

    public static bool operator ==(Number x, Number y)
    {
        return (x.Real == y.Real && x.Imag == y.Imag);  // Error is thrown here
    }
    public static bool operator !=(Number x, Number y)
    {
        return !(x == y);
    }
}

但是,当我想检查Number是否为null时,代码会抛出NullReferenceException

Number overlap = null;
Number overlapsolve = null;

...

if (overlap != null && overlapsolve != null)  // This is what triggers the error
{
    ...
}

如何检查Number班级是否为null

3 个答案:

答案 0 :(得分:4)

首先,你知道System.Numerics.Complex吗?这似乎正是你所需要的。

但要回答您的问题,请将您的==运算符更改为:

public static bool operator ==(Number x, Number y)
{
     if(ReferenceEquals(x, y)) return true;

     if(ReferenceEquals(x, null) || ReferenceEquals(y, null)) return false;

     return x.Real == y.Real && x.Imag == y.Imag;  
}

注意不要使用==进行空值检查,因为这最终会变成无限递归调用。

答案 1 :(得分:2)

它返回一个NullReferenceException,因为当你执行!=检查时,你正在检查是否

x.Real == y.Real

如果x或y为null,则抛出该异常。在检查相等性之前,您可以在重载运算符中进行简单检查以检查此情况。

答案 2 :(得分:2)

您可以使用Object.ReferenceEquals()查看它是否为空:

if (ReferenceEquals(x, null))
{
    // x is null
}