gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:12:46 32 4
gpt4 key购买 nike

考虑这段代码。

        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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com