5

この質問はおそらく以前に回答されていると思いますので、申し訳ありませんが、回答を見つけるための適切な検索用語を見つけることができませんでした.

次のコード例を考えると、db.GetRecords().Any()実行されますか?

string s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &&
         db.GetRecords().Any();
4

6 に答える 6

10

いいえ。&&との両方||短絡評価で評価されます。これは、a && bが false の場合aは false をa || b返し、 が true の場合aは true を返し、これらのいずれの場合も評価されないことを意味しますb

何らかの理由で短絡評価が必要ない場合は、ビット単位の演算子&とを使用できます|

于 2010-10-22T14:13:11.950 に答える
2

C#ロジックの場合-AND(&&)、式が偽である2番目の場合、式が真であるためにはすべてが真である必要があるため、コンパイラはすぐに評価を停止します。

&&演算子(C#リファレンス)

条件付きAND演算子(&&)は、boolオペランドの論理ANDを実行しますが、必要な場合にのみ2番目のオペランドを評価します。

論理ANDとは対照的に、論理OR(||)は、式全体が真であるために、すべての中で1つの式のみが真である必要があります。falseしたがって、評価を短絡する代わりに、||オペレーターはコンパイラーに真の評価を短絡させます。

|| 演算子(C#リファレンス)

これがC#コンパイラの動作ですが、VB.NETのように、すべてのコンパイラがそのように動作するわけではありません。2つの論理AND演算子(AndAndAlso)と2つの論理OR演算子(OrOrElse)があります。ビット演算と論理積のAnd両方に使用される演算子は、最初の式がfalseを返したときに短絡せず、とにかく他の式を評価しますAndAlsoが、最初の論理式がfalseの場合は評価を短絡します。これは、とと同じですOrOrElseここで、Or短絡は発生しませんOrElse

および演算子(Visual Basic)

2つのブール式で論理積を実行するか、2つの数値式でビット単位の論理積を実行します。

AndAlso演算子(Visual Basic)

2つの式で短絡論理積を実行します。

または演算子(Visual Basic)

2つのブール式で論理和を実行するか、2つの数値式でビット論理和を実行します。

OrElse演算子(Visual Basic)

2つの式に対して短絡を含む論理和を実行します。

つまり、これは使用しているコンパイラによって異なります。C#は短絡します。

于 2010-10-22T14:32:36.683 に答える
2

いいえ。&&演算子は短絡します (つまり、式のいずれかの部分が false に評価されると、式の評価が停止します)。

||演算子も短絡しますが、式のいずれかの部分が true に評価されると評価を停止します。

于 2010-10-22T14:11:18.663 に答える
2

いいえ、C# はショート サーキットを使用します。したがって、答えはノーです。

両方を評価する必要がある場合は、アンパサンド&を 1 つだけ使用して NON-SHORT-CIRCUIT 演算子を使用します。

tring s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &
         db.GetRecords().Any();

単一の&に注意してください。

于 2010-10-22T14:11:34.647 に答える
1

これは短絡であり、次のようなことができます。

if(ob && ob.somefunc()) { ... }

両方の操作が評価された場合、実行時の例外となるnullオブジェクトを参照する可能性があります。

于 2010-10-22T14:15:36.937 に答える