为什么在lambda表达式中使用迭代变量是不好的

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

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

我知道这意味着什么,我可以轻松修复它,而不是一件大事。
但我想知道为什么在lambda中使用迭代变量是一个坏主意?
我以后可能会导致什么问题?


考虑这个代码:

List<Action> actions = new List<Action>();

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有更复杂的规则,因为变量在迭代中保持其值。 Jared Parsons的这篇文章给出了一些有关困难的信息 - 虽然它从2007年开始回归,但实际行为可能从那时起就发生了变化。


假设你的意思是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

链接地址: http://www.djcxy.com/p/52785.html

上一篇: Why is it bad to use an iteration variable in a lambda expression

下一篇: Starting Tasks In foreach Loop Uses Value of Last Item