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