C# 5.0 より前のバージョンでは、ループ構造のクロージャ キャプチャに根本的な問題がありました。ループ内で宣言された変数はクロージャによってキャプチャされ、最終値が保持されるため、複雑な結果が生じます。
この問題は C# 5.0 の「foreach」ループに関しては解決されていますが、「for」ループには依然として存在します。問題は、なぜこの矛盾が続くのかということです。
答えは、「for」ループの基本的な性質にあります。 「foreach」ループは本質的に反復ごとに新しい変数を作成することを意味しますが、「for」ループを使用すると変数の初期化、条件チェック、反復をより柔軟に制御できます。
for ループのロジック:
<code>{ initializer; while (condition) { body; iterator; } }</code>
初期化フェーズは論理的に 1 回だけ発生し、固定の初期値が確立されることがわかります。次に、ループ本体内の変数の値を変更し、反復子を介して操作します。
クロージャーキャプチャへの影響:
この論理構造は、クロージャ内の変数のインスタンスを 1 つだけキャプチャすることが合理的であることを意味します。ループ実行中の変数の「開始」値や漸進的な更新という固有の概念はありません。
「foreach」ループとの比較:
対照的に、「foreach」ループは反復ごとに新しい変数を宣言しているようです。この変数は読み取り専用であり、各反復におけるその固有の性質が強調されます。この意味上の違いにより、実行ごとに個別の変数を取得することが正当化されます。
「for」ループでの変数キャプチャの従来の動作を保持するという決定は、これらのループ構造によって提供される固有の柔軟性と制御に基づいています。既存の動作は、「for」ループの論理構造と厳密に一致しており、一貫性のある予測可能な結果が保証されます。
以上がC# 5.0 の Foreach と For ループが異なるキャプチャされたクロージャ動作を示すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。