短路声明评估 - 这是保证吗?[C#]

lar*_*ryq 16 c# conditional-operator short-circuiting logical-operators

这里有关于C#中的短路语句的快速问题.使用if语句:

if (MyObject.MyArray.Count == 0 || MyObject.MyArray[0].SomeValue == 0)
{

//....
}
Run Code Online (Sandbox Code Playgroud)

是否保证评估将在"MyArray.Count"部分之后停止,前提是该部分为真?否则我将在第二部分得到一个空例外.

And*_*are 34

是的,这是有保证的.

C#语言规范 - 7.11条件逻辑运算符:

&&||运营商被称为条件逻辑运算符.它们也被称为"短路"逻辑运算符.

因此,他们将根据定义支持逻辑短路- 您可以依赖此行为.

现在重要的是区分条件运算符和逻辑运算符:

  • 只有条件运算符支持短路,逻辑运算符则不支持.
  • C#的逻辑运算符看起来就像它们的条件对应物,但是少了一个字符,所以逻辑OR是|逻辑AND &.
  • 逻辑运算符可以重载但条件运算符不能(这有点技术性,因为条件运算符求值确实涉及重载解析,并且此重载解析可以解析为类型逻辑运算符的自定义重载,因此您可以将此限制解决为在某种程度上).


Bry*_*tts 12

是的,它是有保证的.

http://msdn.microsoft.com/en-us/library/6373h346%28v=VS.80%29.aspx

条件OR运算符(||)执行其bool操作数的逻辑或,但仅在必要时才计算其第二个操作数.


kem*_*002 5

是的,它是有保证的,但是如果MyArray为null(或者显然是MyObject),你仍然可以得到一个空引用异常.