关于c#:依靠&&

Is relying on && short-circuiting safe in .NET?

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

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

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


对。在c &&||中,短路,因此只有当左侧尚未确定结果时,才评估右侧。另一方面,操作人员&|并不短路,总是对双方进行评估。

规格说明:

The && and || operators are called the conditional logical operators. They are also called the"shortcircuiting" logical operators.
...
The operation x && y corresponds to the operation x & y, except that y is evaluated only if x is true
...
The operation x && y is evaluated as (bool)x ? (bool)y : false. In other words, x is first evaluated and converted to type bool. Then, if x is true, y is evaluated and converted to type bool, and this becomes the result of the operation. Otherwise, the result of the operation is false.

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

&&||的一个有趣的特性是,即使它们不在Bools上操作,它们也会短路,但是用户会与truefalse操作符一起使操作符&|过载。

The operation x && y is evaluated as T.false((T)x) ? (T)x : T.&((T)x, y), where
T.false((T)x) is an invocation of the operator false declared in T, and T.&((T)x, y) is an invocation of the selected operator &. In addition, the value (T)x shall only be evaluated once.

In other words, x is first evaluated and converted to type T and operator false is invoked on the result to determine if x is definitely false.
Then, if x is definitely false, the result of the operation is the value previously computed for x converted to type T.
Otherwise, y is evaluated, and the selected operator & is invoked on the value previously computed for x converted to type T and the value computed for y to produce the result of the operation.

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


是的,C使用逻辑短路。

请注意,虽然C(和其他一些.NET语言)的行为是这样的,但它是语言的属性,而不是clr。


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

1
if(myObj?.SomeString != null)

和上面一样。

还可以看到:问号和点运算符是什么?.C 6.0中的平均值?


您的代码是安全的-和都是短路的。您可以使用非短路运算符&;或,它可以对两端进行评估,但在许多生产代码中我真的看不到这一点。


当然,在C上是安全的,如果第一个操作数是假的,那么第二个操作数就永远不会被计算。


一个例子是

1
if(strString != null && strString.Length > 0)

如果两边都执行,这一行将导致空异常。

有趣的旁注。上面的示例比isNullOrEmpty方法快得多。


在c_中,&&||短路,这意味着对第一个条件进行评估,如果确定答案,则忽略其余条件。

在vb.net中,AndAlsoOrElse也会短路。

在javascript中,&&||也会短路。

我提到vb.net是为了证明.net丑陋的红头发继子也有很酷的东西,有时。

我提到javascript,因为如果您正在进行Web开发,那么您可能也会使用javascript。


是的,C大多数语言从左到右计算if语句。

顺便说一下,vb6将计算整个事件,如果它为空,则抛出异常…


它是完全安全的。C是其中一种语言。