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」を繰り返し出力し、ラムダ式が共有変数 i への参照をキャプチャしていることを示しています。ループ中に i の値が変更された場合でも、ラムダ式は常に i の最終値 (10) を出力します。
ラムダ式で参照ではなく変数のコピーを強制的にキャプチャするには、ループ内で変数のローカル コピーを作成することが回避策の 1 つです。
<code class="language-csharp">for (int i = 0; i < 10; i++) { int copy = i; // 创建局部副本 actions.Add(() => Console.WriteLine(copy)); }</code>i の値を新しい変数コピーにコピーすることにより、ラムダ式は特定の時間およびスコープでの i の値を効果的にキャプチャします。これにより、ラムダ式がループの各反復で正しい数値を出力することが保証されます。
この動作を理解することは、C# でラムダ式を使用する場合に重要です。これにより、開発者はラムダ式が共有変数とどのように対話するかを制御でき、プログラムが期待どおりに実行されるようになります。
以上がC# Lambda でのコピーまたは参照のキャプチャ: いつどちらを選択すべきですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。