【问题标题】:Execution order of conditions in C# If statementC#If语句中条件的执行顺序
【发布时间】:2013-05-18 15:26:08
【问题描述】:

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

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

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

我曾经使用方法 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];
  }

【问题讨论】:

  • 搜索“短路”!

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


【解决方案1】:

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

1) "&&" 条件将其第一个操作数评估为假,它不评估其第二个操作数。如果它返回 true,则计算第二个条件。如果第二个条件为真,那么只有它会返回真。因此 && 可用于确保所有条件都满足有效。

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

【讨论】:

    【解决方案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 的结果,因为这两个条件都已评估。

    【讨论】:

      【解决方案3】:

      是否保证它总是检查第一个条件,如果 那不满足第二个条件就不检查了?

      简短的回答是肯定的。

      【讨论】:

        【解决方案4】:

        从左到右检查条件。 &amp;&amp; 运算符只会在左侧条件为真时评估右侧条件。

        C# 语言规范第 5.3.3.24 节指出:

        5.3.3.24 && 表达式

        对于expr-first &amp;&amp; expr-second 形式的表达式expr

        ·expr-first之前v的确定赋值状态与expr之前v的确定赋值状态相同。

        · 如果expr-first 之后的v 状态要么是明确赋值要么是“在真表达式后明确赋值”,那么expr-second 之前的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 也会被评估。

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          条件与运算符 (&&) 对其布尔操作数执行逻辑与,但仅在必要时计算其第二个操作数。

          【讨论】:

            【解决方案7】:

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

            1) 如果 && 将其第一个操作数计算为假,则不计算其第二个操作数。

            2) 如果 ||将其第一个操作数评估为真,但不评估其第二个操作数。

            这让你可以做空检查 && 对对象做一些事情,就好像它不为空一样,第二个操作数不被计算。

            【讨论】:

            【解决方案8】:

            你应该使用:

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

            如果employeesnull&amp;&amp; 将短路,employees.Count 将不会被执行。

            在您的第二个示例中,当您尝试 Count 集合中的元素时,如果 employeesnull,应用程序将引发异常。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-03-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-04-11
              • 2013-10-17
              • 2023-04-04
              • 2022-12-31
              相关资源
              最近更新 更多