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中文网其他相关文章!