ホームページ >バックエンド開発 >C++ >C# 5.0 の For ループではキャプチャされたクロージャに問題があるのに、Foreach ループでは問題がないのはなぜですか?

C# 5.0 の For ループではキャプチャされたクロージャに問題があるのに、Foreach ループでは問題がないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-07 19:31:41582ブラウズ

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

C# 5.0 ループでのクロージャのキャプチャ: For ループと Foreach ループの違い

質問:

C# 5.0 では、foreach ループでクロージャをキャプチャすると正しくキャプチャされますが、for ループでクロージャをキャプチャすると依然として問題が発生するのはなぜですか?

答え:

論理的には、for ループ内のクロージャの動作は合理的です。 for ループをそのコンポーネント部分 (初期化子、条件、反復子、本体) に分割した後、初期化子は 1 回だけ実行されます。したがって、「変数のインスタンス化」が 1 つだけ存在するのは論理的です。

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

<code class="language-c#">for (int i = 0, j = 10; i < 5; i++, j--) {
    Action action = () => Console.WriteLine(i, j);
    action();
}</code>

このループでは、ループ中に j の値が変化する可能性があります。この場合、どのような動作が予想されるでしょうか?

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

以上がC# 5.0 の For ループではキャプチャされたクロージャに問題があるのに、Foreach ループでは問題がないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。