論理演算子を使用して複数の条件を持つ以下の2つのifステートメントがあります。論理的には両方とも同じですが、チェックの順序が異なります。 1つ目は機能し、2つ目は失敗します。
条件の実行順序が定義されているかどうかを確認するために、 [〜#〜] msdn [〜#〜] を参照しました。見つけられませんでした。
&&
論理演算子として。それは常に最初の条件をチェックし、それが満たされない場合、2番目の条件はチェックされないことが保証されますか?
以前はアプローチ1を使用していましたが、うまく機能します。使用法を立証するMSDNリファレンスを探しています。
[〜#〜]更新[〜#〜]
[〜#〜]コード[〜#〜]
List<string> employees = null;
if (employees != null && employees.Count > 0)
{
string theEmployee = employees[0];
}
if (employees.Count > 0 && employees != null)
{
string theEmployee = employees[0];
}
&&と||演算子は短絡します。あれは:
1)&&が最初のオペランドをfalseと評価した場合、2番目のオペランドは評価されません。
2)||の場合最初のオペランドはtrueと評価され、2番目のオペランドは評価されません。
これにより、nullチェックを行うことができ、オブジェクトに対して何かを行うことができます。nullでない場合、2番目のオペランドは評価されません。
あなたは使うべきです:
if (employees != null && employees.Count > 0)
{
string theEmployee = employees[0];
}
employees
がnull
の場合、&&
は短絡し、employees.Count
は実行されません。
2番目の例では、コレクション内の要素をemployees
しようとすると、null
がCount
の場合、アプリケーションは例外をスローします。
http://msdn.Microsoft.com/en-us/library/2a723cdk(v = vs.71).aspx
条件は左から右にチェックされます。 &&
演算子は、左の条件が真の場合にのみ、右の条件を評価します。
C#言語仕様のセクション5.3.3.24は次のように述べています。
5.3.3.24 &&式
expr-first && expr-second
形式の式exprの場合:・
expr-first
の前のvの確定代入状態は、exprの前のvの確定代入状態と同じです。・
expr-second
の後のvの状態が確実に割り当てられるか、「真の式の後に確実に割り当てられる」場合、expr-first
の前のvの明確な割り当て状態が確実に割り当てられます。それ以外の場合は、確実に割り当てられません。・exprの後のvの明確な割り当て状態は、次のように決定されます。
o
expr-first
の後のvの状態が確実に割り当てられている場合、exprの後のvの状態は確実に割り当てられます。oそれ以外の場合、
expr-second
の後のvの状態が確実に割り当てられ、expr-first
の後のvの状態が「偽の式の後で確実に割り当てられる」場合、exprの後のvの状態が確実に割り当てられます。それ以外の場合、
expr-second
の後のvの状態が確実に割り当てられるか、「真の式の後に確実に割り当てられる」場合、exprの後のvの状態は「真の式の後に確実に割り当てられる」。oそれ以外の場合、
expr-first
の後のvの状態が「誤った式の後に確実に割り当てられ」、expr-second
の後のvの状態が「誤った式の後に確実に割り当てられた」場合、exprの後のvの状態「偽の表現の後に確実に割り当てられる」。それ以外の場合、exprの後のvの状態は確実に割り当てられません。
したがって、これにより、expr-firstが常に評価され、trueの場合に限り、expr-secondも評価されることが明確になります。
表現がまだ疑わしい間左から右。
&&と||演算子は、オブジェクトの状態を確認するためによく使用されます。
1)「&&」条件は、最初のオペランドをfalseと評価し、2番目のオペランドは評価しません。 trueを返す場合、2番目の条件が評価されます。 2番目の条件がtrueの場合、それだけがtrueを返します。したがって、&&を使用して、すべての条件が有効として満たされていることを確認できます。
2)「||」 conditionは、最初のオペランドをtrueと評価し、2番目のオペランドは評価しません。最初の条件がfalseと評価された場合、それだけが2番目の条件に評価されます。それが満たされると、trueを返します。それ以外の場合はfalse。
条件付きAND演算子(&&)は、boolオペランドの論理ANDを実行しますが、必要な場合にのみ2番目のオペランドを評価します。
たとえば、このMSDNページで、短絡評価について説明している && を参照してください。
次のように実行シーケンスを確認または証明できます。
int i;
bool b;
b=((i=3)==0 && (i=4)!=0);
Console.WriteLine(i);
b=((i=3)!=0 || (i=4)!=0);
Console.WriteLine(i);
どちらの場合も3になります。これは、どちらの場合も短絡動作が発生することを示しています。一方、論理演算子「&」または「|」をそれぞれ使用して、それを防ぐことができます。両方の条件が評価されているため、このような場合は4の結果が得られます。
最初の条件は常にチェックされ、それが満たされない場合は2番目の条件はチェックされないことが保証されていますか?
短い答えはイエスです。