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>
與預期相反,這段代碼打印五個“10”,而不是預期的序列0、2、4、6、8。
問題:循環中的捕獲變量
問題出現在循環內創建的所有lambda函數都捕獲同一個變量variable
。因此,當這些函數在循環外部調用時,它們都引用variable
的最終值。
解決方案:副本救援
為了解決這個問題,你需要在循環內創建變量的副本,然後在每個lambda函數中捕獲它:
<code class="language-csharp">while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }</code>
通過創建副本,循環內創建的每個閉包都將捕獲它自己variable
的唯一值,從而產生預期的輸出。
注意事項
請注意,此技術也適用於for和foreach循環,其中在多個迭代中引用單個變量。為了避免這個問題,建議遵守C# 5編譯器對foreach循環的處理方式,這確保每次迭代都有其自己的捕獲變量。
以上是為什麼我的c#循環捕獲錯誤的變量值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!