首頁 > 後端開發 > C++ > 為什麼循環中的 Lambda 表達式會產生意外結果?

為什麼循環中的 Lambda 表達式會產生意外結果?

Linda Hamilton
發布: 2025-01-14 11:26:46
原創
743 人瀏覽過

Why Do Lambda Expressions in Loops Produce Unexpected Results?

Lambda 表達式與循環迭代變數:一個潛在的陷阱

通常不鼓勵在 lambda 表達式中直接使用循環迭代變數。 由於 lambda 表達式處理變數捕獲的方式,這種做法可能會產生意想不到的結果。

Lambda 表達式擷取對變數的引用,而不是捕獲時的值。 因此,當循環迭代時,循環內建立的 lambda 表達式都會引用相同的、不斷變化的迭代變數。 這導致所有 lambda 在循環完成後最終使用變數的 final 值,而不是建立每個 lambda 時的值。

讓我們用 VB.NET 範例來說明這一點:

1

2

3

4

5

6

7

8

9

<code class="language-vb.net">Dim actions = new List(Of Action)()

 

For i As Integer = 0 To 9

    actions.Add(New Action(Function() Console.WriteLine(i)))

Next

 

For Each action As Action In actions

    action()

End For</code>

登入後複製

您可能會期望它會列印 0 到 9。相反,它打印 10 十次!這是因為 Action 列表中的每個 actions 都引用相同的 i,並且當第二個循環執行時,i 已經達到其最終值 10。

當循環體具有影響 lambda 表達式引用的變數的副作用時,問題就會放大。 這可能會導致難以調試的不一致。

解決方案:建立本機副本

為了防止這種情況發生,請在循環內建立迭代變數的本機副本:

1

2

3

4

5

6

7

8

9

10

<code class="language-vb.net">Dim actions = new List(Of Action)()

 

For i As Integer = 0 To 9

    Dim localI As Integer = i ' Create a local copy

    actions.Add(New Action(Function() Console.WriteLine(localI)))

Next

 

For Each action As Action In actions

    action()

End For</code>

登入後複製

現在,每個 lambda 表達式都會捕獲一個唯一的 localI 變量,並在創建時保存其值。 輸出將正確地為 0 到 9。這個簡單的變更可確保每個 lambda 使用自己獨立的值進行操作,避免意外行為。

以上是為什麼循環中的 Lambda 表達式會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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