当前位置:  开发笔记 > 编程语言 > 正文

为什么在lambda表达式中使用迭代变量很糟糕

如何解决《为什么在lambda表达式中使用迭代变量很糟糕》经验,为你挑选了2个好方法。

我只是写了一些快速代码并注意到这个编译器错误

在lambda表达式中使用迭代变量可能会产生意外结果.
相反,在循环中创建一个局部变量并为其分配迭代变量的值.

我知道这意味着什么,我可以很容易地解决它,而不是什么大不了的事.
但我想知道为什么在lambda中使用迭代变量是个坏主意?
我以后可能会遇到什么问题?



1> Jon Skeet..:

考虑以下代码:

List actions = new List();

for (int i = 0; i < 10; i++)
{
    actions.Add(() => Console.WriteLine(i));
}

foreach (Action action in actions)
{
    action();
}

您希望打印什么?显而易见的答案是0 ... 9 - 但实际上它打印10次,10次.这是因为只有一个变量被所有代表捕获.这种行为是出乎意料的.

编辑:我刚刚看到你在谈论VB.NET而不是C#.我相信VB.NET有更复杂的规则,因为变量在迭代中保持其值的方式.贾里德帕森斯的这篇文章提供了一些有关所涉及的困难的信息 - 虽然它是从2007年开始的,但实际行为可能已经发生了变化.


@BertuPG:你想到的两个词中哪一个?;)
用两个词来说:lambda在循环时没有必要进行评估,当它们被调用时,迭代变量可能超出范围,未分配或者具有最终值(甚至超出循环限制).
我闻到了一个面试问题.:-)

2> Greg Beech..:

假设你在这里意味着C#.

这是因为编译器实现闭包的方式.使用迭代变量可能会导致访问修改后的闭包有问题(请注意,我说"不能"会导致问题,因为有时根据方法中的其他内容不会发生,有时您实际上想要访问修改后的闭包).

更多信息:

http://blogs.msdn.com/abhinaba/archive/2005/10/18/482180.aspx

更多信息:

http://blogs.msdn.com/oldnewthing/archive/2006/08/02/686456.aspx

http://blogs.msdn.com/oldnewthing/archive/2006/08/03/687529.aspx

http://blogs.msdn.com/oldnewthing/archive/2006/08/04/688527.aspx

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有