この質問はおそらく以前に回答されていると思いますので、申し訳ありませんが、回答を見つけるための適切な検索用語を見つけることができませんでした.
次のコード例を考えると、db.GetRecords().Any()
実行されますか?
string s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &&
db.GetRecords().Any();
この質問はおそらく以前に回答されていると思いますので、申し訳ありませんが、回答を見つけるための適切な検索用語を見つけることができませんでした.
次のコード例を考えると、db.GetRecords().Any()
実行されますか?
string s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &&
db.GetRecords().Any();
いいえ。&&
との両方||
が短絡評価で評価されます。これは、a && b
が false の場合a
は false をa || b
返し、 が true の場合a
は true を返し、これらのいずれの場合も評価されないことを意味しますb
。
何らかの理由で短絡評価が必要ない場合は、ビット単位の演算子&
とを使用できます|
。
C#ロジックの場合-AND(&&
)、式が偽である2番目の場合、式が真であるためにはすべてが真である必要があるため、コンパイラはすぐに評価を停止します。
条件付きAND演算子(&&)は、boolオペランドの論理ANDを実行しますが、必要な場合にのみ2番目のオペランドを評価します。
論理ANDとは対照的に、論理OR(||
)は、式全体が真であるために、すべての中で1つの式のみが真である必要があります。false
したがって、評価を短絡する代わりに、||
オペレーターはコンパイラーに真の評価を短絡させます。
これがC#コンパイラの動作ですが、VB.NETのように、すべてのコンパイラがそのように動作するわけではありません。2つの論理AND演算子(And
、AndAlso
)と2つの論理OR演算子(Or
、OrElse
)があります。ビット演算と論理積のAnd
両方に使用される演算子は、最初の式がfalseを返したときに短絡せず、とにかく他の式を評価しますAndAlso
が、最初の論理式がfalseの場合は評価を短絡します。これは、とと同じですOr
。OrElse
ここで、Or
短絡は発生しませんOrElse
。
2つのブール式で論理積を実行するか、2つの数値式でビット単位の論理積を実行します。
2つの式で短絡論理積を実行します。
2つのブール式で論理和を実行するか、2つの数値式でビット論理和を実行します。
2つの式に対して短絡を含む論理和を実行します。
つまり、これは使用しているコンパイラによって異なります。C#は短絡します。
いいえ。&&
演算子は短絡します (つまり、式のいずれかの部分が false に評価されると、式の評価が停止します)。
||
演算子も短絡しますが、式のいずれかの部分が true に評価されると評価を停止します。
いいえ、C# はショート サーキットを使用します。したがって、答えはノーです。
両方を評価する必要がある場合は、アンパサンド&を 1 つだけ使用して NON-SHORT-CIRCUIT 演算子を使用します。
tring s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &
db.GetRecords().Any();
単一の&に注意してください。
これは短絡であり、次のようなことができます。
if(ob && ob.somefunc()) { ... }
両方の操作が評価された場合、実行時の例外となるnullオブジェクトを参照する可能性があります。