1

false値比較のために Equality メソッドをオーバーロードしていますが、値比較の 1 つが 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ないとします。比較する最も効率的な方法は、false2 つの値が等しくないことがわかったらすぐに戻ることです。次のようなもの...

        // 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;

そのため、s の比較後、_valOne値の比較は行われません。これは非常に反復的で、ぎこちなく、(最も重要なことに) 可読性が悪いように見えます。&& 演算子を使用せずに、このコードをクリーンな方法で同じ効果に縮小できる方法があるかどうかを知りたいです。

4

3 に答える 3

5

次のように、論理 AND ( ) 演算子の短絡的な性質を利用できます。&&

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

比較のいずれかが false と評価されるとすぐに、条件全体が false と評価されます。3 つすべてが true の場合、条件は true を返します。

于 2011-03-25T18:18:42.823 に答える
1

and条件を使用します。

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

&&はデフォルトで短絡を実装します。

于 2011-03-25T18:20:22.213 に答える
0

別の方法はこれを行うことです:

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

選択の問題だと思います。&& の方が読みやすいと思います..

于 2011-03-25T18:53:13.277 に答える