2008-12-23 80 views
2

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

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都为空结果是真的但不知道如何检查它而不使用==。

+0

我不打算张贴此作为一个答案,因为我太懒得去测试它,但是你能否扭转逻辑并使用!=? – EBGreen 2008-12-23 17:14:21

+0

如果覆盖==,则还需要覆盖!=。这可能会导致一些循环逻辑。 – tvanfosson 2008-12-23 17:15:37

回答

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

的ReferenceEquals(),如果他们都指向完全相同的对象检查(或者,如果它们都为null)

(作为一般规则,这是很好的一个电话开始的equals()方法到ReferenceEquals,特别是如果其余的方法是复杂的,它会使诸如a==a之类的东西很快返回true,而不是必须检查每个元素。)

1

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

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

没有任何问题。

0

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

你的情况:

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

以下

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

PS的任何。我认为这可能在Customer.Equals中更好,并且依靠它。

0

是否有可能将它们转换为system.object并使用==运算符来检查它是否为空?我会检查它,但我不是一个dev的机器

0

我采取了以下和它的作品像冠军:

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); 
}