C#循環中的變量捕獲
在C#中,定義循環內的操作時,務必注意變量捕獲的行為。默認情況下,所有操作都捕獲同一個變量,導致調用時輸出結果與預期不符。
請考慮以下示例:
<code class="language-csharp">List<Action> actions = new List<Action>(); int variable = 0; while (variable < 5) { actions.Add(() => Console.WriteLine(variable * 2)); ++variable; } foreach (var act in actions) { act.Invoke(); }</code>
這段代碼的預期輸出是0、2、4、6和8。然而,實際輸出卻是五個10。這是因為所有操作都引用同一個被捕獲的變量variable
,該變量在循環中被更新。調用時,所有操作都具有相同的值10。
為了避免這個問題並確保每個操作實例都有其自己的被捕獲變量,需要在循環內復制該變量:
<code class="language-csharp">while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }</code>
通過創建變量的局部副本,每個操作都捕獲其自身唯一的值,從而得到預期的輸出0、2、4、6、8。
這種變量捕獲的概念對於理解C#中閉包的行為至關重要。在循環內定義操作時,務必考慮變量的生命週期及其可訪問性。
以上是為什麼C#循環操作捕獲相同的變量,如何避免這種變量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!