ホームページ  >  記事  >  バックエンド開発  >  私のラムダ式がループ変数の最後の値を取得するのはなぜですか?

私のラムダ式がループ変数の最後の値を取得するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-28 22:50:02657ブラウズ

Why Does My Lambda Expression Capture the Last Value of a Loop Variable?

ループ反復内のラムダ式の変数のキャプチャ

このコード スニペットは、ラムダ式で foreach ループの反復子変数を使用する場合の予期しない動作を示しています。実行時には、「Hi String」、「Hi Single」、および「Hi Int32」を出力する代わりに、3 つのメソッドすべてに対して「Hi Int32」を出力します。

説明

この動作は次のような理由から発生します。ラムダ式とそのキャプチャされた変数の性質。ラムダ式がループ内で定義されると、ループ変数の値ではなく参照がキャプチャされます。その結果、ループの繰り返し全体で同じ変数を参照します。

提供されたコードでは、変数の型はラムダ式によってキャプチャされます。ただし、このコードでは、type への同じ参照がループのすべての反復で共有されるという事実が考慮されていません。その結果、各ラムダ式は最後の反復から type の値を取得することになり、予期しない出力が発生します。

修正

この問題を解決して目的の目標を達成するには、次のことを確認する必要があります。各ラムダ式は型の一意の値を取得します。これを行うには、反復ごとに新しい変数を作成し、それに type の現在の値を割り当てます。

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

newType を使用すると、type のコピーが効果的に作成され、現在の反復からその値が取得されます。これにより、各ラムダ式が自身の type 値への一意の参照を持つことが保証され、正しい出力が得られます。

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

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