这是一篇关于Eric Lippert的文章"不要在循环变量上使用闭包"。阅读起来很有意思,Eric解释了为什么在这段代码之后,所有的函数都会返回v中最后一个值:
var funcs = new List<Func<int>>();
foreach (var v in values)
{
funcs.Add(() => v);
}
正确的版本应该是:
foreach (var v in values)
{
int v2 = v;
funcs.Add(() => v2);
}
现在我的问题是,这些捕获的“v2”变量是如何存储的,存储在哪里。根据我对堆栈的理解,所有这些v2变量都将占用同一块内存。
我最初的想法是装箱,每个函数成员保留对装箱v2的引用。但这不能解释第一个情况。
v
被装箱一次并且引用被重复使用。但是我想看到一个更权威的答案。 - H H