C#迭代器原理详解

本文详细介绍了C#中的迭代器模式,包括如何通过IEnumerable和IEnumerator接口实现,以及C#2.0引入的yield关键字简化迭代器实现的原理。通过ILSpy反编译展示了yield在编译后的状态机实现,解释了如何通过状态机维护遍历位置和状态。
摘要由CSDN通过智能技术生成

迭代器模式

迭代器模式提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

在C#中,可以通过IEnumerable和IEnumerator来实现这个模式。首先,我按照这两个接口完成了迭代器模式的实现:迭代器模式案例
在这个Example中,分别实现了这两个类

public class DinerMenu : IEnumerable
public class DinerMenuIterator : IEnumerator

其中,DinerMenu是需要可以被遍历的类,然后创建了DinerMenuIterator用于遍历DinerMenu。(具体实现过程不赘述,可以参考这篇文章:https://www.cnblogs.com/yangecnu/archive/2012/03/17/2402432.html ,或者参考Head First中的迭代器模式章节)我们可以看到,实现起来还是比较繁琐的,尤其是如果项目中有许多类需要支持迭代器模式时。所以,在C#2中,提供了一种yield语法糖,来帮助我们化简这个实现。

使用yield实现的迭代器模式

public IEnumerator GetEnumerator()
{
	for (int i = 0; i < m_numberOfItems; i++)
	{
		yield return m_menuItems[i];
	}
}

只需要如上寥寥几行代码就可以实现了,是不是使用起来很方便?下面我们来分析一下这个语法糖的内部实现。依旧是先写一段尽量简洁的实验代码:

        public IEnumerator GetEnumerator()
        {
            for (int i = 0; i < 3; i++)
            {
                yield return i;
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值