【发布时间】:2010-12-17 09:23:30
【问题描述】:
这是基于 Eric Lippert 的文章 "Closing over the loop variable considered harmful" 提出的问题。
这是一本好书,Eric 解释了为什么在这段代码之后所有 func 都会返回 v 中的 last 值:
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 变量都将占用同一块内存。
我的第一个想法是装箱,每个 func 成员都保留对装箱 v2 的引用。但这并不能解释第一种情况。
【问题讨论】:
-
好的,在阅读了我自己的问题后,我想它会被解释为:在第一个版本中,
v被装箱一次,并且引用被重新使用。但我希望看到更权威的答案。