本文结构非常简单, 对比一下带语法糖的版本, 和与之等效的不带语法糖的版本, 就知道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:
百度GPT, 免费,理解能力低于GPT4
GPT3.5,免费无需梯子,但要手机注册:
GPT3,免费无需梯子无需注册,国人基于GPT3训练,理解能力略低于3.5: