2011-03-25 6 views
1

値の比較のために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年代が等しくないと言います。比較する最も効率的な方法は、2つの値が等しくないことがわかったらすぐに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秒の比較後。これは非常に反復性があり、不器用で、(最も重要なことに)読みやすさの面で恐ろしいようです。私は、このコードを同じ効果に、& &オペレータを使用せずにクリーンな方法で減らすことができるかどうかを知りたいと思います。

答えて

1

利用ANと条件:

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

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

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

私は推測する選択の問題:

+0

私はこれをやろうと考えていましたが、いくつかのフィールドでは手に入らないと思っていました。私はそれが機能し、この問題の唯一の解決策かもしれませんが、あなたが考えることができる他の方法はありますか? – 7ogan

+0

Raze2Dustのもう1つの答えは、手動で各条件をフォロースルーし、誤って戻ったときにすぐに戻るという唯一の方法です。 &&演算子は、C#論理演算子の短絡動作と非常によく似た動作をします。 – KeithS

5

あなたはこのような論理AND(&&)演算子のshort-circuitingな性質を利用することができます。

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

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

+0

私はRaze2Dustと言ったように... &&演算子を使う以外の方法はありますか? – 7ogan

+0

私はそうは思わない、あなたがこれについてリフレクションを使用できるかどうかわからない。 – BoltClock

+0

私は、とにかく反射以上の&&演算子を好むでしょう。あなたの答えをありがとう。 – 7ogan

0

もう一つの方法は、これを行うことができます。私は& &一つがより読みやすいと思うでしょう。

関連する問題