C# 5.0: for
ループがキャプチャされたクロージャーの拡張機能を見逃した理由
C# 5.0 は、foreach
ループでキャプチャされたループ変数の問題に対処し、クロージャ変数がキャプチャ時のループ変数の値を正確に反映するようにしました。 ただし、この改善は for
ループには適用されず、5.0 より前の動作が維持されています。
省略の理由
この意図的な除外は、for
ループと foreach
ループの基本的な違いに起因します。
for
ループ: 初期化中心。 for
ループは、ループ変数に値を割り当てる初期化子から始まります。この変数はループのロジックの中心であり、繰り返し変更およびチェックされます。foreach
ループ: イテレーターベース。 foreach
ループは、各反復に値を提供するイテレーターに依存します。ループ変数はプレースホルダーとして機能し、反復子の値にアクセスします。for
ループでは、単一の「ループ変数のインスタンス化」の概念が、初期化に重点を置いた性質と一致しています。 論理的に一貫した単一のループ変数インスタンスがあり、初期化、更新され、ループ終了を制御します。
次の for
ループについて考えてみましょう:
<code class="language-csharp">for (int i = 0; i < 10; i++) { ... }</code>
ここで、i
は反復回数を管理します。これは 0 に初期化され、反復ごとに増分され、ループの終了を制御します。 i
をキャプチャするクロージャは、i
のループ内変更に関係なく、単一の値を直感的に参照します。これは、変数の状態変化に対する for
ループの依存と矛盾します。
逆に、foreach
ループはループ変数の状態に依存しません。これらは、特定の変数インスタンスを必要とせずに、コレクションを反復処理します。 したがって、クロージャはキャプチャ時にイテレータの値をキャプチャし、後続の変更から分離します。
以上がC# 5.0 でキャプチャされたクロージャの改善が「for」ループに適用されなかったのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。