首页 > 后端开发 > C++ > 为什么我的c#循环捕获错误的变量值?

为什么我的c#循环捕获错误的变量值?

Susan Sarandon
发布: 2025-02-03 07:59:09
原创
908 人浏览过

Why Does My C# Loop Capture the Wrong Variable Value?

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)
{
    act.Invoke();
}
登录后复制

与预期相反,这段代码打印五个“10”,而不是预期的序列0、2、4、6、8。

问题:循环中的捕获变量

问题出现在循环内创建的所有lambda函数都捕获同一个变量variable。因此,当这些函数在循环外部调用时,它们都引用variable的最终值。

解决方案:副本救援

为了解决这个问题,你需要在循环内创建变量的副本,然后在每个lambda函数中捕获它:

while (variable < 5)
{
    int copy = variable;
    actions.Add(() => Console.WriteLine(copy * 2));
    ++variable;
}
登录后复制

通过创建副本,循环内创建的每个闭包都将捕获它自己variable的唯一值,从而产生预期的输出。

注意事项

请注意,此技术也适用于for和foreach循环,其中在多个迭代中引用单个变量。为了避免这个问题,建议遵守C# 5编译器对foreach循环的处理方式,这确保每次迭代都有其自己的捕获变量。

以上是为什么我的c#循环捕获错误的变量值?的详细内容。更多信息请关注PHP中文网其他相关文章!

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