web-dev-qa-db-ja.com

C#のIfステートメントでの条件の実行順序

論理演算子を使用して複数の条件を持つ以下の2つのifステートメントがあります。論理的には両方とも同じですが、チェックの順序が異なります。 1つ目は機能し、2つ目は失敗します。

条件の実行順序が定義されているかどうかを確認するために、 [〜#〜] msdn [〜#〜] を参照しました。見つけられませんでした。

&&論理演算子として。それは常に最初の条件をチェックし、それが満たされない場合、2番目の条件はチェックされないことが保証されますか?

以前はアプローチ1を使用していましたが、うまく機能します。使用法を立証するMSDNリファレンスを探しています。

[〜#〜]更新[〜#〜]

参照 "short-circuit" Evaluation

[〜#〜]コード[〜#〜]

  List<string> employees = null;  

  if (employees != null && employees.Count > 0)
  {
        string theEmployee = employees[0];
  }

  if (employees.Count > 0 && employees != null)
  {
        string theEmployee = employees[0];
  }
27
LCJ

&&と||演算子は短絡します。あれは:

1)&&が最初のオペランドをfalseと評価した場合、2番目のオペランドは評価されません。

2)||の場合最初のオペランドはtrueと評価され、2番目のオペランドは評価されません。

これにより、nullチェックを行うことができ、オブジェクトに対して何かを行うことができます。nullでない場合、2番目のオペランドは評価されません。

47
Patashu

あなたは使うべきです:

  if (employees != null && employees.Count > 0)
  {
        string theEmployee = employees[0];
  }

employeesnullの場合、&&は短絡し、employees.Countは実行されません。

2番目の例では、コレクション内の要素をemployeesしようとすると、nullCountの場合、アプリケーションは例外をスローします。

http://msdn.Microsoft.com/en-us/library/2a723cdk(v = vs.71).aspx

10
Darren

条件は左から右にチェックされます。 &&演算子は、左の条件が真の場合にのみ、右の条件を評価します。

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も評価されることが明確になります。

8
John Willemse

表現がまだ疑わしい間左から右。

3
G.Y

&&と||演算子は、オブジェクトの状態を確認するためによく使用されます。

1)「&&」条件は、最初のオペランドをfalseと評価し、2番目のオペランドは評価しません。 trueを返す場合、2番目の条件が評価されます。 2番目の条件がtrueの場合、それだけがtrueを返します。したがって、&&を使用して、すべての条件が有効として満たされていることを確認できます。

2)「||」 conditionは、最初のオペランドをtrueと評価し、2番目のオペランドは評価しません。最初の条件がfalseと評価された場合、それだけが2番目の条件に評価されます。それが満たされると、trueを返します。それ以外の場合はfalse。

2
Chirag

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

2
Frank Rem

たとえば、この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の結果が得られます。

0
JeffRSon

最初の条件は常にチェックされ、それが満たされない場合は2番目の条件はチェックされないことが保証されていますか?

短い答えはイエスです。

0
yclkvnc