C# 关于yield return的研究(转载)
转载自:http://hi.baidu.com/algorithmanlxl/item/d94211d17a831c2039f6f792
这里的研究是借助了http://jangmon.blogbus.com/logs/36380490.html的帮助,虽然其中有些代码出现了错误,而且颇多细节没说清楚,但是对鄙人的启发意义很大。各位可以去该链接学习一下。而事实上,由于C#在.net框架中的高级特性和技术内幕很难深层次的说清楚,有些东西鄙人也是不甚明了。具体的接口说明和解释可以看看上面那篇博文,在这里我是想说说困扰很多人的"yield return”问题,到底其作用是怎么发挥的?我是用单步调试将其大概的调用顺序摸清楚的。先给出源程序,诸君可将其复制建立工程然后对比。
class Program {static void Main(string[] args){HelloCollection helloCollection = new HelloCollection();foreach (string s in helloCollection)Console.WriteLine(s);Console.ReadKey();}//public class HelloCollection : IEnumerable//{// public IEnumerator GetEnumerator()// {// yield return "Hello";// yield return "World";// }//}public class HelloCollection : IEnumerable{public IEnumerator GetEnumerator(){Enumerator enumerator = new Enumerator(0);return enumerator;}public class Enumerator : IEnumerator, IDisposable{private int state;private object current;public Enumerator(int state){this.state = state;}public bool MoveNext(){switch (state){case 0:current = "Hello";state = 1;return true;case 1:current = "World";state = 2;return true;case 2:break;}return false;}public void Reset(){throw new NotSupportedException();}public object Current{get { return current; }}public void Dispose(){}}} }
上面注释的部分引用了"yield return”,其功能相当于下面所有代码!为什么呢,其实要从底层来说也很难解释得清楚,大家可以在foreach之前设一个断点,然后调试运行,会发现断点运行到foreach那一行的时候,会先编译"helloCollection",然后跳到下面的public IEnumerator GetEnumerator()执行该函数,而函数中原本的yield return会为HelloCollection类自动生成代码,就是多了Enumerator这个内部类的实现,且public IEnumerator GetEnumerator()里面的代码也会变成
Enumerator enumerator = new Enumerator(0);
return enumerator;
那么在运行到Enumerator enumerator = new Enumerator(0);的时候就会发现又跳到了Enumerator内部类的构造函数,构造完成后,回去编译foreach那行的"in",会发现又跳到了MoveNext函数,执行完毕后再去编译foreach那行的"string s”,发现跳到了Current字段的定义,调用了get方法,其内部估计是对s执行了赋值,不确定(暂且这样理解)。以此类推,最后会发现直到执行MoveNext返回了false,那么就会跳到了Dispose(),最后就这样了。
上面讲述的是通过断点来分析其运行的,而事实上如果比较简洁地去说的话,foreach这一行会被编译成IEnumerator e=helloCollection.GetEnumerator(),并自动生成一个while(e.MoveNext())循环实现了整个聚合的遍历。
本文转载自:http://hi.baidu.com/algorithmanlxl/item/d94211d17a831c2039f6f792
C# 关于yield return的研究(转载)相关推荐
- Unity StartCoroutine 和 yield return 深入研究
http://www.cnblogs.com/fly-100/p/3910515.html 转载于:https://www.cnblogs.com/jiahuafu/p/5919895.html
- IEnumerator/ IEnumerable/ yield return/ StartCoroutine 详解
Update逻辑 IEnumerator/ IEnumerable public interface IEnumerable { IEnumerator GetEnumerator(); } publ ...
- 可惜Java中没有yield return
项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...
- yield return的理解
一直在实际开发中都有用到yield return,但也一直只停留在"用"的层面上,可谓一知半解.今天下班回来自己查证思考了半天,本着自己的原则一切从简提炼了一下几点(正确与否有待进 ...
- C#中,什么时候用yield return
yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 有这样的一个int类型的集合: static Lis ...
- //yield return用于无缝实现迭代模式。
代码 public class YieldReturn { //yield return用于无缝实现迭代模式. string[] strArr; ...
- C#中yield return用法
转载:http://www.jb51.net/article/54810.htm http://www.cnblogs.com/HunterWei/archive/2012/06/13/csharpy ...
- C#中yield return用法分析
转载地址:https://www.jb51.net/article/54810.htm 这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield ret ...
- yield学习续:yield return迭代块在Unity3D中的应用——协程
必读好文推荐: Unity协程(Coroutine)原理深入剖析 Unity协程(Coroutine)原理深入剖析再续 上面的文章说得太透彻,所以这里就记一下自己的学习笔记了. 首先要说明的是,协程并 ...
最新文章
- 合并多个excel——贼快
- 19图的搜索算法总结与比较
- 周五话营销 | 健身房花式卖卡,诠释点击营销流
- mysql索引 聚集索引_Mysql 索引实现原理. 聚集索引, 非聚集索引
- 类、变量、块、构造器、继承初始化顺序,终极解答
- Photoshop的基本操作
- 将两大小完全相同的照片进行加权混合对比
- Yii2 使用 RESTful 写API接口 实例
- 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?
- Android之安装开发环境
- sersync实现多台服务器实时同步文件
- matlab 参数辨识,Matlab系统辨识尝试之详细过程1
- SQL Server 2008 R2 完全卸载
- 驾驶机动车在高速公路上倒车、逆行、穿越中央分隔带掉头的一次记6分。
- C语言中side的用法,side的用法总结大全
- 戴尔台式计算机型号怎么查,戴尔台式电脑型号的查询方法
- python读取EXCEL的方式
- Linux学习整理-网络防火墙iptables-实践篇1
- netkeeper客户端 Linux,netkeeper_for_linux
- 二叉查找树的平衡(DSW)
热门文章
- 技术研究院006---B站自用的微服务框架——Kratos
- 快速开发框架工作笔记001---项目开发中整理_整合好的_springcloud快速开发框架_springcloud框架_springcloud架构
- springcache使用笔记003_注释驱动的 Spring cache 基本原理,注意和限制,@CacheEvict 的可靠性问题
- pylon 内存泄露的问题
- 给定单链表,检测是否有环等系列考题
- 3d激光雷达开发(绘制长方体)
- 随想录(objc的编译)
- Android九宫格闪烁,js实现九宫格点击按钮随机三个格子闪烁,发生错误
- 背景裁剪图片html,HTML5基础加强css样式篇(文本裁剪,背景裁剪:background-origin,background-position,background-clip)(三十七)...
- 2d 蓝图_“二渲三”打破传统思维!Netflix冲奥动画会推动2D动画变革吗?