使用自定义==操作符检查Class是否为Null

本文关键字:是否 Null Class 操作符 自定义 检查 | 更新日期: 2023-09-27 18:15:33

我正在创建一个简单的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 ?

使用自定义==操作符检查Class是否为Null

首先,你知道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;  
}

注意不要将==用于null检查,因为这将最终成为一个无限递归调用。

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

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

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

x.Real == y.Real

如果x或y为空,则抛出该异常。在检查是否相等之前,可以在重载操作符中进行简单的检查,以检查是否存在此条件。