“if(a()&& b!= null)”将“a()”总是被评估?

时间:2011-11-23 11:32:10

标签: c#

我有这样的代码:

if (a() && b != null) {
    b.doSomething();
}

即使a()b,我也需要null的副作用。它是由C#保证的吗?或者,如果a()b,C#可能会忽略null来电话。

14 个答案:

答案 0 :(得分:118)

是的,a()将始终被评估。

由于从左到右评估条件,因此将始终评估a(),但只有在b != null返回a()时才会评估true

以下是C#语言规范3.0版的精确规范参考。我的重点和精神。

  

7.11.1布尔条件逻辑运算符

     

&&||的操作数类型为bool [...]时,操作将按如下方式处理:

     
      
  • 操作x && y评估为x ? y : false。换句话说,x是   第一次评估并转换为bool类型。然后,如果x为真,则y为   评估并转换为类型bool,这成为了结果   操作。否则,操作结果为false。
  •   

答案 1 :(得分:31)

是的,表达式从左到右进行评估;所以始终会调用a()

C# language spec(ECMA 334,第8.5段):

  

除赋值运算符外,所有二元运算符都是   左关联,意味着操作从左到右执行   对。例如,x + y + z被评估为(x + y)+ z。

答案 2 :(得分:17)

从左到右评估条件。因此始终会执行a(),但b 可能不会根据a()的结果进行评估。

答案 3 :(得分:13)

始终会评估

a()。仅当b != null评估为true时,才会评估a()

这称为short circuit evaluation

答案 4 :(得分:6)

&&的左侧总是被评估。只有左边为真,才会评估右边。所以你应该没事。

答案 5 :(得分:5)

根据MSDN

  

操作

     

x&& y对应于操作

     

x& y除了如果x为假,则不评估y,因为   无论y的值是什么,AND运算的结果都是假的。   这被称为“短路”评估。

答案 6 :(得分:4)

if语句中的逻辑条件由两个逻辑运算符组成,首先是a(),它总是被评估。

答案 7 :(得分:4)

总是会调用a(),因为它是检查if语句的第一件事,即使b为null。

答案 8 :(得分:4)

如果编译器推断进一步的评估不会修改结果,则可以完全评估布尔表达式或部分评估布尔表达式。

if (a() || b()) c();

如果依赖于b()的副作用,如果特定的编译器实现执行智能布尔评估,则无法获得所需的内容。我不确定标准关于评估布尔表达式的内容,但是如果你想要你的源代码的可读性,你最好完全拼写出来。它将提高可读性。

if (a()) 
{
    b();
    c();
}
else 
if (b()) c();

答案 9 :(得分:2)

由于从左到右评估条件,因此将始终评估a()。由于您使用了短路AND(&&),如果a()返回false,则不会评估b != null。如果您希望评估两个条件,a()是返回true还是false,请使用&运算符。

答案 10 :(得分:2)

除了最佳答案:

(x && y)的评价:
如果x的计算结果为 false ,则不会评估y。

(x || y)的评价:
如果x评估为 true ,则不会评估y。

在任何一种情况下,始终会评估第一个操作数。你必须格外小心,在第二个操作数中有副作用。

答案 11 :(得分:1)

是的,但“您的代码正常工作并不重要,您的代码可以理解非常重要。

我更喜欢这样:

bool val = a();
if (val && b != null) {
    b.doSomething();
}

答案 12 :(得分:0)

这取决于您想要的操作优先级。是的,它从左到右进行评估,这意味着a()总是在其余部分之前执行。如果你想要总是评估b!= null,那么就交换它们的位置。

答案 13 :(得分:-5)

&安培;&安培;当两个条件都为真时运行条件。

当b不等于null时,a()函数呈现。

这是所有职业的基础