anonymous-methods - c# ラムダ式 select - C#がforeachで変数を再利用するのは何か理由があるのでしょうか?

c# ラムダ式 action / c# / foreach / lambda / scope

C#でラムダ式または匿名メソッドを使用する場合、変更されたクロージャの落とし穴へのアクセスに注意する必要があります。例えば:

foreach (var s in strings)
{
   query = query.Where(i => i.Prop == s); //変更されたクロージャへのアクセス
   ...
}
string s;
while (enumerator.MoveNext())
{
   s = enumerator.Current;
   ...
}

ではなく、このように。

while (enumerator.MoveNext())
{
   string s;
   s = enumerator.Current;
   ...
}

ここで指摘したように、ループの外で変数を宣言することにはパフォーマンス上の利点はありません。通常の状況では、これを行うために私が考えることができる唯一の理由は、ループのスコープ外で変数を使用することを計画している場合です。

string s;
while (enumerator.MoveNext())
{
   s = enumerator.Current;
   ...
}
var finalString = s;
foreach(string s in strings)
{
}
var finalString = s; //機能しません:範囲外です。

Community



Answer #1

形式のforeach文は

foreach (V v in x) embedded-statement

を展開しています。

{
  E e = ((C)(x)).GetEnumerator();
  try {
      while (e.MoveNext()) {
          V v = (V)(T)e.Current;
          embedded-statement
      }
  }
  finally {
      … // eを破棄します
  }
}
int[] values = { 7, 9, 13 };
Action f = null;
foreach (var value in values)
{
    if (f == null) f = () => Console.WriteLine("First value: " + value);
}
f();