ホームページ >バックエンド開発 >C++ >C# Lambda Capture での参照とコピー: 予期しない動作が発生するのはどのような場合ですか?

C# Lambda Capture での参照とコピー: 予期しない動作が発生するのはどのような場合ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-18 23:56:10348ブラウズ

Reference vs. Copy in C# Lambda Capture: When Do I Get Unexpected Behavior?

C# での Lambda キャプチャの深い理解: 参照とコピー

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

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