【C#】yield语法糖作用和原理(迭代器IEnumerable和IEnumerator)

本文详细比较了C#中使用yieldreturn的语法糖和手动实现IEnumerator迭代器的方法,解释了yieldreturn如何将值存入Current和控制MoveNext流程。通过实例和测试展示了两者之间的区别。
摘要由CSDN通过智能技术生成

本文结构非常简单, 对比一下带语法糖的版本, 和与之等效的不带语法糖的版本, 就知道yield return 做了这样一件事:

把yield return 出的内容放入 Current属性中去,

把yield return 上下文的实现放入 MoveNext()中去, MoveNext返回false代表迭代完成,没有下一个元素了.


开始:

一个普通类,放一个[返回IEnumerator迭代器的普通方法].

它的不使用Yield语法糖的版本就比较长了:

首先同样写一个普通类, 同样有一个[返回IEnumerator迭代器的普通方法]

只不过这个被返回的迭代器并不是编译器根据yield语法糖自动生成的, 而是一个内部结构体(写成类也行)

内部结构体:

最后可以对照看一下

可以看到yield return 的值去了Current, 而其前后的代码分别去了 MoveNext()的上下2块代码中去.


测试:

代码发在网盘,可以自己测一下. 里面还有IEnumerable版本(实现一个获取IEnumerator的方法就可以)和Foreach调用(自动移MoveNext+拿Current,直到没有下一个)版本

链接:百度网盘 请输入提取码

提取码:2222

本文代码参考了sharplab对IEnumerator的[编译器生成版本C#代码], 并使用GPT翻译成普通C#语言

GPT4,免费,要梯子,梯子后左下角才出现bing机器人,能力高于GPT3.5:

Sign in to Skype

百度GPT, 免费,理解能力低于GPT4

文心一言

GPT3.5,免费无需梯子,但要手机注册:

chat8

GPT3,免费无需梯子无需注册,国人基于GPT3训练,理解能力略低于3.5:

AI ChatBot

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值