在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」奇怪行爲是期望行爲的案例。 –