ホームページ >バックエンド開発 >C++ >C# でラムダ式が参照ではなく値で変数を確実にキャプチャするにはどうすればよいですか?

C# でラムダ式が参照ではなく値で変数を確実にキャプチャするにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-19 00:14:11284ブラウズ

How Do I Ensure Lambda Expressions Capture Variables by Value Instead of by Reference in C#?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。