我一直听说 C# 使用惰性求值。因此,对于某些代码,如 if (true || DoExpensiveOperation() 将返回 true 而不执行 DoExpensiveOperation()

在一次面试中,我看到了以下问题,

static bool WriteIfTrue(bool argument)
{
    if (argument)
    {
        Console.WriteLine("argument is true!");
    }

    return argument;
}

static void Main()
{
    // 1              0                       0                 1
    WriteIfTrue((WriteIfTrue(false) & WriteIfTrue(true)) || WriteIfTrue(true));

    // 1               1                     0                      1
    WriteIfTrue((WriteIfTrue(true) || WriteIfTrue(false)) & WriteIfTrue(true));

    //  0                 0                  0                    0
    WriteIfTrue((WriteIfTrue(false) & WriteIfTrue(true)) & WriteIfTrue(false));

    // 1                1                      0                   1
    WriteIfTrue((WriteIfTrue(true) || WriteIfTrue(false)) & WriteIfTrue(true));
}

它会打印多少次“参数为真!”到屏幕?

我会说 7 是正确的答案。现在,如果我坚持编译器并运行它,它会打印 10 次!懒惰评估到底错在哪里?

最佳答案



这个评论太模糊了,我无法同意。如果你说 C# 中的 ||&& 运算符是短路的,只有在不能仅从第一个操作数确定整体结果时才评估第二个操作数,那么我同意它。延迟评估是一个更广泛的概念 - 例如,LINQ 查询使用延迟(或延迟)评估,在使用结果之前不会实际获取任何数据。

您正在使用 & operator ,它不会短路:



&& operator 短路:



& 替换为代码中任何地方的 &&,您将看到“参数为真!”打印了 8 次(不是 7 次 - 再次计算您的评论)。

关于c# - 懒惰评价不那么懒惰?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13107705/

10-10 07:55