ホームページ >バックエンド開発 >C++ >C# でラムダ式がイテレータ変数の最終値を取得するのはなぜですか?

C# でラムダ式がイテレータ変数の最終値を取得するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-29 11:02:02730ブラウズ

Why Do Lambda Expressions Capture the Final Value of Iterator Variables in C#?

C# でイテレータを使用したラムダ式の使用

C# では、ラムダ式は匿名関数を定義するための簡潔で便利な方法を提供します。ただし、イテレータでラムダ式を使用するときによくある落とし穴は、キャプチャされた変数がイテレータ変数の現在の値ではなく、最終値であることです。

次のコードを考えてみましょう:

<code class="c#">Type[] types = new Type[] { typeof(string), typeof(float), typeof(int) };
List<PrintHelloType> helloMethods = new List<PrintHelloType>();

foreach (var type in types)
{
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
    helloMethods.Add(sayHello);
}

foreach (var helloMethod in helloMethods)
{
    Console.WriteLine(helloMethod("Hi"));
}</code>

このコードを実行すると、次の出力が出力されると予想されるかもしれません:

Hi String
Hi Single
Hi Int32

しかし、実際の出力は次のとおりです:

Hi Int32
Hi Int32
Hi Int32

これは、ラムダ式がキャプチャしているためです。ラムダが定義された時点の値ではなく、ループ変数の型です。したがって、ラムダが実行されると、型の最終値 (Int32) が使用されます。

この問題を修正して目的の出力を取得するには、ローカル変数を使用してイテレータの現在の値を取得します。次のコードに示すように、変数を使用します。

<code class="c#">foreach (var type in types)
{
    var newType = type;
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
    helloMethods.Add(sayHello);
}</code>

この場合、ラムダ式はローカル変数 newType をキャプチャし、type の現在の値が割り当てられます。これにより、ラムダ式の実行時に正しい type 値が使用されるようになります。

以上がC# でラムダ式がイテレータ変数の最終値を取得するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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