C# ラムダ式での値のキャプチャと参照のキャプチャ
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>
問題の説明:
期待される出力は、各 Lambda 式がリストを反復処理する際に、対応する i 値を出力することです。ただし、この例では、すべてのラムダ式は値 10 を出力し、すべてが同じ変数 i を参照していることを示します。これは、ラムダ式が i を参照によって取得するためです。
解決策:
ラムダ式に i のコピーを強制的にキャプチャするには、1 つの解決策は、最初に部分コピーを作成することです。
<code class="language-csharp">for (int i = 0; i < 10; i++) { int copy = i; // 创建局部副本 actions.Add(() => Console.WriteLine(copy)); }</code>
説明:
ループ内で i のローカル コピーを作成することにより、ラムダ式は、その時点での元の i のコピーである copy の値を取得します。これにより、各 Lambda 式が値の独自のコピーを持ち、対応する i 値が出力されるようになります。
違い:
参照による変数のキャプチャと値によるキャプチャの違いは、ラムダ式の外で変数とどのように対話するかです。
以上がC# でラムダ式が参照ではなく値で変数を確実にキャプチャするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。