首頁 >後端開發 >C++ >為什麼 Lambda 表達式會捕捉迭代變數的最終值?

為什麼 Lambda 表達式會捕捉迭代變數的最終值?

Barbara Streisand
Barbara Streisand原創
2025-01-14 12:26:43431瀏覽

Why Do Lambda Expressions Capture the Final Value of Iteration Variables?

Lambda表達式中使用迭代變數的潛在陷阱

在程式設計領域,Lambda表達式提供了一種簡潔的方式來表示匿名函數。然而,在Lambda表達式中使用迭代變數可能會導致意想不到的結果。

考慮以下程式碼:

<code class="language-c#">List<Action> actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
    actions.Add(() => Console.WriteLine(i));
}

foreach (Action action in actions)
{
    action();
}</code>

這段程式碼無意間將所有Lambda表達式與同一個迭代變數i關聯起來。因此,當每個Lambda表達式執行時,它引用的是i的最終值,而不是Lambda創建時i的預期值。

結果,輸出可能與預期不符。程式碼並非像預期的那樣列印0到9,而是列印十次10。值得注意的是,這種行為源自於所有涉及的委託都捕捉了單一變數。

為了避免這種意想不到的結果,建議在循環內創建一個局部變量,並將迭代變量的值賦給它。這樣,每個Lambda表達式都引用一個不同的局部變量,確保它保留預期的值。 修改後的程式碼如下:

<code class="language-c#">List<Action> actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
    int temp = i; // 创建局部变量
    actions.Add(() => Console.WriteLine(temp));
}

foreach (Action action in actions)
{
    action();
}</code>

透過這種方式,每個Lambda表達式都會捕獲一個獨立的temp變量,從而避免了變量值被覆蓋的問題,最終輸出將正確地顯示0到9。

以上是為什麼 Lambda 表達式會捕捉迭代變數的最終值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn