在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"部分为真,那么评估是否保证在那里停止?否则我会在第二部分得到一个空异常。
是的,这是有保证的。
&&
和||
运算符被称为条件逻辑运算符。它们也被称为“短路”逻辑运算符。
因此,它们将支持逻辑短路,你可以依赖这种行为。
现在重要的是要区分条件运算符和逻辑运算符:
|
,逻辑与是&
。是的,这是有保障的。
http://msdn.microsoft.com/en-us/library/6373h346%28v=VS.80%29.aspx
条件 OR 运算符(||)对其 bool 操作数执行逻辑 OR 运算,但仅在必要时才评估其第二个操作数。
是的,这是有保证的,但是如果MyArray为null(或者MyObject显然也是如此),你仍然可能会遇到空引用异常。
仅供参考。
你说:
否则,第二部分会出现空异常。(强调我的)
实际上这是不正确的。如果短路不被保证,你可能会在第二部分得到IndexOutOfRangeException
。
如果你的MyArray
对象中的第一项实际上为null(或者表达式中的任何其他对象为null),你仍然可能会得到NullReferenceException
。
唯一完全安全的检查方法是这样的:
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)
{
//....
}
这也保证要进行短路运算。
MyArray
为空或者MyArray[0]
包含了一个空值。请看我的回答。 - Dan Tao