当foreach
与数组一起使用时,编译器会将for
循环编译为foreach
循环。当foreach
与while
或foreach
一起使用时,编译器会将IEnumerable
循环编译为IEnumerable<T>
循环。这是否意味着foreach
纯粹是syntactic sugar
?或者它有什么复杂的东西吗?
CLR是否了解foreach
?在MSIL代码中是否有专为foreach
设计的内容?
答案 0 :(得分:27)
纯粹的语法糖,你可以在没有它的情况下获得相同的行为,是的。许多其他事情是相同的...... for
,while
等等......错误引用阿基米德:“给我if
和goto
,我会移动代码。 ..“
不,CLR没有foreach
的任何概念。
答案 1 :(得分:10)
这是语法糖。但是,请注意foreach通过调用GetEnumerator(),然后调用MoveNext()来工作,直到没有返回更多项,然后始终在先前获取的枚举器上调用Dispose()。如果你想以同样的方式做,不要忘记Dispose()!
答案 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);
}