已经的foreach的使用变量在C#5被改变?(Has foreach's use of v

2019-06-17 20:45发布

在这种应答https://stackoverflow.com/a/8649429/1497埃里克利珀说:“FYI,我们极有可能在C#中的下一个版本,以解决这个问题,这是一个重大的痛点为开发商”,与如何foreach循环使用变量。

在接下来的版本每次通过“foreach”循环运行时,我们将产生一个新的循环变量,而不是在同一个变量,每次关闭。 这是一个“破”的变化,但在绝大多数情况下的“突破”将被固定,而不是造成错误。

我一直没能找到任何表明这种变化尚未作出。 是否有任何迹象表明这是foreach循环是如何工作在C#5?

Answer 1:

这是一个变化的C#语言,而不是.NET框架。 因此,它不仅影响在C#5.0编译代码,无论.NET Framework版本上的代码将被执行。

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。

注意

你可以找到在Visual Studio下的安装文件夹的C#规范VC#\Specifications\1033 。 这是VS2005,VS2008,VS2010和VS2012的情况下,让您获得规格为C#1.2,2.0,3.0,4.0和5.0。 您也可以通过搜索找到MSDN上的规格C# Specification



文章来源: Has foreach's use of variables been changed in C# 5?