理解c#lambda表达式捕获及其解决方案
> 环路中的c#lambda表达式表现出一个常见的陷阱:它们捕获相同的变量,从而导致意外结果。 之所以发生这种情况,是因为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中文网其他相关文章!