如果我有一个具有两个条件的If
语句,而第一个条件失败,是否会考虑第二个条件,或者直接进入else
?那么,在下面的例子中,如果myList.Count == 0
,myString
会与"值"进行比较吗?还是直接与else
进行比较?
if(myList.Count > 0 && myString.Equals("value"))
{
//Do something
}
else
{
//Do something else
}
它将停止求值,因为您使用的是双&;操作人员这被称为短路。
如果您将其更改为单安培数:
if(myList.Count > 0 & myString.Equals("value"))
它将对两者进行评估。
否,不考虑。(这被称为短路。)
编译器足够聪明(也是语言规范所要求的),知道如果第一个条件是false
,就没有办法将表达式求值为true
。
正如Jacob针对||
指出的那样,当第一个条件是true
时,将不会评估第二个条件。
如果逻辑运算符为AND(&&),则If语句将计算第一个表达式-如果第一个表达式为false,则不会计算第二个表达式。这对于在调用引用上的方法之前检查变量是否为null非常有用,以避免出现null指针异常
若逻辑运算符为OR(||),则If语句将计算第一个表达式——若第一个表达式为true,则不计算第二个表达式。
编译器和运行时针对这种行为进行了优化
否,如果使用&&
、,将跳过第二个条件
如果您使用&
,它将被视为
考虑以下内容:
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为false,也会被规避。
如果您将测试更改为&;只检查了第一个。
在您的示例中,只有当第一个语句失败时,才会评估第二个语句。逻辑AND &&
仅在两个操作数均为true时返回true
,也称为短路评估。
.NET支持short circuiting
,因此当第一个条件失败时,它不会检查第二个条件。。。。在C#||和&;是逻辑运算符|和&分别地它通常也更快。。。
表达式将从左到右求值,因为它是一个逻辑AND运算。如果为false,将停止评估。它还具有表达式中运算的最高优先级。
条件AND运算符(&&)对其布尔操作数执行逻辑AND,但仅在必要时计算其第二个操作数。条件和运算符(&&)MSDN
下面是一组部分,列出了从最高优先级到最低优先级的C#运算符。