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 operationx && y corresponds to the operationx & y , except thaty is evaluated only ifx istrue
...
The operationx && y is evaluated as(bool)x ? (bool)y : false . In other words,x is first evaluated and converted to typebool . Then, ifx istrue ,y is evaluated and converted to typebool , and this becomes the result of the operation. Otherwise, the result of the operation isfalse .
(C语言规范版本4.0-7.12条件逻辑运算符)
The operation
x && y is evaluated asT.false((T)x) ? (T)x : T.&((T)x, y) , where
T.false((T)x) is an invocation of theoperator false declared inT , andT.&((T)x , y) is an invocation of the selectedoperator & . In addition, the value (T)x shall only be evaluated once.In other words,
x is first evaluated and converted to typeT andoperator false is invoked on the result to determine ifx is definitelyfalse .
Then, ifx is definitelyfalse , the result of the operation is the value previously computed forx converted to typeT .
Otherwise,y is evaluated, and the selected operator& is invoked on the value previously computed forx converted to typeT and the value computed fory 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中,
在javascript中,
我提到vb.net是为了证明.net丑陋的红头发继子也有很酷的东西,有时。
我提到javascript,因为如果您正在进行Web开发,那么您可能也会使用javascript。
是的,C大多数语言从左到右计算if语句。
顺便说一下,vb6将计算整个事件,如果它为空,则抛出异常…
它是完全安全的。C是其中一种语言。