C# 5.0 の一貫性のないクロージャ キャプチャ: for
と foreach
問題
C# 5.0 では、foreach
ループのクロージャ キャプチャが改善されましたが、for
ループでは改善されませんでした。 foreach
ループは、反復ごとにループ変数の値を正しくキャプチャするようになりました。 ただし、for
ループは古い動作を保持し、ループ変数の最終値のみをキャプチャします。
質問: なぜこの矛盾があるのでしょうか?
説明:
この違いは、for
ループと foreach
ループの基本構造に由来します。 foreach
ループは本質的にコレクションを反復処理し、要素ごとにループ変数の新しいインスタンスを作成します。これにより、反復ごとの一貫したキャプチャが簡単になります。
for
ループはより複雑です。これは、初期化子、条件、イテレータ、および本体で構成されます。イニシャライザは 1 回だけ実行され、単一のループ変数が作成されます。 ループ変数の値は、本質的に各反復に関連付けられるわけではありません。ループ本体内で独立して操作できます。
以下を考慮してください:
for (int i = 0, j = 10; i < 5; i++, j--) { Console.WriteLine(i, j); }
ループ変数 i
が反復ごとにキャプチャされた場合、j
が独立して変更されるため、動作は予測不能で潜在的に曖昧になります。 の 最終i
値を取得する一貫した動作により、明確で予測可能な結果が得られます。 これにより、予期せぬ複雑さや潜在的なバグの発生を回避できます。 したがって、一見一貫性がないように見えますが、C# 5.0 での異なる処理は、ループの種類間の固有の構造的な違いを反映しており、それぞれのケースで明確で予測可能な動作を目指しています。
以上がC# 5.0 では、「foreach」ループのように「for」ループのキャプチャされたクロージャ動作を修正しなかったのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。