簡體   English   中英

懶評估不那么懶?

[英]Lazy Evaluation not so Lazy?

我一直聽說 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));
}

它會打印多少次“argument is true!” 到屏幕上?

我會說7是正確的答案。 現在,如果我堅持使用編譯器並運行它,它會打印10次! 懶惰的評價到底哪里出錯了?

我一直聽說 C# 使用惰性求值。

這對我來說太模糊了,無法同意。 如果你說|| C# 中的&&運算符是短路的,如果不能僅從第一個操作數確定總體結果,則僅評估第二個操作數,那么我同意它。 惰性求值是一個更廣泛的概念——例如,LINQ 查詢使用惰性(或延遲)求值,在使用結果之前實際上並不獲取任何數據。

您正在使用&運算符,它不是短路的:

& 運算符會評估兩個運算符,而不管第一個運算符的值如何。

&&運算符正在短路:

運算x && y對應於運算x & y ,只是如果x為假,則不計算y ,因為無論y的值是多少,AND 運算的結果都是假的。

在你的代碼中用&&替換& ,你會看到“argument is true!” 打印 8 次(不是 7 - 再次計算您的評論)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM