変数キャプチャは C# クロージャの重要な側面であり、これにより、囲んでいる関数が周囲のスコープ内の変数にアクセスして操作できるようになります。このドキュメントでは、値の型や参照型への影響、ボックス化操作の不在など、変数キャプチャの仕組みについて詳しく説明します。
一般に信じられていることに反して、変数キャプチャは単なる「コンパイラの魔法」の結果ではありません。 C# は、ストラテジー メカニズムを使用して、クロージャ用の一時ヘルパー クラスを作成します。周囲のスコープからキャプチャされた各変数には、このヘルパー クラスのフィールドが割り当てられます。次に、クロージャはこのヘルパー クラスへの参照を保持し、それによって、その存続期間中にキャプチャされた変数にアクセスします。
値型と参照型は同じ方法でキャプチャされます。キャプチャされた値は、その型に関係なく、実際の変数そのものです。たとえば、提供されたコード内の整数カウンターは、ヘルパー クラスの int フィールドとしてキャプチャされます。
他のプログラミング言語とは異なり、C# は値の型をキャプチャするときにボックス化を実行しません。代わりに、キャプチャされた値はヘルパー クラスのフィールドに直接保存されます。このボックス化の欠如により、管理メモリに関連するオーバーヘッドが排除され、効率的なクロージャー操作が保証されます。
変数キャプチャのプロセスを説明するために、ラムダ式を使用して単一の変数をキャプチャするシナリオを考えてみましょう。
<code class="language-c#">using System; class Test { static void Main() { Action action = CreateShowAndIncrementAction(); action(); action(); } static Action CreateShowAndIncrementAction() { Random rng = new Random(); int counter = rng.Next(10); Console.WriteLine("Initial value for counter: {0}", counter); return () => { Console.WriteLine(counter); counter++; }; } }</code>
この例では、ラムダ式は周囲のメソッドからカウンター変数を取得します。ラムダが呼び出されると、ヘルパー クラス インスタンスを通じてキャプチャされた counter の値にアクセスします。これにより、ラムダがカウンター変数を変更できるようになり、それを囲んでいるスコープ内の変数をキャプチャして操作するクロージャーの機能が実証されます。
以上がC# はクロージャでの変数キャプチャをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。