当您捕获 for 循环的迭代变量时,C# 将该变量视为在循环外声明的一样。这意味着在每次迭代中捕获相同的变量。以下程序写入 333 而不是写入 012:
Action[] actions = new Action[3];
for (int i = 0; i < 3; i++)
actions [i] = () => Console.Write (i);
foreach (Action a in actions) a(); // 333
我正在阅读 C# in a Nutshell(第 5 版),今天我遇到了这个,但我无法理解它,我不明白为什么输出是 333
并且不是 012
。是不是因为要打印的 i
的值是循环之后的值?这怎么可能? i
应该在循环之后处理,不是吗?
最佳答案
变量 i
被捕获在 for
循环中,但您这样做有点扩展了它的范围。所以变量保留在它的最后状态,即 3,因此代码输出 333。
另一种编写代码的方法是这样的:
Action[] actions = new Action[3];
int i; //declare i here instead of in the for loop
for (i = 0; i < 3; i++)
actions [i] = () => Console.Write (i);
//Now i=3
foreach (Action a in actions) a(); // 333
输出和写一样:
Console.Write(i);
Console.Write(i);
Console.Write(i);
关于c# - 你如何捕获迭代变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23857448/