关于 C# 中的短路语句的快速问题。使用这样的 if 语句:
if (MyObject.MyArray.Count == 0 || MyObject.MyArray[0].SomeValue == 0)
{
//....
}
如果该部分为真,是否保证评估将在“MyArray.Count”部分之后停止?否则我会在第二部分得到一个空异常。
关于 C# 中的短路语句的快速问题。使用这样的 if 语句:
if (MyObject.MyArray.Count == 0 || MyObject.MyArray[0].SomeValue == 0)
{
//....
}
如果该部分为真,是否保证评估将在“MyArray.Count”部分之后停止?否则我会在第二部分得到一个空异常。
是的,这是有保证的。
和运算
&&
符||
称为条件逻辑运算符。它们也被称为“短路”逻辑运算符。
因此,它们将根据定义支持逻辑短路- 您可以依赖此行为。
现在区分条件运算符和逻辑运算符很重要:
|
,逻辑 AND 是&
。是的,这是有保证的。
http://msdn.microsoft.com/en-us/library/6373h346%28v=VS.80%29.aspx
条件或运算符 (||) 对其布尔操作数执行逻辑或,但仅在必要时评估其第二个操作数。
是的,这是有保证的,但是如果 MyArray 为空(或者显然是 MyObject ),您仍然可以获得空引用异常。
只是一个小小的观察。
你这样说:
否则我会在第二部分得到一个空异常。(强调我的)
事实上,这不是真的。如果不能保证短路,你可以IndexOutOfRangeException
在第二部分得到一个。
如果您的对象中的第一项实际上是 null (或者如果该表达式中的任何其他对象是),您仍然有可能获得 a 。NullReferenceException
MyArray
唯一完全安全的检查是:
bool conditionHolds =
MyObject == null ||
MyObject.MyArray == null ||
MyObject.MyArray.Count == 0 ||
MyObject.MyArray[0] == null ||
MyObject.MyArray[0].SomeValue == 0;
if (conditionHolds)
{
//....
}
我更喜欢使用 && 运算符,因为然后您测试一个肯定的(我的数组包含项目),而不是否定的(我的错误不包含项目):
if (MyObject.MyArray.Count > 0 && MyObject.MyArray[0].SomeValue == 0)
{
//....
}
这也保证短路。