一尘不染

.NET中依靠&&短路安全吗?

c#

假设myObj为空。写这个安全吗?

if(myObj != null && myObj.SomeString != null)

我知道某些语言不会执行第二个表达式,因为&&在执行第二部分之前评估为false。


阅读 298

收藏
2020-05-19

共1个答案

一尘不染

是。在C#&&||被短路,从而评估右侧只有左侧尚不确定结果。运营商&|在另一方面也不短路,并始终评估两侧。

规格说明:

&&||运营商被称为条件逻辑运算符。它们也称为“短路”逻辑运算符。

该运算x && y符与该运算符相对应x & y,但y仅当xtrue
… 时才进行
运算。换句话说,首先被评估并转换为type 。然后,如果是,进行评估并将其转换为类型,并且这成为操作的结果。否则,运算结果为。x && y``(bool)x ? (bool)y : false``x``bool``x``true``y``bool``false

(C#语言规范版本4.0-7.12条件逻辑运算符)

的一个有趣的性质&&,并||为它们短路,即使他们不上的bool操作,但如果用户重载运营商的类型&|与一起truefalse运营商。

该操作x && y的计算方式为T.false((T)x) ? (T)x : T.&((T)x, y),其中
T.false((T)x)是在中operator false声明的调用T,而T.&((T)xy)是对选定对象的调用operator &。此外,值(T)x仅应评估一次。

换句话说,x首先要求值并将其转换为type,T然后operator false对结果进行调用以确定是否x绝对是false
然后,如果x是肯定的话false,则运算的结果是先前计算出的值,以x转换为type T
否则,y将对其求值,然后对&先前计算出的要x转换为type T的值和计算出的y要产生操作结果的值调用所选的运算符。

(C#语言规范版本4.0-7.12.2用户定义的条件逻辑运算符)

2020-05-19