操作员过载问题

时间:2008-12-23 17:08:40

标签: c# .net

我正在尝试为自定义类编写运算符重载,并且不知道如何处理空值比较。

Class Customer
{
    int id;

    public static bool operator ==(Customer a, Customer b)
    {
        //When both a and b are null don't know how to compare as can't use == in here as
        //it will fall into loop
    }
}

问题是当a和b都为null时结果为true但不确定如何在不使用==的情况下检查它。

6 个答案:

答案 0 :(得分:7)

if (Object.ReferenceEquals(a,b))
     return true;

ReferenceEquals()检查它们是否指向完全相同的对象(或者它们是否为空)

(作为一般规则,最好通过调用ReferenceEquals来启动Equals()方法,特别是如果方法的其余部分很复杂的话。它会使像a==a之类的东西快速返回true,而不是必须检查每个元素。)

答案 1 :(得分:1)

我不是100%确定我理解这个问题,但你应该能够做到:

if (((object)a == null) && ((object)b == null))
{
    return true;
}

没有任何问题。

答案 2 :(得分:0)

我通常使用object.Equals(a, b)

在你的情况下:

public static bool operator ==(Customer a, Customer b)
{
    if(object.Equals(a, null) && object.Equals(b, null)
    { return true; }
}

答案 3 :(得分:0)

以下任何一项

 object.ReferenceEquals(a, null)
 object.Equals(a, null)
 (object)a == null;

PS。我认为这在Customer.Equals中可能会更好,并且==依赖于它。

答案 4 :(得分:0)

是否可以将它们转换为system.object并使用==运算符检查它是否为空?我会检查它,但我不在开发机器上

答案 5 :(得分:0)

我实现了以下内容,它的作用类似于champ:

public static bool operator ==(Customer a, Customer b)
{
    if(object.ReferenceEquals(a,b)
    { return true; }
    else if(((object)a == null) || ((object)b == null))
         {return false;}
    else if(a.Id == b.Id)
         {return true;}

    return false;
}

public static bool operator !=(Customer a, Customer b)
{
return !(a==b);
}