4
C#がforeachで変数を再利用する理由はありますか?
C#でラムダ式または無名メソッドを使用する場合、変更されたクロージャーの落とし穴へのアクセスに注意する必要があります。例えば: foreach (var s in strings) { query = query.Where(i => i.Prop == s); // access to modified closure ... } 変更されたクロージャのため、上記のコードではWhere、クエリのすべての句がの最終値に基づいていますs。 ここで説明したように、これsは、foreach上記のループで宣言された変数がコンパイラで次のように変換されるために発生します。 string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... } このようにする代わりに: while (enumerator.MoveNext()) { string s; s = enumerator.Current; ... } ここで指摘したように、ループの外側で変数を宣言してもパフォーマンス上の利点はありません。通常の状況では、これを行うために考えられる唯一の理由は、ループのスコープ外で変数を使用する場合です。 string s; while (enumerator.MoveNext()) { …