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