假设myObj为null。写这个是安全的吗?
if(myObj != null && myObj.SomeString != null)
我知道有些语言不会执行第二个表达式,因为&&在执行第二部分之前评估为false。
答案 0 :(得分:72)
是。在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上运行,它们也会短路,但是用户重载运算符的类型&
或{{ 1}}与|
和true
运算符一起使用。
操作
false
被评估为x && y
,其中T.false((T)x) ? (T)x : T.&((T)x, y)
是对T.false((T)x)
中声明的operator false
的调用,而T
,y)是对所选T.&((T)x
的调用。此外,值(T)x只应评估一次。换句话说,首先评估
operator &
并将其转换为x
类型,并在结果上调用T
以确定operator false
是否绝对是x
。
然后,如果false
绝对是x
,则操作的结果是先前为false
转换为类型x
计算的值。
否则,将评估T
,并对先前为y
转换为类型&
计算的值以及为x
计算的值调用所选运算符T
产生操作的结果。
(C#语言规范版本4.0 - 7.12.2用户定义的条件逻辑运算符)
答案 1 :(得分:14)
是的,C#使用逻辑短路。
请注意,尽管C#(和其他一些.NET语言)的行为方式如此,但它是语言的属性,而不是CLR。
答案 2 :(得分:7)
我知道我迟到了,但在C#6.0中你也可以这样做:
if(myObj?.SomeString != null)
与上述内容相同。
另见: What does question mark and dot operator ?. mean in C# 6.0?
答案 3 :(得分:4)
您的代码是安全的 - &&和||两者都是短路的。您可以使用非短路运算符&或者|,它评估两端,但我真的没有在很多生产代码中看到它。
答案 4 :(得分:3)
当然,它在C#上是安全的,如果第一个操作数为false,则第二个操作数永远不会被评估。
答案 5 :(得分:1)
一个例子是
if(strString != null && strString.Length > 0)
如果双方执行,该行将导致空异常。
有趣的附注。上面的例子比IsNullorEmpty方法快得多。
答案 6 :(得分:0)
非常安全。 C#就是其中一种语言。
答案 7 :(得分:0)
是的,C#和大多数语言从左到右计算if句子。
顺便说一句,VB6将计算整个事物,如果它为空则抛出异常...答案 8 :(得分:0)
在C#中,&&
和||
被短路,这意味着第一个条件被评估,如果确定答案则忽略其余条件。
在VB.NET中,AndAlso
和OrElse
也会短路。
在javaScript中,&&
和||
也会被短路。
我提到了VB.NET,以证明.net的丑陋的红头小孩也有时候也很酷。
我提到了javaScript,因为如果你正在进行web开发,那么你可能也会使用javaScript。