一尘不染

在C#5中,foreach对变量的使用是否已更改?

c#

在这个答案中,https:
//stackoverflow.com/a/8649429/1497埃里克·利珀特(Eric
Lippert)说:“仅供参考,我们很有可能在下一版C#中修复此问题;这对于开发人员来说是一个主要的痛点”, foreach循环使用该变量。

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

我还没有找到任何表明此更改已完成的信息。是否有任何迹象表明foreach循环将在C#5中工作?


阅读 308

收藏
2020-05-19

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

然后:

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

2020-05-19