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

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

Susan Sarandon
Susan Sarandon原创
2025-02-03 07:59:09841浏览

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

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

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