深入探讨 C# 循环中捕获变量的问题
在 C# 中,开发人员在循环迭代中使用捕获变量时会遇到一个有趣的问题。考虑以下代码片段:
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()); }
尽管预期输出为 0、2、4、6 和 8,但代码却意外地输出了五个 10。造成这种行为的原因在于捕获的变量 variable
。所有操作都引用 variable
的同一实例,当变量在循环中发生变化时,这可能会导致不可预测的结果。
解决捕获变量问题
为了克服此限制并允许每个操作拥有其自己的捕获变量,C# 提供了一个简单的解决方案:
while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }
通过在循环内创建 variable
的副本,每个操作都捕获其自身的唯一实例,从而确保 variable
在 lambda 表达式外部的变化不会影响捕获的值。
其他常见情况
此问题也可能出现在涉及循环中变量的其他场景中,例如 for
和 foreach
迭代:
// For loop for (int i = 0; i < 5; i++) { // ... similar issue ... } // Foreach loop // ... similar issue ...
在这两种情况下,都需要变量的局部副本才能捕获当前循环迭代。
结论
理解 C# 循环中捕获变量的行为对于避免意外结果至关重要。本文中讨论的解决方法确保每个操作都有其自己的独立捕获变量,从而实现可预测和预期的行为。
以上是为什么具有捕获变量的C#循环会产生意外的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!