深入探討 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) { Console.WriteLine(act.Invoke()); }</code>
儘管預期輸出為 0、2、4、6 和 8,但代碼卻意外地輸出了五個 10。造成這種行為的原因在於捕獲的變量 variable
。所有操作都引用 variable
的同一實例,當變量在循環中發生變化時,這可能會導致不可預測的結果。
解決捕獲變量問題
為了克服此限制並允許每個操作擁有其自己的捕獲變量,C# 提供了一個簡單的解決方案:
<code class="language-csharp">while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }</code>
通過在循環內創建 variable
的副本,每個操作都捕獲其自身的唯一實例,從而確保 variable
在 lambda 表達式外部的變化不會影響捕獲的值。
其他常見情況
此問題也可能出現在涉及循環中變量的其他場景中,例如 for
和 foreach
迭代:
<code class="language-csharp">// For loop for (int i = 0; i < 5; i++) { // ... similar issue ... } // Foreach loop // ... similar issue ...</code>
在這兩種情況下,都需要變量的局部副本才能捕獲當前循環迭代。
結論
理解 C# 循環中捕獲變量的行為對於避免意外結果至關重要。本文中討論的解決方法確保每個操作都有其自己的獨立捕獲變量,從而實現可預測和預期的行為。
以上是為什麼具有捕獲變量的C#循環會產生意外的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!