4

以下のようなものを書きたいと思います....

bool hasAnyInvalid = false;
hasAnyInvalid |= IsValidType1(...);
hasAnyInvalid |= IsValidType2(...);
hasAnyInvalid |= IsValidType3(...);
hasAnyInvalid |= IsValidType4(...);

if (hasAnyInvalid){ return false; }

私が知る限り、上記は失敗します。真は偽です。

1 つのブール変数を使用して、複数の関数の false をテストするにはどうすればよいですか?

各 IsValidType 関数を評価する必要があります。だから短絡できない。

基本的には、一度真になると真のままである論理ゲートが必要です。過去に C++ で HRESULT リターンを使用してこれを行ったことを思い出すようですが、重大度の整数値を単純に加算していた可能性があります。

私はこれを解決する他の方法を受け入れています。

EDIT:私はこの質問をうまく表現せず、いくつかの論理的なスナフスを含めました(これを XOR として書くつもりでした)。人々が具体的にコメントしたため、元の質問を上記に残しておきます。また、歴史を変更するのは嫌いです。

4

4 に答える 4

7

単一の を検出したい場合は、ではなくfalseを使用する必要があります。&|

bool allValid = true; // Start it with "true"
allValid &= IsValidType1(...); // The first "false" will make "allValid" false
allValid &= IsValidType2(...);
allValid &= IsValidType3(...);
allValid &= IsValidType4(...);
if (!allValid) { // Invert "allValid" before returning
    return false;
}
于 2013-07-12T13:10:19.653 に答える
4

これは、関数の値に対する評価を短絡させず、いずれかの関数が falseを返す場合に戻ります。true

bool[] results = new[] {
    IsValidType1(),
    IsValidType2(),
    IsValidType3(),
    IsValidType4() 
};
return results.Any(b => !b);

あなたの要件のように読めることに注意してください: return trueif any results are false.

各 IsValidType 関数を評価する必要があります。だから短絡できない。

これは、関数に観察する必要がある副作用があることを意味する必要があります。コードを文書化して、誰もこれを見て、関数評価を短絡するように変更すると副作用が除去されてバグが発生する可能性があることに気付かないようにしてください。

私が知る限り、上記はtrue | trueis であるため失敗しfalseます。

何があなたにそう思わせるのかわかりません。true | true、つまりtrue or trueですtrue。を考えているかもしれませんxor、それは ですtrue ^ true

于 2013-07-12T13:15:11.867 に答える