-2

可能的重复:
比较引用类型的两个实例的“最佳实践”是什么?
如何在没有无限递归的情况下检查“==”运算符重载中的空值?

我有一个名为“Criterion”的类,我想实现 == 运算符,但我正在努力解决以下问题:

当我实现 == 运算符时,我正在检查我的一个或两个实例是否为空,但是当我这样做时,它会导致对 == 的递归调用,然后我得到“StackOverflow”(he he)异常。

从技术上讲,我可以实现 Equals 运算符而不覆盖 ==,但是如果我实现 == 运算符,代码将更具可读性。

这是我的代码:

public static bool operator == (Criterion c1, Criterion c2)
{
    if (null == c1)
    {
        if (null == c2)
            return true;
        return false;
    }
    if (null == c2)
        return false;                
    if ((c1.mId == c2.mId) && (c1.mName == c2.mName))
        return true;
    return false;
}
4

2 回答 2

11

尝试ReferenceEquals

public static bool operator ==(Criterion c1, Criterion c2) {
    var nullC1 = ReferenceEquals(null, c1);
    var nullC2 = ReferenceEquals(null, c2);
    if (nullC1 && nullC2)
        return true;

    if (!nullC1 && !nullC2)
        if (c1.mId == c2.mId && c1.mName == c2.mName)
            return true;

    return false;
}
于 2013-01-20T19:16:46.520 回答
1

我会这样做:

bool isC1Null = Object.Equals(c1, null)
bool isC2Null = Object.Equals(c2, null)
if (isC1Null ^ isC2Null)
{
    return false
}
if (isC1Null && isC2Null)
{
    return true
}
//your code
于 2013-01-20T19:20:17.287 回答