39

この回答でhttps://stackoverflow.com/a/8649429/1497 Eric Lippert は、次のバージョンの C# でこれを修正する可能性が非常に高いと述べています。 foreach ループは変数を使用します。

次のバージョンでは、「foreach」ループを実行するたびに、毎回同じ変数を閉じるのではなく、新しいループ変数を生成します。これは「破壊的」な変更ですが、ほとんどの場合、「破壊」はバグを引き起こすのではなく、修正するためのものです。

この変更がまだ行われたことを示すものは何も見つかりませんでした。これが C# 5 で foreach ループがどのように機能するかを示す兆候はありますか?

4

1 に答える 1

58

これは、.NET フレームワークではなく、C# 言語に対する変更です。したがって、コードが実行される .NET Framework のバージョンに関係なく、C# 5.0 でコンパイルされたコードにのみ影響します。

C#5.0

仕様のセクション 8.8.4 は、この変更が行われたことを明確にしています。具体的には、C# 5.0 仕様の 249 ページに次のように記載されています。

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 {
        … // Dispose e
    }
}

以降:

v を while ループ内に配置することは、embedded-statement で発生する無名関数によってどのようにキャプチャされるかという点で重要です。

C#4.0

仕様に対するこの変更は、C# 4.0 仕様と比較すると明らかです (セクション 8.8.4 で、今回は 247 ページ)。

foreach (V v in x) embedded-statement

その後、次のように展開されます。

{
    E e = ((C)(x)).GetEnumerator();
    try {
        V v;
        while (e.MoveNext()) {
            v = (V)(T)e.Current;
            embedded-statement
        }
    }
    finally {
        … // Dispose e
    }
}

C# 5.0 の場合と同様に、変数vはループ内ではなくループ外で宣言されていることに注意してください。

ノート

C# 仕様は、Visual Studio のインストール フォルダーの にありますVC#\Specifications\1033。これは VS2005、VS2008、VS2010、および VS2012 の場合で、C# 1.2、2.0、3.0、4.0、および 5.0 の仕様にアクセスできます。を検索して、MSDN で仕様を見つけることもできますC# Specification

于 2012-08-24T16:07:51.347 に答える