- C#サイクルで変数をキャプチャする問題について議論する詳細 予想される出力は0、2、4、6、および8ですが、コードは予期せずに5 10を出力します。この動作の理由は、キャプチャされた変数です。すべての操作は、サイクルで変数が変化する場合、同じ例を引用します。
キャプチャ変数の問題を解決する
<code class="language-csharp">List<Action> actions = new List<Action>(); int variable = 0; while (variable < 5) { actions.Add(() => Console.WriteLine(variable * 2)); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>
この制限を克服し、各操作が独自のキャプチャ変数を持つようにするために、C#は簡単なソリューションを提供します。
variable
サイクル内のvariable
のコピーを作成することにより、各操作は独自の唯一の例をキャプチャし、ラムダ式の外側の変更がキャプチャ値に影響しないようにします。
その他の一般的な状況
この問題は、サイクル内の変数を含む他のシナリオにも表示される場合があります。これら2つのケースでは、現在のサイクルイテレーションをキャプチャするために変数のローカルコピーが必要です。
<code class="language-csharp">while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }</code>
結論variable
variable
以上がキャプチャされた変数を備えたC#ループが予期しない結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。