一旦变量设置为某个值,就返回一个变量。平等超载

时间:2011-03-25 18:17:00

标签: c# equals short-circuiting

我正在重载Equality方法进行值比较,并且想知道如果其中一个值比较返回false,是否有一种干净的方式返回false。例如,这是基本的想法:

public class MyClass
{
    private int _valOne;
    private int _valTwo;
    private int _valThree;

    public MyClass(int valOne, int valTwo, int valThree)
    {
        _valOne = valOne;
        _valTwo = valTwo;
        _valThree = valThree;
    }

    public override bool Equals(object obj)
    {
        // If the object is null return false
        if (obj == null)
        {
            return false;
        }

        // If the object is not of MyClass type return false
        MyClass myClass = obj as MyClass;
        if (myClass == null)
        {
            return false;
        }

        // Now compare all the field values
        bool areEqual = false;
        areEqual = (this._valOne == myClass._valOne);
        areEqual = (this._valTwo == myClass._valTwo);
        areEqual = (this._valThree == myClass._valThree);

        return areEqual;
    }
}

_valOne不相等。最有效的比较方法是,一旦知道两个值不相等就返回false。像下面这样......

        // Now compare all the field values
        bool areEqual = false;

        areEqual = (this._valOne == myClass._valOne);
        if (!areEqual)
        {
            return false;
        }

        areEqual = (this._valTwo == myClass._valTwo);
        if (!areEqual)
        {
            return false;
        }

        areEqual = (this._valThree == myClass._valThree);

        return areEqual;

所以现在在_valOne的比较之后,不再进行价值比较。这似乎非常重复,笨重,而且(最重要的是)可读性太可怕了。我想知道是否有任何方法可以在不使用&&的情况下以干净的方式将此代码减少到相同的效果。操作

3 个答案:

答案 0 :(得分:5)

您可以利用逻辑AND(&&)运算符的short-circuiting性质,如下所示:

return this._valOne == myClass._valOne
    && this._valTwo == myClass._valTwo
    && this._valThree == myClass._valThree;

只要任何一个比较评估为false,整个条件的评估结果为false。如果所有三个都为真,则条件返回true。

答案 1 :(得分:1)

使用和条件:

areEqual = (this._valOne == myClass._valOne) 
    && (this._valTwo == myClass._valTwo) 
    && (this._valThree == myClass._valThree);

&安培;&安培;默认情况下实现短路。

答案 2 :(得分:0)

另一种方法可能是这样做:

    if (this._valOne != myClass._valOne)
         return false;
    if (this._valTwo != myClass._valTwo)
         return false;
    if (this._valThree != myClass._valThree)
         return false;
    return true;

我想是一个选择问题。我认为&&一个更具可读性..