在C#中试用闭包时,我发现如果它们在循环中捕获迭代器变量,它们会意外地工作。在for和foreach循环中闭包的行为不同
var actions = new List<Action>();
foreach (int i in new[] { 1, 2 })
actions.Add(() => Console.WriteLine(i));
for (int i = 3; i <= 4; i++)
actions.Add(() => Console.WriteLine(i));
foreach (var action in actions)
action();
以上代码生成一个奇怪结果(我使用.NET 4.5编译器):
1
2
5
5
为什么的i
值捕获不同2个几乎相同的循环?
你注意到这个微妙的区别是聪明的。是的,这里有一个危险,有人可以重构一个foreach到一个for,并没有意识到他们正在引入语义变化!我很有兴趣知道,如果您对“for”案件有“真实世界”使用案例,特别是“for”奇怪行为是期望行为的案例。 –