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

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

Barbara Streisand
發布: 2025-01-14 12:26:43
原創
393 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板