C# ラムダ式での参照キャプチャの防止
C# ラムダ式は、デフォルトで変数を参照によってキャプチャします。 これは、ラムダ式が元の変数へのポインタを維持し、ラムダの作成後にその変数に加えられた変更がラムダの実行時に反映されることを意味します。
この動作を示す例は次のとおりです。
<code class="language-csharp">class Program { delegate void Action(); static void Main(string[] args) { List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) actions.Add(() => Console.WriteLine(i)); foreach (Action a in actions) a(); } }</code>
このコードを実行すると、「10」が 10 回表示されます。 これは、各ラムダが single i
変数への参照をキャプチャし、ループが終了するまでにその値が 10 になるために発生します。
この参照キャプチャを回避し、各ラムダがループ変数の値の独自のコピーを確実に取得できるようにするには、ループ内にローカル コピーを作成します。
<code class="language-csharp">for (int i = 0; i < 10; i++) { int copy = i; // Create a local copy actions.Add(() => Console.WriteLine(copy)); }</code>
各ラムダは個別の copy
変数をキャプチャし、作成時の値を保持します。出力には 0 ~ 9 の数字が正しく表示されます。
他の言語 (C など) とは異なり、C# はラムダ式の構文自体内で参照や値のキャプチャを明示的に指定する直接的なメカニズムを提供していないことを理解することが重要です。 ローカル コピーの作成は、値を取得するセマンティクスを実現するための標準的な回避策です。
以上がC# でラムダ式が参照をキャプチャしないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。