c#foreach
ループ変数の再利用:問題と解決策
c#lambda式と匿名の方法では、foreach
ループ内の「修正閉鎖」問題を導入します。 この例を考えてみましょう:
<code class="language-csharp">foreach (var s in strings) { query = query.Where(i => i.Prop == s); // Modified closure issue ... }</code>
コンパイラの生成されたコードは、問題のルートを明らかにしています:
<code class="language-csharp">string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... }</code>
s
変数は外側ループと宣言されています。このデザインは、最初は無害に見えますが、問題を作成します。パフォーマンスの利点は提供されず、ループの外側の変動使用量を制限します。
なぜこのデザイン?
この変数の再利用は、初期のC#(1.0)の設計選択でした。 内側変数と外変数の違いは取るに足らないとみなされました。ただし、C#2.0の閉鎖セマンティクスはこれを変更しました。ループとの一貫性を維持すると、ループ変数は外側に配置されました。
C#5以降の変更の変更for
欠陥を認識して、C#5は破壊的な変化を導入しました。ループ変数は、ループの本体の内側に論理的にになりました。 各反復は新鮮なコピーを取得します。
これにより、「変更された閉鎖」の問題が解決し、古い方法が安全ではありません。 また、特にforeach
ループのラムダや匿名のメソッドを使用した場合、のキーワード使用の重要性を強調しています。
以上がC#foreachループ変数の再利用により、「修正閉鎖へのアクセス」の問題が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。