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

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

Mary-Kate Olsen
发布: 2025-02-03 07:44:16
原创
579 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板