假设 myObj 为空。 写这个安全吗?
if(myObj != null && myObj.SomeString != null)
我知道有些语言不会执行第二个表达式,因为 && 在执行第二部分之前计算结果为 false。
是的。在 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 条件逻辑运算符)
&&
和 ||
的一个有趣的属性是,即使它们不对布尔值进行操作,但它们也是短路的,而是在用户重载运算符 &
或 |
以及 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
,以产生运算结果。y
(C# 语言规范版本 4.0 - 7.12.2 用户定义的条件逻辑运算符)
是的,C# 使用逻辑短路。
请注意,虽然 C#(和其他一些 .NET 语言)的行为方式如此,但它是语言的属性,而不是 CLR。
我知道我迟到了,但在 C# 6.0 中你也可以这样做:
if(myObj?.SomeString != null)
这和上面是一样的。
您的代码是安全的 - && 和 ||均短路。 您可以使用非短路运算符 & 或 |,它们对两端求值,但我在很多生产代码中确实没有看到这一点。
当然,它在 C# 上是安全的,如果第一个操作数为 false,则永远不会计算第二个操作数。
绝对安全。 C# 就是其中一种语言。
在 C# 中,
&&
和 ||
是短路的,这意味着如果确定了答案,则会评估第一个条件,而忽略其余条件。
在 VB.NET 中,
AndAlso
和 OrElse
也是短路的。
在 JavaScript 中,
&&
和 ||
也是短路的。
我提到 VB.NET 是为了表明 .net 的丑陋红发继子有时也有很酷的东西。
我提到 javaScript,因为如果你正在进行 Web 开发,那么你可能也会使用 javaScript。
是的,C# 和大多数语言从左到右计算 if 语句。
顺便说一句,VB6 将计算整个事情,如果它为空,则抛出异常...
一个例子是
if(strString != null && strString.Length > 0)
如果双方都执行的话,这行代码会导致空异常。
有趣的旁注。上面的例子比 IsNullorEmpty 方法快很多。