c#
サイクル変数の再利用:歴史から残された問題foreach
lambda式または匿名の方法を使用する場合、
foreach
この特別な動作の出現は、以下のコード変換に示すように、循環変数が循環ドメインの外側で宣言されているためです。
一部の人々は、変数がサイクルの外側で宣言してもパフォーマンスの利点をもたらさないと主張していますが、サイクルが終わった後にのみアクセスすると便利かもしれませんが、この方法は閉鎖の問題により深刻なエラーを引き起こす可能性があります。
<code class="language-c#">string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... }</code>forサイクルとは異なり、forループの変数スコープはサイクル内にあります。この矛盾は、不必要なエラーリスクを高め、デバッグを困難にします。
この設計の選択は、ラムダの表現と匿名の方法を導入する前に行われる可能性がありますが、変更されておらず、開発者に問題をもたらします。
foreach
C#5
の主要な変更
この設計上の欠陥を認め、C#5はそれを解決するための大きな変更を導入しました。円形変数は、サイクル本体の内部で論理的に作用します。これは、閉鎖が各反復時に変数の新しいコピーをキャプチャし、それにより変更された閉鎖問題を排除することを意味します。 ただし、 forループは変更されておらず、変更は初期のC#バージョンにまでさかのぼりません。したがって、開発者は、Lambdaの表現または匿名の方法で
サイクルを使用する場合、引き続き慎重に動作する必要があります。以上がC# 's `foreach`ループ変数再利用は、ラムダで予期しない動作を引き起こしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。