Ash*_*ohn 5 c# foreach closures c#-4.0
考虑这段代码.
var values = new List<int> {123, 432, 768};
var funcs = new List<Func<int>>();
values.ForEach(v=>funcs.Add(()=>v));
funcs.ForEach(f=>Console.WriteLine(f()));//prints 123,432,768
funcs.Clear();
foreach (var v1 in values)
{
funcs.Add(()=>v1);
}
foreach (var func in funcs)
{
Console.WriteLine(func()); //prints 768,768,768
}
Run Code Online (Sandbox Code Playgroud)
我知道由于lambda捕获的闭包变量,第二个foreach打印768次3次.为什么在第一种情况下不会发生?foreach关键字如何与方法不同Foreach?当我这样做时,表达式是否被评估?values.ForEach
小智 9
foreach只介绍一个变量.虽然lambda参数变量在每次调用时都是"新鲜的".
与之比较:
foreach (var v1 in values) // v1 *same* variable each loop, value changed
{
var freshV1 = v1; // freshV1 is *new* variable each loop
funcs.Add(() => freshV1);
}
foreach (var func in funcs)
{
Console.WriteLine(func()); //prints 123,432,768
}
Run Code Online (Sandbox Code Playgroud)
那是,
foreach (T v in ...) { }
Run Code Online (Sandbox Code Playgroud)
可以被认为是:
T v;
foreach(v in ...) {}
Run Code Online (Sandbox Code Playgroud)
快乐的编码.
所不同的是,在foreach循环中,你有一个单一的变量v1被抓获.该变量接受每个值values- 但你只是在最后使用它...这意味着我们每次只看到最终值.
在您的List<T>.ForEach版本中,每次迭代都会引入一个新变量(参数f) - 因此每个lambda表达式都捕获一个单独的变量,该变量的值永远不会改变.
Eric Lippert在博客中发表过这篇文章 - 但请注意,这种行为可能会在未来版本的C#中发生变化.
| 归档时间: |
|
| 查看次数: |
635 次 |
| 最近记录: |