转载自: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的研究(转载)相关推荐

  1. Unity StartCoroutine 和 yield return 深入研究

    http://www.cnblogs.com/fly-100/p/3910515.html 转载于:https://www.cnblogs.com/jiahuafu/p/5919895.html

  2. IEnumerator/ IEnumerable/ yield return/ StartCoroutine 详解

    Update逻辑 IEnumerator/ IEnumerable public interface IEnumerable { IEnumerator GetEnumerator(); } publ ...

  3. 可惜Java中没有yield return

    项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...

  4. yield return的理解

    一直在实际开发中都有用到yield return,但也一直只停留在"用"的层面上,可谓一知半解.今天下班回来自己查证思考了半天,本着自己的原则一切从简提炼了一下几点(正确与否有待进 ...

  5. C#中,什么时候用yield return

    yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 有这样的一个int类型的集合: static Lis ...

  6. //yield return用于无缝实现迭代模式。

    代码  public class YieldReturn     {         //yield return用于无缝实现迭代模式.             string[] strArr;    ...

  7. C#中yield return用法

    转载:http://www.jb51.net/article/54810.htm http://www.cnblogs.com/HunterWei/archive/2012/06/13/csharpy ...

  8. C#中yield return用法分析

    转载地址:https://www.jb51.net/article/54810.htm 这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield ret ...

  9. yield学习续:yield return迭代块在Unity3D中的应用——协程

    必读好文推荐: Unity协程(Coroutine)原理深入剖析 Unity协程(Coroutine)原理深入剖析再续 上面的文章说得太透彻,所以这里就记一下自己的学习笔记了. 首先要说明的是,协程并 ...

最新文章

  1. 合并多个excel——贼快
  2. 19图的搜索算法总结与比较
  3. 周五话营销 | 健身房花式卖卡,诠释点击营销流
  4. mysql索引 聚集索引_Mysql 索引实现原理. 聚集索引, 非聚集索引
  5. 类、变量、块、构造器、继承初始化顺序,终极解答
  6. Photoshop的基本操作
  7. 将两大小完全相同的照片进行加权混合对比
  8. Yii2 使用 RESTful 写API接口 实例
  9. 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?
  10. Android之安装开发环境
  11. sersync实现多台服务器实时同步文件
  12. matlab 参数辨识,Matlab系统辨识尝试之详细过程1
  13. SQL Server 2008 R2 完全卸载
  14. 驾驶机动车在高速公路上倒车、逆行、穿越中央分隔带掉头的一次记6分。
  15. C语言中side的用法,side的用法总结大全
  16. 戴尔台式计算机型号怎么查,戴尔台式电脑型号的查询方法
  17. python读取EXCEL的方式
  18. Linux学习整理-网络防火墙iptables-实践篇1
  19. netkeeper客户端 Linux,netkeeper_for_linux
  20. 二叉查找树的平衡(DSW)

热门文章

  1. 技术研究院006---B站自用的微服务框架——Kratos
  2. 快速开发框架工作笔记001---项目开发中整理_整合好的_springcloud快速开发框架_springcloud框架_springcloud架构
  3. springcache使用笔记003_注释驱动的 Spring cache 基本原理,注意和限制,@CacheEvict 的可靠性问题
  4. pylon 内存泄露的问题
  5. 给定单链表,检测是否有环等系列考题
  6. 3d激光雷达开发(绘制长方体)
  7. 随想录(objc的编译)
  8. Android九宫格闪烁,js实现九宫格点击按钮随机三个格子闪烁,发生错误
  9. 背景裁剪图片html,HTML5基础加强css样式篇(文本裁剪,背景裁剪:background-origin,background-position,background-clip)(三十七)...
  10. 2d 蓝图_“二渲三”打破传统思维!Netflix冲奥动画会推动2D动画变革吗?