「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Lambda式が反復変数の最終値をキャプチャするのはなぜですか?これを避けることができますか?

Lambda式が反復変数の最終値をキャプチャするのはなぜですか?これを避けることができますか?

2025-02-06に投稿しました
ブラウズ:681

Why Do Lambda Expressions Capture the Final Value of Iteration Variables, and How Can This Be Avoided?

lambda式で反復変数を使用するリスク

lambda式は、ループ内のインライン関数を定義する簡潔な方法を提供します。ただし、ラムダで直接反復変数を使用すると、後で予期しない動作につながる可能性があります。

反復変数のためのラムダトラップ:

次のコードを検討してください:

for (int i = 0; i  Console.WriteLine(i);
    actions.Add(action);
}

foreach (var action in actions) {
    action();
}

人々は、各ラムダがiの対応する値を印刷すると考えるかもしれません。ただし、すべてのラムダは、閉鎖による同じキャプチャリファレンスをiに共有しています。

偶発的な印刷結果:

ループが終了すると、私は10になり、すべてのラムダスがこの最終値を指します。その結果、Lambdaを実行すると、予想されるシーケンスが0から9までの代わりに10回印刷されます。

この動作は、Lambda閉鎖に由来しており、たとえループが完了したとしても、その範囲内で宣言された変数への参照を維持します。

回避および代替方法:

]

この問題を解決するために、ループにローカル変数を作成し、反復変数の値に割り当てます:

for (int i = 0; i  Console.WriteLine(j);
    actions.Add(action);
}

foreach (var action in actions) {
    action();
}

これにより、各ラムダがjの異なる値をキャプチャすることを保証し、予想される印刷シーケンスになります。

ラムダ式で直接反復変数を使用すると、閉鎖に関連する予期しない状況につながる可能性があることを忘れないでください。代わりに、ローカル変数を作成して、必要な値を正確にキャプチャすることを検討してください。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3