我有这样的代码:
if (a() && b != null) {
b.doSomething();
}
即使a()
为b
,我也需要null
的副作用。它是由C#保证的吗?或者,如果a()
为b
,C#可能会忽略null
来电话。
答案 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()
。
答案 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()函数呈现。
这是所有职业的基础