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 サイトの他の関連記事を参照してください。