foreach纯粹是“语法糖”吗?

时间:2011-04-28 09:55:36

标签: c# .net syntax foreach syntactic-sugar

foreach与数组一起使用时,编译器会将for循环编译为foreach循环。当foreachwhileforeach一起使用时,编译器会将IEnumerable循环编译为IEnumerable<T>循环。这是否意味着foreach纯粹是syntactic sugar?或者它有什么复杂的东西吗?

CLR是否了解foreach?在MSIL代码中是否有专为foreach设计的内容?

5 个答案:

答案 0 :(得分:27)

纯粹的语法糖,你可以在没有它的情况下获得相同的行为,是的。许多其他事情是相同的...... forwhile等等......错误引用阿基米德:“给我ifgoto,我会移动代码。 ..“

不,CLR没有foreach的任何概念。

答案 1 :(得分:10)

这是语法糖。但是,请注意foreach通过调用GetEnumerator(),然后调用MoveNext()来工作,直到没有返回更多项,然后始终在先前获取的枚举器上调用Dispose()。如果你想以同样的方式做,不要忘记Dispose()!

此外,CLR还有一些与获取枚举器相关的技巧。例如,请参阅herehere

答案 2 :(得分:2)

foreach内部只是一个调用IEnumerator中方法的while循环。

答案 3 :(得分:0)

不仅仅是语法糖,因为foreach循环中的项是不可变的(不可更改)。正如Daniel所指出的那样,其原因在于大多数集合将在foreach中使用枚举器,并且枚举器具有在枚举时不允许更新列表内容的限制。 / p>

Foreach(String s in List<string>)
{
   s = "f";  //this will throw an error.
}

答案 4 :(得分:0)

是的,它是纯糖。以下代码

no-debug-non-zts-20160303

在编译器中的翻译为:

    var MyList = new List<int>() { 10 , 20 , 30 , 40, 50} ;  
    foreach(int i in MyList) 
    {
        Console.WriteLine(i);
    }
相关问题