Jon*_*eet 51
考虑以下代码:
List<Action> actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (Action action in actions)
{
action();
}
Run Code Online (Sandbox Code Playgroud)
您希望打印什么?显而易见的答案是0 ... 9 - 但实际上它打印10次,10次.这是因为只有一个变量被所有代表捕获.这种行为是出乎意料的.
编辑:我刚刚看到你在谈论VB.NET而不是C#.我相信VB.NET有更复杂的规则,因为变量在迭代中保持其值的方式.贾里德帕森斯的这篇文章提供了一些有关所涉及的困难的信息 - 虽然它是从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