首页 >后端开发 >C++ >为什么c#lambda循环中的表达式捕获相同的变量,如何解决?

为什么c#lambda循环中的表达式捕获相同的变量,如何解决?

Barbara Streisand
Barbara Streisand原创
2025-02-03 07:46:13294浏览

Why Do C# Lambda Expressions in Loops Capture the Same Variable, and How Can This Be Resolved?

理解c#lambda表达式捕获及其解决方案

> 环路中的

c#lambda表达式表现出一个常见的陷阱:它们捕获相同的变量,从而导致意外结果。 之所以发生这种情况,是因为lambda表达式在创建时不会捕获变量的 value ,而是捕获变量本身的参考。 考虑此示例: 代码输出五个8s,而不是预期输出(0、2、4、6、8),而不是预期输出(0、2、4、6、8)。这是因为所有lambda表达式参考

>的
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>();

int variable = 0;
while (variable < 5)
{
    actions.Add(() => variable * 2);
    ++variable;
}

foreach (var act in actions)
{
    Console.WriteLine(act.Invoke());
}</code>
最终

的值(循环完成后10个),而不是在创建每个lambda时其值。>>>>>> >解决方案:创建复制variable

为了解决此问题,在每个迭代中创建一个循环变量的副本:>

现在,每个lambda表达式都会捕获一个独特的变量,从而产生正确的输出。

c#5及以后: 在C#5及更高版本中,

循环的行为已更改以解决此问题。 编译器使用“闭合分配临时变量”(CATV)自动为每次迭代创建一个单独的变量,从而消除了对手动副本的需求。 这种简化使代码更清洁,更可读。 但是,

循环示例仍然需要明确的副本。
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>();

int variable = 0;
while (variable < 5)
{
    int copy = variable; // Create a copy
    actions.Add(() => copy * 2);
    ++variable;
}</code>
>

以上是为什么c#lambda循环中的表达式捕获相同的变量,如何解决?的详细内容。更多信息请关注PHP中文网其他相关文章!

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