|
1
2
编译器生成一个隐藏类来实现此代码。它有一个超级秘密的名字:“d_uu0`2”。Seenkey和源变量成为该类的字段,确保它们不能被垃圾收集,除非收集类对象。 该类实现IEnumerator<&燃气轮机;接口,使用迭代器的客户端代码使用该接口调用MoveNext()方法。正是接口引用使类对象保持活动状态。这让它的田地生机勃勃。一旦客户机代码完成foreach循环,接口引用就会消失,从而允许GC清理所有内容。 使用Ildasm.exe或Reflector亲自查看。它还将让您了解语法糖的隐藏成本。迭代器并不便宜。 |
|
|
2
1
. 显然,这是不可能的。
因此,如果您的迭代器中有很多昂贵的状态,并且您对其进行了很长时间的迭代,那么您可能希望不使用yield-return,或者通过调用ToArray()之类的函数立即计算整个枚举,然后查看它。 编辑 :因此,在回答您的最后一个问题——如何确保它得到处理——如果您在其上使用LINQ或foreach构造,则无需执行任何特殊操作,因为它们通过其通常的魔法自行处理。如果要手动获取枚举数,请确保在完成后对其调用Dispose(),或将其放入using块中。 |