C#中yield关键字理解
yield关键字之前用得较少,但是在做项目开发的过程中也遇到了,当时有点迷惑,就顺便研究学习了一下,以下是个人理解,不到之处欢迎拍砖!废话就到这,上代码:
class Program
{
static void Main(string[] args)
{
string[] strs = new string[] { "", "", "", "" };
foreach (var item in GetInts(strs))
{
Console.WriteLine(item.GetType() + "----" + item);
}
Console.ReadKey();
}
static IEnumerable<int> GetInts(string[] strs)
{
foreach (var item in strs)
{
//这里写了个扩展方法 yield return item.ToInt32();
}
}
}
执行结果:

简单说明:(1)正常我们返回值的时候,可以将GetInts方法写成一个List方法接受返回,代码多行List.Add()不说,用完yeild return 后直接一行代码返回,代码精简了许多;可以理解成一个容器,先这么使用;(注意:这里的理解不正确)
下面来看正确理解:
对上述代码进行改造:
static void Main(string[] args)
{
string[] strs = new string[] { "", "", "", "" }; foreach (var item in GetInts(strs))
{
if (item>2)
8 {
9 break;
10 }
Console.WriteLine(item.GetType() + "----" + item); }
Console.ReadKey();
} static IEnumerable<int> GetInts(string[] strs)
{
foreach (var item in strs)
{
Console.WriteLine(item.GetType()); //这里写了个扩展方法
yield return item.ToInt32();
}
}
} 注意标红色部分的代码,下面来看执行结果:

说明:正常我们不加yield关键字的时候,是需要先把整个GetInts()方法体内的foreach循环全部执行完后,然后才做判断,现在不一样了,可以通过代码调试发现:yield会执行到yield return
这行代码后进行冻结,然后把控制权转交到外部,只要满足条件if(item>2){break;},所以我们通过结果可以发现他的执行顺序,由此可以放大,现在仅仅是个数组数据小,如果有成千上万行的对象
数据,那么他的性能就非常明显,找到满足的条件就可以返回结果; 总结:当前代码示例 yield 关键字 一次性返回过来,这种一种用法,不过理解错误;正确理解为:将当前代码块执行冻结,将控制权交给外界,一旦得到想要的结果立即返回,不往下执行。
更多的可以参考开源项目:如EF和MVC中大量使用。 如有兴趣,欢迎大家加入微软实战训练营QQ群203822816进行技术探讨交流,里面有国内最新C#技术,绝对最新哦!!!
C#中yield关键字理解的更多相关文章
- 理解 ES6 语法中 yield 关键字的返回值
在 ES6 中新增了生成器函数的语法,本文解释了生成器函数内 yield 关键字的返回值. 描述 根据语法规范,yield 关键字用来暂停和继续执行一个生成器函数.当外部调用生成器的 next() 方 ...
- 理解 ES6 语法中 yield* 关键字的作用
在 ES6 中新增了生成器函数的语法,本文解释了与生成器函数有关的 yield* 关键字,及其使用场景. 描述 根据语法规范,yield* 的作用是代理 yield 表达式,将需要函数本身产生(yie ...
- 转载yield关键字理解
实现IEnumerable接口及理解yield关键字 [摘要]本文介绍实现IEnumerable接口及理解yield关键字,并讨论IEnumerable接口如何使得foreach语句可以使用. 本 ...
- C# 中yield关键字解析
前言 前段时间了解到yield关键字,一直觉得还不错.今天给大家分享一下yield关键字的用法.yield return 返回集合不是一次性返回所有集合元素,而是一次调用返回一个元素.具体如何使用yi ...
- Java中synchronized关键字理解
好记性不如烂笔头~~ 并发编程中synchronized关键字的地位很重要,很多人都称它为重量级锁.利用synchronized实现同步的基础:Java中每一个对象都可以作为锁.具体表现为以下三种形式 ...
- python中yield的理解
首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂 ...
- Python中yield深入理解
众所周知,python中的yield有这样的用法: def test(alist): for i in alist: yield i 这样,这个test函数就变成了一个生成器,当每次调用的时候,就会自 ...
- C++中const关键字 理解
const:符号常量 使用符号常量写出的代码更容易维护:指针是边读边移动,而不是边写边移动,许多函数参数是只读不写的. const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替 ...
- .NET中的yield关键字
浅谈yield http://www.cnblogs.com/qlb5626267/archive/2009/05/08/1452517.html .NET中yield关键字的用法 http://bl ...
随机推荐
- javascript call和apply
每个函数都包含两个非继承而来的方法:call和apply. 我们可以通过这两个方法来间接调用函数.可以这样: f.call(o); f.apply(o); //o对象间接调用了f函数 这与下面的功能相 ...
- jquery扩展方法案例
-----------------扩展方法: $.extend({ "max": function (a, b) { if (a > b) return a; }, &quo ...
- SQL Server 2014 新特性:IO资源调控
谈谈我的微软特约稿:<SQL Server 2014 新特性:IO资源调控> 2014-07-01 10:19 by 听风吹雨, 570 阅读, 16 评论, 收藏, 收藏 一.本文所涉及 ...
- DropDownList和GridView用法
DropDownList和GridView用法 DropDownList控件和GridView控件在Asp.net中相当常用,以下是控件的解释,有些是常用的,有些是偶尔的,查找.使用.记录,仅此而 ...
- thrift之TTransport层的内存缓存传输类TMemoryBuffer
内存缓存是简单的在内存进行读写操作的一种传输,任何时候想在上面写入数据都是放入缓存中,任何时候读操作数据也是来至于缓存.内存缓存的分配使用c语言的malloc类函数,分配的长度是需要长度的两倍,需要考 ...
- iOS基础 - 数据库CoreData
一.iOS应用数据存取的常用方式 XML属性列表 —— PList NSKeyedArchiver 归档 Preference(偏好设置) SQLite3 Core Data 二.Core Data简 ...
- IOS内存泄漏
1. . - (void)viewDidLoad { [superviewDidLoad]; self.view.frame=CGRectMake(, , , ); NSArray *title1=[ ...
- 欧几里德算法及其扩展(推导&&模板)
有关欧几里德算法整理: 1.一些相关概念: <1>.整除性与约数: ①一个整数可以被另外一个整数整除即为d|a(表示d整除a,通俗的说是a可以被d整除),其含义也可以说成,存在某个整数k, ...
- windbg Symbol file path
SOS是一个调试器扩展,用于调试.NET应用程序.它提供了一组非常丰富的命令,这些命令使开发人员可以对CLR进行深入分析,并且有助于找出应用程序中各种复杂错误的原因. 由于SOS能够提供CLR内部 ...
- logstash+elasticsearch+kibana快速搭建日志平台
使用logstash+elasticsearch+kibana快速搭建日志平台 日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: 根据关键字查询日 ...