原来一直以为使用 C# 的 foreach 语句会产生不必要的 Enumerator 对象, 所以自己写程序时能手动 for 迭代就不用 foreach. 今天看到一篇文章,作者使用 CLR Profiler 来监测程序是否生成 Enumerator.
结果是
1. System.ObjectModel.Collection<T>会产生 Enumerator 对象
2. System.Collections 中的 ArrayList, Queue 等数据结构会产生 Enumerator 对象
3. System.Collections.Generics 中的范型数据结构都不会产生 Enumerator
4. 数组不会产生
5. 显式使用 GetEnumerator 方法, 或者把对象转换成 IEnumerable 再迭代都会产生 Enumerator 对象
这种不产生迭代器对象的原因其实是编译时编译器对代码的优化.
以及运行时的优化.