foreach纯粹是“语法糖”吗?

foreach与数组一起使用时,编译器将foreach循环编译为类似for循环的东西。 当foreachIEnumerableIEnumerable一起使用时,编译器会将foreach循环编译为类似while循环的东西。 那么这是否意味着foreach纯粹是syntactic sugar ? 或者有什么复杂的东西吗?

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

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

不,CLR没有foreach任何概念。

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

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

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

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

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