39

在这个答案中https://stackoverflow.com/a/8649429/1497 Eric Lippert 说“仅供参考,我们很可能在下一版本的 C# 中解决这个问题;这是开发人员的主要痛点”关于如何foreach 循环使用该变量。

在下一个版本中,每次运行“foreach”循环时,我们都会生成一个新的循环变量,而不是每次都关闭同一个变量。这是一个“破坏性”更改,但在绝大多数情况下,“破坏”将是修复而不是导致错误。

我还没有找到任何表明已经进行此更改的信息。是否有任何迹象表明这就是 foreach 循环在 C# 5 中的工作方式?

4

1 回答 1

58

这是对 C# 语言的更改,而不是对 .NET 框架的更改。因此,它只影响在 C# 5.0 下编译的代码,而不管该代码将在哪个 .NET 框架版本上执行。

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 循环中的位置对于嵌入语句中出现的任何匿名函数如何捕获它很重要。

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
    }
}

请注意,变量v是在循环外部而不是内部声明的,就像在 C# 5.0 中一样。

笔记

您可以在 Visual Studio 的安装文件夹下找到 C# 规范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 回答