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