質問:サイクルのキャプチャ変数
List<Action> actions = new List<Action>(); int variable = 0; while (variable < 5) { actions.Add(() => Console.WriteLine(variable * 2)); ++variable; } foreach (var act in actions) { act.Invoke(); }
サイクルで作成されたすべてのラムダ関数は、同じ変数
をキャプチャします。したがって、これらの関数が外部と呼ばれる場合、それらはすべての最終値を引用します。
<决>解決策:救助をコピーvariable
この問題を解決するには、サイクル内の変数のコピーを作成してから、各ラムダ関数でキャプチャする必要があります。
variable
一意の値をキャプチャし、それにより予想される出力を生成します。 <事>予防策
このテクノロジーは、複数の反復の単一変数を参照するforおよびforeachサイクルにも適用できます。この問題を回避するには、foreachサイクルのC#5コンパイラの処理方法に従うことをお勧めします。これにより、各反復に独自のキャプチャ変数が保証されます。
while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }
以上がC#ループが間違った変数値をキャプチャするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。