C#If语句中条件的执行顺序

时间:2013-05-23 10:05:56

标签: c# .net conditional logical-operators short-circuiting

下面有两个if语句,它们具有使用逻辑运算符的多个条件。逻辑上两者都相同,但检查顺序不同。第一个工作,第二个工作失败。

我提到MSDN检查是否定义了条件的执行顺序;但我找不到。

考虑具有&&作为逻辑运算符的多重检查条件。是否保证始终检查第一个条件,如果不满足,第二个条件会被检查?

我曾经使用方法1,它运作良好。寻找证明其使用的MSDN参考。

更新

参考"short-circuit" evaluation

CODE

  List<string> employees = null;  

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

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

8 个答案:

答案 0 :(得分:39)

&amp;&amp;和||运营商短路。那就是:

1)如果&amp;&amp;将其第一个操作数计算为false,它不计算其第二个操作数。

2)如果||将其第一个操作数计算为true,它不计算其第二个操作数。

这可以让你做空检查&amp;&amp;使用object执行某些操作,就好像它不为null,不计算第二个操作数。

答案 1 :(得分:10)

您应该使用:

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

employees将会短路并且null将不会被执行。

在您的第二个示例中,当您尝试employees集合中的元素时,如果nullCount,则应用程序将抛出异​​常。

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

答案 2 :(得分:8)

从左到右检查条件。如果左边条件为真,&&运算符将仅评估正确的条件。

C#语言规范的第5.3.3.24节规定:

  

5.3.3.24&amp;&amp;表达式

     

对于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的状态肯定是分配

     

o否则,如果expr-second之后的v状态明确赋值或“真正表达后明确赋值”,则expr之后的v状态为“在真实表达后明确赋值”。

     

o否则,如果expr-first之后的v的状态是“在假表达后明确赋值”,并且expr-second之后的v的状态是“在假表达后明确赋值”,那么状态为在expr之后的v是“在假表达后明确分配”。

     

o否则,expr之后的v状态未明确赋值。

因此,这清楚地表明 expr-first 总是被评估,如果是,那么,只有这样, expr-second 才会被评估。

答案 3 :(得分:3)

从左到右,而表达仍然有问题。

答案 4 :(得分:2)

条件AND运算符(&amp;&amp;)执行其bool操作数的逻辑AND,但只在必要时才计算其第二个操作数。

答案 5 :(得分:2)

&amp;&amp;和||运算符通常用于检查对象条件。

1)“&amp;&amp;” condition将其第一个操作数计算为false,它不计算其第二个操作数。如果返回true,则计算第二个条件。如果第二个条件为真,则只返回true。所以&amp;&amp;可用于确保所有条件都满足有效。

2)“||” condition将其第一个操作数计算为true,它不计算其第二个操作数。如果第一个条件的计算结果为false,那么它只会评估为第二个条件。如果满足,则返回true。否则,是假的。

答案 6 :(得分:0)

  

是否保证始终检查第一个条件以及是否   不满意第二个条件不会被检查?

简短回答是肯定的。

答案 7 :(得分:0)

例如,请参阅&&的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 - 这表明在两种情况下都会发生短路行为。另一方面,你可以使用'&amp;'或者'|',分别是逻辑运算符,以防止这种情况发生。这样你就会得到4的结果,因为两个条件都已经过评估了。

相关问题