原来一直以为使用 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 对象
这种不产生迭代器对象的原因其实是编译时编译器对代码的优化.
以及运行时的优化.
结果是
1. System.ObjectModel.Collection<T>会产生 Enumerator 对象
2. System.Collections 中的 ArrayList, Queue 等数据结构会产生 Enumerator 对象
3. System.Collections.Generics 中的范型数据结构都不会产生 Enumerator
4. 数组不会产生
5. 显式使用 GetEnumerator 方法, 或者把对象转换成 IEnumerable 再迭代都会产生 Enumerator 对象
这种不产生迭代器对象的原因其实是编译时编译器对代码的优化.
以及运行时的优化.