我有这样的代码:
if (a() && b != null) {
b.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
a()
即使b
是,我也需要副作用null
.它是由C#保证的吗?或者C#可以省略a()
呼叫,如果b
是null
?
Aak*_*shM 118
是的,a()
将始终进行评估.
由于条件是从左到右计算的,因此a()
将始终进行评估,但b != null
仅在a()
返回时 进行评估true
.
以下是C#语言规范3.0版的精确规范参考.我的重点和精神.
7.11.1布尔条件逻辑运算符
当[
&&
或]||
类型的操作数操作bool
如下处理时:
- 该操作
x && y
被评估为x ? y : false
.换句话说,x
是 第一评估并转换为bool类型.然后,如果x
为true,则计算y并将其转换为bool类型,这将成为操作的结果.否则,操作的结果为false.
Jan*_*oom 31
是的,表达式从左到右进行评估; 所以a()
永远都会被召唤.
参见C#语言规范(ECMA 334,第8.5段):
除赋值运算符外,所有二元运算符都是左关联运算符,这意味着操作从左到右执行.例如,x + y + z被评估为(x + y)+ z.