c# - foreach 和 list.ForEach() 之间的闭包有何不同?

标签 c# c#-4.0 foreach closures

考虑这段代码。

        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
        } 

我知道由于 lambda 捕获的闭包变量,第二个 foreach 打印了 768 3 次。为什么第一种情况不会发生?foreach 关键字与方法Foreach 有何不同?是因为当我执行 values.ForEach

时表达式被求值了吗

最佳答案

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
}

也就是说,

foreach (T v in ...) { }

可以认为是:

T v;
foreach(v in ...) {}

快乐编码。

关于c# - foreach 和 list.ForEach() 之间的闭包有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7133816/

相关文章:

c# - 在 Windows 服务中模拟用户

c++ - C++ 中的 clr 托管 - 程序集路径

c# - 格式字符串 "yyyyMMdd"到 "dd/MM/yyyy"来自 List c# .Net 4

c# - 使用 foreach 循环和 XmlNodeList C# 将新节点附加到节点列表

javascript - array.forEach.call 与 array.map.call

c++ - "for each"是否保证可以与更改数组一起使用?

c# - 在 SQL 数据库中插入 Datetimepicker 文本

c# - 启用迁移时出错

c# - 比较两个 List<T> 的最有效方法

c# - ReactiveUI命令退订