foreach纯粹是“语法糖”吗?
当foreach
与数组一起使用时,编译器将foreach
循环编译为类似for
循环的东西。 当foreach
与IEnumerable
或IEnumerable
一起使用时,编译器会将foreach
循环编译为类似while
循环的东西。 那么这是否意味着foreach
纯粹是syntactic sugar
? 或者有什么复杂的东西吗?
CLR是否了解foreach
? 在MSIL代码中是否有专门针对foreach
设计的内容?
这是纯粹的语法糖,你可以在没有它的情况下获得相同的行为,是的。 许多其他的东西是相同的…… for
,等等…错误地引用阿基米德:“给我if
和goto
,我会移动代码……”
不,CLR没有foreach
任何概念。
它是语法糖。 但是,请注意,foreach通过调用GetEnumerator(),然后调用MoveNext()来工作,直到没有返回更多项,然后始终在先前获取的枚举器上调用Dispose()。 如果你想以同样的方式做,不要忘记Dispose()!
此外,CLR还有一些与获取枚举器相关的技巧。 例如,请参见此处和此处 。
foreach
在内部只是一个调用IEnumerator
的方法的while
循环。
它不仅仅是语法糖,因为foreach循环中的项是不可变的(不可更改)。 正如Daniel所指出的那样,其原因在于大多数集合将在foreach中使用枚举器,并且枚举器具有在枚举时不允许更新列表内容的限制。
即
上述就是C#学习教程:foreach纯粹是“语法糖”吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
Foreach(String s in List) { s = "f"; //this will throw an error. }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/989207.html