是否在C#5中改变了变量的使用?

时间:2012-08-24 16:03:28

标签: c# foreach .net-4.5 c#-5.0

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

  

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

我无法找到任何表明此更改尚未完成的内容。有没有迹象表明这是foreach循环在C#5中的工作方式?

1 个答案:

答案 0 :(得分:55)

这是对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
    }
}

后来:

  

在while循环中放置v对于它是如何重要的   被发现的任何匿名函数捕获   嵌入语句。

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一样。

注意

您可以在VC#\Specifications\1033下的Visual Studio安装文件夹中找到C#规范。这是VS2005,VS2008,VS2010和VS2012的情况,使您可以访问C#1.2,2.0,3.0,4.0和5.0的规范。您还可以通过搜索C# Specification找到MSDN上的规范。