C#If语句中条件的执行顺序
下面有两个if语句,它们使用逻辑运算符有多个条件。 逻辑上两者都相同,但检查顺序不同。 第一个工作,第二个工作失败。
我引用了MSDN来检查是否定义了执行条件的顺序; 但我找不到。
考虑具有&&
作为逻辑运算符的多重检查条件。 是否保证始终检查第一个条件,如果不满足,则不会检查第二个条件?
我曾经使用方法1,它运作良好。 寻找certificate其使用的MSDN参考资料。
UPDATE
参考“短路”评估
码
List 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)如果|| 将其第一个操作数计算为true,它不计算其第二个操作数。
这允许你进行空检查&&对对象执行某些操作,就好像它不为null,不计算第二个操作数。
你应该使用:
if (employees != null && employees.Count > 0) { string theEmployee = employees[0]; }
如果employees
为null
&&
将短路和employees.Count
将不会被执行。
在第二个示例中,当您尝试Count
集合中的元素时,如果employees
为null
,则应用程序将抛出异常。
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
forms的expr-first && expr-second
:·
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的状态是“在false表达式之后明确赋值”,那么expr之后的v的状态是明确赋值的。o否则,如果
expr-second
之后的v的状态被明确赋值或“在真实表达式之后明确赋值”,则expr之后的v的状态是“在真实表达之后明确赋值”。o否则,如果
expr-first
之后的v的状态是“在false表达式之后明确赋值”,并且expr-second
之后的v的状态是“在false表达式之后明确赋值”,则expr之后的v的状态是“明确赋值”在虚假表达之后“。o否则,expr之后的v状态未明确赋值。
因此,这清楚地表明expr-first总是被评估,如果是真的那么,只有这样, expr-second也被评估。
条件AND运算符(&&)执行其bool操作数的逻辑AND,但仅在必要时才计算其第二个操作数。
从左到右,而表达仍然有问题。
&&和|| 运算符通常用于检查对象条件。
1)“&&”条件将其第一个操作数计算为false,不计算其第二个操作数。 如果返回true,则评估第二个条件。 如果第二个条件为真,则只返回true。 所以&&可以用来确保所有条件都满足有效。
2)“||” condition将其第一个操作数计算为true,它不计算其第二个操作数。 如果第一个条件的计算结果为false,那么它只会评估为第二个条件。 如果满足,则返回true。 否则,假。
是否保证始终检查第一个条件,如果不满足,则不会检查第二个条件?
简短的回答是肯定的。
例如,参见&&的 MSDN页面,其中描述了短路评估。
您可以检查或certificate执行顺序如下:
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的结果,因为两个条件都已经过评估。