如果我有If
语句有2个条件 - 第一个失败,第二个条件是否会被考虑,还是会直接进入else
?因此,在以下示例中,如果myList.Count == 0
,将myString
与“值”进行比较,还是直接与else
进行比较?
if(myList.Count > 0 && myString.Equals("value"))
{
//Do something
}
else
{
//Do something else
}
答案 0 :(得分:78)
它会停止评估,因为你正在使用双&符号&&运营商。这称为short-circuiting。
如果您将其更改为单个&符号:
if(myList.Count > 0 & myString.Equals("value"))
它会评估两者。
答案 1 :(得分:20)
不,它不会被考虑。 (这称为short circuiting。)
编译器足够聪明(并且语言规范要求)知道如果第一个条件是false
,则表达式无法计算为true
。
正如雅各布指出||
,当第一个条件是true
时,第二个条件将不会被评估。
答案 2 :(得分:7)
如果逻辑运算符是AND(&&),则IF语句将评估第一个表达式 - 如果第一个表达式为false,则不会计算第二个表达式。这对于在引用上调用方法之前检查变量是否为空非常有用 - 以避免空指针异常
如果逻辑运算符是OR(||),则IF语句将评估第一个表达式 - 如果第一个表达式为真,则不会计算第二个表达式。
编译器和运行时针对此行为进行了优化
答案 3 :(得分:4)
不,如果您使用&&
,
如果您使用&
,则会将其视为
答案 4 :(得分:2)
考虑下面的内容:
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是假的,也会被评估。
如果您将测试更改为&&只检查了第一个。
答案 5 :(得分:1)
在您的示例中,仅在第一个语句失败时才会评估第二个语句。当两个操作数都为真时,逻辑AND &&
将仅返回true
,即短路评估。
答案 6 :(得分:1)
.NET支持short circuiting
所以当第一个条件失败时,它不会检查第二个条件....在C#||和&&是逻辑运算符的短路版本和&分别......它通常也更快......
答案 7 :(得分:0)
表达式将从左到右进行计算,因为它是一个逻辑AND操作。如果为false,则会停止评估。它还具有表达式中操作的最高优先级。
条件AND运算符(&&)执行其bool操作数的逻辑AND,但仅在必要时才计算其第二个操作数。 Conditional And Operator (&&) MSDN
这是一组sections listing the C# operators starting with the highest precedence to the lowest。