C#中yield return用法分析
这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield 
return的用法,需要的朋友可以参考下.
本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解。具体如下:
yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历。
有这样的一个int类型的集合:
static List<int> GetInitialData() {   return new List<int>(){1,2,3,4}; }static IEnumerable<int> FilterWithoutYield() {   List<int> result = new List<int>();   foreach (int i in GetInitialData())   {  if (i > 2)  {    result.Add(i);  }    }   return result; }static void Main(string[] args) {   foreach (var item in FilterWithoutYield())   {  Console.WriteLine(item);   }   Console.ReadKey();  }输出结果:3,4
使用yeild return实现
static IEnumerable<int> FilterWithYield() {   foreach (int i in GetInitialData())   {  if (i > 2)  {    yield return i;  }   }   yield break;   Console.WriteLine("这里的代码不执行"); }static void Main(string[] args) {   foreach (var item in FilterWithYield())   {  Console.WriteLine(item);   }   Console.ReadKey();  }总结:
通过单步调试发现:
虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。
第一种方法,客户端调用过程大致为:

使用yield return,客户端调用过程大致为:

使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?
--因为,编译器会生成一个状态机来维护迭代器的状态。
简单地说,当希望获取一个IEnumerable<T>类型的集合,而不想把数据一次性加载到内存,就可以考虑使用yield return实现"按需供给"。
C#中yield return用法分析的更多相关文章
- C#中yield return用法
		转载:http://www.jb51.net/article/54810.htm http://www.cnblogs.com/HunterWei/archive/2012/06/13/csharpy ... 
- C# yield return用法
		本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yi ... 
- C#中的yield return用法演示源码
		下边代码段是关于C#中的yield return用法演示的代码. using System;using System.Collections;using System.Collections.Gene ... 
- C# yield return 用法与解析
		原文:C# yield return 用法与解析 C# yield return 用法与解析 本文参考自:http://www.jb51.net/article/54810.htm 当初没有认真理解 ... 
- nodejs中yield的用法?
		nodejs中yield的用法? https://www.zhihu.com/question/32752866?sort=created 
- Python Deque 模块使用详解,python中yield的用法详解
		Deque模块是Python标准库collections中的一项. 它提供了两端都可以操作的序列, 这意味着, 你可以在序列前后都执行添加或删除. https://blog.csdn.net/qq_3 ... 
- python生成器中yield和send分析
		生成器 在python中生成器是指用代码实现迭代器的的功能本质还是迭代器,只不过是代码实现迭代器功能.在python中生成器是由函数实现的,通常我们在函数中加入yeild就可以实现生成器. 生成器中y ... 
- Unity中yield return null和yield return WaitForEndOfFrame的区别
		2017/07/04修改 - 对WaitForEndOfFrame的LateUpdate时序进行说明. 测试结论: 1.如果只是等待下一帧执行,用yield return null即可.调用顺序在Up ... 
- C#中var关键字用法分析
		原文连接 本文实例分析了C#中var关键字用法.分享给大家供大家参考.具体方法如下: C#关键字是伴随着.NET 3.5以后,伴随着匿名函数.LINQ而来, 由编译器帮我们推断具体的类型.总体来说,当 ... 
随机推荐
- 使用SQL对数据进行整理
			网上下的全国 省市区 数据比较乱(http://qq704855854.blog.163.com/blog/static/19111835520142319275411/).导入后,进行整理. SQL ... 
- Linux下通过NFS共享文件夹
			测试环境:CentOS 6.7 服务端 # yum -y install nfs-utils rpcbind # 开启服务 service nfs start service rpcbind star ... 
- EF结合三层:三层中数据层父类和业务层父类的使用
			今天我们主要讨论下数据层父类和业务层父类的使用.众所周知,数据层无非就是实现增删改查的方法.无论是哪个实体类,无非就是为了实现增删改查方法,所有我们在三层的DAL层封装了一个BaseDAL类,来做增删 ... 
- QWidget 实现 打破布局 或者 当前窗体内的 弹窗   (借助伪造实现)
			but = QtWidgets.QToolButton(Dialog2) but.setText('**') but.setAutoRaise(True) layout.addWidget(but) ... 
- SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE
			1.创建表 Staff CREATE TABLE [dbo].[Staff]( ,) NOT NULL, ) NULL, ) NULL, ) NULL, [Money] [int] NULL, [Cr ... 
- bundle与package区别与联系
			转:http://blog.csdn.net/lmbda/article/details/17895619 bundle是Apple提供的软件安装的便捷方法. bundle为用户和开发者提供了一个简单 ... 
- (转)【Unity3d】Glow + Outline 轮廓描边
			转:http://www.cnblogs.com/dosomething/archive/2012/08/04/2622488.html [Unity3d]Glow + Outline 轮廓描边 轮廓 ... 
- windows环境下Eclipse开发MapReduce程序遇到的四个问题及解决办法
			按此文章<Hadoop集群(第7期)_Eclipse开发环境设置>进行MapReduce开发环境搭建的过程中遇到一些问题,饶了一些弯路,解决办法记录在此: 文档目的: 记录windows环 ... 
- Apex Design Patterns
			Apex allows you to build just about any custom solution on the Force.com platform. But what are the ... 
- [C] zlstdint(让VC、TC等编译器自动兼容C99的整数类型)V1.0。支持Turbo C++ 3等DOS下的编译器
			作者:zyl910 以前我曾为了让VC++等编译器支持C99的整数类型,便编写了c99int库来智能处理(http://www.cnblogs.com/zyl910/p/c99int_v102.htm ... 
