C# では、ラムダ式は外側のスコープ内の変数をキャプチャできます。 Lambda が変数への参照をキャプチャすると、その変数への変更が Lambda に反映されます。これにより、次のコード スニペットに示すように、予期しない動作が発生する可能性があります:
<code class="language-C#">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 回出力されます。これは、Lambda 関数が変数 i
への参照をキャプチャし、for ループ内で i
がインクリメントされても、Lambda 関数は更新された値を引き続き参照するためです。
参照の代わりに変数のコピーをキャプチャするには、次の構文を使用できます:
<code class="language-C#">[=] () => { ... } // 捕获副本</code>
この例では、Lambda 関数は変数 i
のコピーをキャプチャし、外側のスコープ内の i
に対する変更は Lambda 関数に反映されません。
これは、コピーをキャプチャする方法を示す変更された例です:
<code class="language-C#">for (int i = 0; i < 10; i++) { int copy = i; // 创建一个局部副本 actions.Add(() => Console.WriteLine(copy)); }</code>
この場合、Lambda 関数は copy
の値を出力します。これは、Lambda 関数が作成されたときの i
の値のコピーです。
参照のキャプチャとコピーのキャプチャの違いを理解することで、Lambda 関数での予期しない動作を回避できます。
以上がC# Lambda Capture での参照とコピー: 予期しない動作が発生するのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。