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

时间:2011-01-27 19:01:10

标签: c# .net operators logical-operators short-circuiting

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

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

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

9 个答案:

答案 0 :(得分:72)

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

规范说:

  

&&||运算符称为条件逻辑运算符。它们也被称为“短路”逻辑运算符   ...
  操作x && y对应于操作x & y,但仅当yx时才评估true   ...
  操作x && y评估为(bool)x ? (bool)y : false。换句话说,首先评估x并将其转换为bool类型。然后,如果xtrue,则会计算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中,AndAlsoOrElse也会短路。

在javaScript中,&&||也会被短路。

我提到了VB.NET,以证明.net的丑陋的红头小孩也有时候也很酷。

我提到了javaScript,因为如果你正在进行web开发,那么你可能也会使用javaScript。