これは、Eric Lippertの記事"Closing over the loop variable considered harmful"に基づく質問です。How?クローズオーバー変数はどこに格納されていますか?
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);
}
エリックは、コードのこの部分の後にすべてのfuncsをvに最後値を返しますなぜ良いの読み取りを説明しています私の質問は、どのようにして 'v2'の変数が保存されているのかということです。スタックの私の理解では、それらのすべてのv2変数は、同じメモリを占有するでしょう。
私の最初の考えはボクシングでした、各funcメンバーはボックス化されたv2への参照を保持していました。しかし、それは最初のケースを説明しません。
OK、私自身の質問を読んだ後、私はそれが最初のバージョンでは 'v'が1回boxedされ、リファレンスが再利用されることで説明されると思います。しかし、もっと権威ある答えを見たいと思っています。 –