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只计算如果x是true
...
的操作x && y被评价为(bool)x ? (bool)y : false.换句话说,x首先评估并转换为类型bool.然后,如果x是true,y则评估并转换为类型bool,这将成为操作的结果.否则,操作的结果是false.
(C#语言规范版本4.0 - 7.12条件逻辑运算符)
的一个有趣的性质&&和||是他们,即使他们不上的bool操作短路,但哪些类型的用户重载运营商&或|与一起true和false运营商.
该操作
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首先计算并转换为类型,T并operator false在结果上调用以确定是否x绝对false.
然后,如果x肯定是false,操作的结果是先前为x转换为类型计算的值T.
否则,y将对其进行求值,并对&先前为x转换为类型计算的值调用所选运算符,并为计算得到T的值y生成操作结果.
(C#语言规范版本4.0 - 7.12.2用户定义的条件逻辑运算符)
har*_*rpo 14
是的,C#使用逻辑短路.
请注意,尽管C#(和其他一些.NET语言)的行为方式如此,但它是语言的属性,而不是CLR.
我知道我迟到了,但在C#6.0中你也可以这样做:
if(myObj?.SomeString != null)
Run Code Online (Sandbox Code Playgroud)
这与上面的相同.
| 归档时间: |
|
| 查看次数: |
16559 次 |
| 最近记录: |