如果我有一个If
带有 2 个条件的语句 - 第一个条件失败,甚至会考虑第二个条件还是直接进入else
?因此,在下面的示例中,如果myList.Count == 0
, 将myString
与“值”进行比较,还是直接与else
?
if(myList.Count > 0 && myString.Equals("value"))
{
//Do something
}
else
{
//Do something else
}
如果我有一个If
带有 2 个条件的语句 - 第一个条件失败,甚至会考虑第二个条件还是直接进入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 语句将计算第一个表达式 - 如果第一个表达式为假,则不会计算第二个表达式。这对于在引用上调用方法之前检查变量是否为空很有用 - 以避免空指针异常
如果逻辑运算符是 OR (||),则 IF 语句将计算第一个表达式 - 如果第一个表达式为真,则不会计算第二个表达式。
编译器和运行时针对这种行为进行了优化
不,如果您使用,第二个条件将被跳过&&
,
如果你使用&
它会被考虑
考虑以下情况:
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 为假,也会对其进行评估。
如果您将测试更改为 &&,则仅检查第一个。
在您的示例中,仅当第一个语句失败时才会评估第二个语句。只有当两个操作数都为真时,逻辑 AND&&
才会返回,也就是短路评估。true
.NET 支持short circuiting
所以当第一个条件失败时,它不会检查第二个条件....在 C# || 和 && 是逻辑运算符的短路版本 | 和 & 分别......它通常也更快......
该表达式将从左到右进行计算,因为它是逻辑 AND 操作。如果为假,它将停止评估。它还具有表达式中操作的最大优先级。
条件与运算符 (&&) 对其布尔操作数执行逻辑与,但仅在必要时评估其第二个操作数。条件和运算符 (&&) MSDN