在.NET中依赖&&短路安全吗?

ast*_*ght 51 .net c# operators short-circuiting logical-operators

假设myObj为null.写这个是安全的吗?

if(myObj != null && myObj.SomeString != null)
Run Code Online (Sandbox Code Playgroud)

我知道有些语言不会执行第二个表达式,因为在执行第二个部分之前&&的计算结果为false.

Cod*_*aos 80

是.在C#中&&并且||是短路的,因此只有在左侧尚未确定结果时才评估右侧.运营商&|在另一方面也不短路,并始终评估两侧.

规范说:

&&||运营商被称为条件逻辑运算符.它们也被称为"短路"逻辑运算符.
...
的操作x && y对应于操作x & y,不同之处在于y只计算如果xtrue
...
的操作x && y被评价为(bool)x ? (bool)y : false.换句话说,x首先评估并转换为类型bool.然后,如果xtrue,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声明的in 的调用T,并且T.&((T)x,y)是所选的调用operator &.此外,值(T)x仅应评估一次.

换句话说,x首先计算并转换为类型,Toperator false在结果上调用以确定是否x绝对false.
然后,如果x肯定是false,操作的结果是先前为x转换为类型计算的值T.
否则,y将对其进行求值,并对&先前为x转换为类型计算的值调用所选运算符,并为计算得到T的值y生成操作结果.

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

  • 最后一段有点*太有趣了......让我的头受伤了.:) (6认同)

har*_*rpo 14

是的,C#使用逻辑短路.

请注意,尽管C#(和其他一些.NET语言)的行为方式如此,但它是语言的属性,而不是CLR.

  • 实际上,VB.NET在使用`AndAlso`和`OrElse`,*not*on`and`和`Or`时表现得这样,这可能是90%的人总是使用的. (13认同)

Dre*_*ano 7

我知道我迟到了,但在C#6.0中你也可以这样做:

if(myObj?.SomeString != null)
Run Code Online (Sandbox Code Playgroud)

这与上面的相同.

另见: 问号和点运算符是什么?在C#6.0中意味着什么?