首页 >后端开发 >C++ >为什么C#循环操作捕获相同的变量,如何避免这种变量?

为什么C#循环操作捕获相同的变量,如何避免这种变量?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-02-03 07:44:16580浏览

Why Do C# Loop Actions Capture the Same Variable, and How Can This Be Avoided?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn