「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C#5.0で閉鎖を問題とするのはなぜループのために問題があり、そのような問題はforeachループではありませんか?

C#5.0で閉鎖を問題とするのはなぜループのために問題があり、そのような問題はforeachループではありませんか?

2025-04-12に投稿されました
ブラウズ:181

Why are Captured Closures Problematic in C# 5.0 For Loops but Not Foreach Loops?

C#5.0ループでの閉鎖をキャプチャ:ループとforeachループの違い

質問:

C#5.0では、foreachループのキャプチャクロージャーを正しくキャプチャできますが、なぜループのキャプチャクロージャーがまだ問題を抱えているのですか?

答え:

論理的に言えば、forループでの閉鎖の動作は妥当です。 forループをコンポーネント(初期化、条件、イテレーター、ボディ)に分解した後、初期イザーは1回だけ実行されます。したがって、「可変インスタンス化」が1つしかないことが論理的です。

さらに、forループでは、各反復の変数の初期値は事前に決定されていません。次の例を考えてみましょう:

for (int i = 0, j = 10; i  Console.WriteLine(i, j);
    action();
}

このループでは、jの値がループ中に変化する場合があります。この場合、予想される動作は何ですか?

対照的に、foreachループは、反復ごとに新しい変数を宣言しているようで、その変数は読み取り専用です。したがって、foreachループを、iteratorから値が取られている各反復で個別の読み取り専用変数を宣言すると考えることは合理的です。これは、閉鎖がforeachループで正しくキャプチャできる理由を説明しています。

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

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

Copyright© 2022 湘ICP备2022001581号-3