1、可枚举的类型必须实现IEnumerable和IEnumerator接口
2、枚举器实现了IEnumerator接口,它迭代Object类型,会有如下问题
1、值类型的装箱和取消装箱操作降低了性能
2、向下类型转换(从父类型到子类型)到引用类型也要付出少量的性能代价
3、频繁的装箱操作会使托管堆空间紧张
4、大型值类型集合的装箱也会使托管堆空间紧张
5、需要与System.Object之间的类型转换,这并非是类型完全安全的
3、迭代器
yield语句
语法:yield return expresssion yield break
迭代器块
迭代器块是维护迭代之间的枚举器的状态机
事件处理程序、构造函数和析构函数不能成为迭代器
迭代器块不能再匿名方法中使用,迭代器块不能包含在一个带有catch处理程序的try块中
迭代器块不能放在一个finally块中
迭代器函数的限制
迭代器方法必须返回一个IEnumerable或一个IEnumerator接口
迭代器方法不能有ref参数
迭代器方法不能有out参数
迭代器方法不能是不安全的
迭代器的本质
C#编译器将迭代器实现为嵌套类,该嵌套类维护当前枚举数的状态
迭代器是由语言编译器创建的,而不是由公共语言运行时(CLR)创建的
迭代器实例
双重迭代
反向迭代
临时集合
复杂迭代