C#学习教程:我什么时候应该单独实现IEnumerator ?分享


我什么时候应该单独实现IEnumerator ?

在集合的框架类中,我经常看到IEnumerator分别实现为内部类,并且在GetEnumerator方法中返回它的实例。

现在假设我正在编写自己的集合类,它将内置集合,如ListT[]充当内部持有者,如下所示:

 public class SpecialCollection : IEnumerable { List list; public SpecialCollection() { } public IEnumerator GetEnumerator() { return list.GetEnumerator(); //or return list.Where(x => some logic).GetEnumerator(); //or directly rely on yield keyword yield return x; //etc } } 

我应该编写自己的枚举器类,还是可以返回List类的枚举器? 我是否应该编写自己的枚举类?


我也有一个相关的问题。 如果它不是那么重要或没有太大的区别,为什么BCL中的每个集合类都编写自己的IEnumerator

例如, List类有类似的东西

 T[] items; public IEnumerator GetEnumerator() { return new List.Enumerator(items); } 

您的第一个问题的答案是:当收益率回报不符合您的需求时。

第二个问题的答案是:这些使用频繁的类型具有exception严格的性能要求,因此枚举器是自定义构建的。 我最近写了一些关于此的文章; 看到:

ATBG: Why does my enumerator not advance?

ATBG: Why do enumerators avoid a bounds check?

只回答一部分:

List有自己的枚举器实现,原因有两个:

  • 上面的内容可以用迭代器块来执行(尽管首先必须使用非迭代器方法,以便在调用时捕获列表的“结构版本”而不是第一次迭代时间),但是效率相对较低与实际高度优化的可变结构实现相比较
  • 在这里使用可变结构有一些问题 ,但是当以预期的方式使用时,它避免了堆分配,通过引用的虚方法调用等。

    上述就是C#学习教程:我什么时候应该单独实现IEnumerator ?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

    本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

    如若转载,请注明出处:https://www.ssfiction.com/ckf/954414.html

    发表评论

    邮箱地址不会被公开。 必填项已用*标注