ラムダ式で反復変数を使用する場合の潜在的な落とし穴
プログラミングの分野では、ラムダ式は匿名関数を表す簡潔な方法を提供します。ただし、ラムダ式で反復変数を使用すると、予期しない結果が生じる可能性があります。
次のコードを考えてみましょう:
<code class="language-c#">List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) { actions.Add(() => Console.WriteLine(i)); } foreach (Action action in actions) { action(); }</code>
このコードは、誤ってすべての Lambda 式を同じ反復変数 i
に関連付けます。したがって、各 Lambda 式が実行されるときは、Lambda が作成されたときの i
の期待値ではなく、i
の最終値を参照します。
その結果、出力が期待どおりにならない可能性があります。予想どおり 0 から 9 を出力する代わりに、コードは 10 を 10 回出力します。この動作は、関与するすべてのデリゲートが単一の変数をキャプチャすることに起因することに注意してください。
この予期しない結果を回避するには、ループ内にローカル変数を作成し、それに反復変数の値を割り当てることをお勧めします。このようにして、各ラムダ式は異なるローカル変数を参照し、期待値が確実に保持されるようにします。 変更されたコードは次のとおりです:
<code class="language-c#">List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) { int temp = i; // 创建局部变量 actions.Add(() => Console.WriteLine(temp)); } foreach (Action action in actions) { action(); }</code>
このようにして、各 Lambda 式は独立した temp
変数をキャプチャするため、変数値が上書きされる問題が回避され、最終的な出力には 0 から 9 が正しく表示されます。
以上がラムダ式が反復変数の最終値を取得するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。