IF声明是否会停止评估,如果它不符合第一个条件?
如果我有一个有两个条件的If
语句 – 第一个失败,第二个条件是否会被考虑,或者是否会直接转到else
? 因此,在下面的例子中,如果myList.Count == 0
, myString
会与“value”进行比较,还是会直接转到else
?
if(myList.Count > 0 && myString.Equals("value")) { //Do something } else { //Do something else }
它将停止评估,因为你正在使用&&操作符。 这被称为短路 。
如果你改变它
if(myList.Count > 0 & myString.Equals("value"))
它会评估两者。
不,它不会被考虑。 (这就是所谓的短路 。)
编译器足够聪明(并且需要通过语言规范)来知道如果第一个条件是false
,就没有办法将expression式评估为true
。
正如雅各指出的那样 当第一个条件true
,第二个条件将不被评估。
如果逻辑运算符是AND(&&),那么IF语句将评估第一个expression式 – 如果第一个expression式为假,则不会评估第二个expression式。 这对于在引用上调用方法之前检查variables是否为空是有用的 – 以避免空指针exception
如果逻辑运算符是OR(||),那么IF语句将评估第一个expression式 – 如果第一个expression式为真,则不会评估第二个expression式。
编译器和运行时针对此行为进行了优化
不,第二个条件会被跳过,如果你使用&&
,
如果您使用&
将被考虑
考虑以下内容:
static int? x; static int? y; static void Main(string[] args) { x = 5; if (testx() & testy()) { Console.WriteLine("test"); } } static Boolean testx() { return x == 3; } static Boolean testy() { return y == 10; }
如果你通过testx和testy函数的追踪,即使testx是错误的也会被忽略。
如果您将testing更改为&&只有第一个被选中。
在你的例子中,第二个语句只有在第一个语句失败时才会被评估。 逻辑AND &&
只有在两个操作数都为真时才返回true,也就是短路评估 。
.NET支持short circuiting
所以当第一个条件失败时,它不会检查第二个条件….在C#中 &&是逻辑运算符|的短路版本 和&分别….它通常也更快…
expression式将从左到右进行评估,因为它是一个逻辑与运算。 如果错误,将停止评估。 在你的expression中,它也是最重要的操作。
条件AND运算符(&&)执行其bool操作数的逻辑与,但只在必要时评估其第二个操作数。 有条件和运算符(&&) MSDN
以下是一组列出从最高优先级到最低优先级的C#运算符的部分 。