Kav*_*ian 46 c# foreach closures for-loop c#-5.0
这在C#5.0中正常工作(按预期方式):
var actions = new List<Action>();
foreach (var i in Enumerable.Range(0, 10))
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var act in actions) act();
Run Code Online (Sandbox Code Playgroud)
打印0到9.但是这个显示10次10次:
var actions = new List<Action>();
for (var i = 0; i < 10; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var act in actions) act();
Run Code Online (Sandbox Code Playgroud)
问题:这是我们在5.0之前的C#版本中遇到的问题; 所以我们不得不使用一个循环局部占位符来进行闭包,它现在已经修复了 - 在C#5.0中 - 在"foreach"循环中.但不是"for"循环!
这背后的原因是什么(也没有解决for循环问题)?
Jon*_*eet 44
这背后的原因是什么?
我会假设你的意思是"为什么for循环也没有改变?"
答案是,对于for循环,现有的行为非常有意义.如果你打破一个for循环:
...然后循环大致是:
{
initializer;
while (condition)
{
body;
iterator;
}
}
Run Code Online (Sandbox Code Playgroud)
(当然,除了iterator在continue;声明结尾处执行.)
初始化部分逻辑上只发生一次,因此只有一个"变量实例化"完全符合逻辑.此外,有一个在每次循环迭代变量的不自然的"初始"值-有什么可说的,一个for循环已经成为一种形式,初始化变量声明,在条件测试,并在迭代器修改它.您期望像这样的循环做什么:
for (int i = 0, j = 10; i < j; i++)
{
if (someCondition)
{
j++;
}
actions.Add(() => Console.WriteLine(i, j));
}
Run Code Online (Sandbox Code Playgroud)
将它与一个foreach循环相比较,看起来你正在为每次迭代声明一个单独的变量.哎呀,变量是只读的,这使得它更奇怪地认为它是一个在迭代之间变化的变量.将foreach循环视为在每次迭代中声明一个新的只读变量并将其值从迭代器中获取是完全合理的.