53

如果我有一个If带有 2 个条件的语句 - 第一个条件失败,甚至会考虑第二个条件还是直接进入else?因此,在下面的示例中,如果myList.Count == 0, 将myString与“值”进行比较,还是直接与else

if(myList.Count > 0 && myString.Equals("value"))
{
//Do something
}
else
{
//Do something else
}
4

8 回答 8

95

它将停止评估,因为您使用的是双 && 运算符。这称为短路

如果将其更改为单个 & 符号:

if(myList.Count > 0 & myString.Equals("value"))

它会评估两者。

于 2012-07-06T08:31:15.607 回答
23

不,不会考虑。(这称为短路。)

编译器足够聪明(并且语言规范要求)知道如果第一个条件是false,则表达式将无法计算为true

正如 Jacob 所指出的||,当第一个条件为 时true,将不会评估第二个条件。

于 2012-07-06T08:29:03.260 回答
7

如果逻辑运算符是 AND (&&),那么 IF 语句将计算第一个表达式 - 如果第一个表达式为假,则不会计算第二个表达式。这对于在引用上调用方法之前检查变量是否为空很有用 - 以避免空指针异常

如果逻辑运算符是 OR (||),则 IF 语句将计算第一个表达式 - 如果第一个表达式为真,则不会计算第二个表达式。

编译器和运行时针对这种行为进行了优化

于 2012-07-06T08:32:35.270 回答
4

不,如果您使用,第二个条件将被跳过&&

如果你使用&它会被考虑

于 2012-07-06T08:29:55.523 回答
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 为假,也会对其进行评估。

如果您将测试更改为 &&,则仅检查第一个。

于 2012-07-06T08:36:53.417 回答
1

在您的示例中,仅当第一个语句失败时才会评估第二个语句。只有当两个操作数都为真时,逻辑 AND&&才会返回,也就是短路评估true

于 2012-07-06T08:30:54.217 回答
1

.NET 支持short circuiting所以当第一个条件失败时,它不会检查第二个条件....在 C# || 和 && 是逻辑运算符的短路版本 | 和 & 分别......它通常也更快......

于 2012-07-06T08:34:53.330 回答
0

该表达式将从左到右进行计算,因为它是逻辑 AND 操作。如果为假,它将停止评估。它还具有表达式中操作的最大优先级。

条件与运算符 (&&) 对其布尔操作数执行逻辑与,但仅在必要时评估其第二个操作数。条件和运算符 (&&) MSDN

下面是一组部分,列出了从最高优先级到最低优先级的 C# 运算符

于 2017-08-22T19:05:22.510 回答