C#中yield关键字理解

yield关键字之前用得较少,但是在做项目开发的过程中也遇到了,当时有点迷惑,就顺便研究学习了一下,以下是个人理解,不到之处欢迎拍砖!废话就到这,上代码:

class Program
{
static void Main(string[] args)
{
string[] strs = new string[] { "1", "2", "3", "4" };
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 后直接一行代码返回,代码精简了许多;可以理解成一个容器,先这么使用;(注意:这里的理解不正确)

下面来看正确理解:

对上述代码进行改造:

 1      static void Main(string[] args)
 2         {
 3             string[] strs = new string[] { "1", "2", "3", "4" };
 4
 5             foreach (var item in GetInts(strs))
 6             {
 7                 if (item>2)
 8                 {
 9                     break;
10                 }
11                 Console.WriteLine(item.GetType() + "----" + item);
12
13             }
14             Console.ReadKey();
15         }
16
17         static IEnumerable<int> GetInts(string[] strs)
18         {
19             foreach (var item in strs)
20             {
21                 Console.WriteLine(item.GetType());
22
23                 //这里写了个扩展方法
24                 yield return item.ToInt32();
25             }
26         }
27     }

注意标红色部分的代码,下面来看执行结果:

说明:正常我们不加yield关键字的时候,是需要先把整个GetInts()方法体内的foreach循环全部执行完后,然后才做判断,现在不一样了,可以通过代码调试发现:yield会执行到yield return这行代码后进行冻结,然后把控制权转交到外部,只要满足条件if(item>2){break;},所以我们通过结果可以发现他的执行顺序,由此可以放大,现在仅仅是个数组数据小,如果有成千上万行的对象数据,那么他的性能就非常明显,找到满足的条件就可以返回结果;

总结:当前代码示例 yield 关键字 一次性返回过来,这种一种用法,不过理解错误;正确理解为:将当前代码块执行冻结,将控制权交给外界,一旦得到想要的结果立即返回,不往下执行。更多的可以参考开源项目:如EF和MVC中大量使用。

如有兴趣,欢迎大家加入微软实战训练营QQ群203822816进行技术探讨交流,里面有国内最新C#技术,绝对最新哦!!!


时间: 2024-10-17 10:48:06

C#中yield关键字理解的相关文章

C#中yield关键字的使用个人总结

C#中yield关键字的使用个人总结: 1.首先,yield必须与return或者break组合在一起才能使用. 2.其次,必须在循环体中使用. 3.必须在迭代器块代码中使用. 在foreach语句中,in 后面跟随的对象,必须是IEnumerable“对象”(注:事实上,在C#里,接口是没有实例化的对象.但是,我们是可以创建“接口类型”的变量.然后可以把“继承了该接口的类”的对象赋给该变量.通过接口的多态性,使用这个变量.如果把接口理解成类,就很好理解了:若BClass继承于AClass,对于

理解 ES6 语法中 yield 关键字的返回值

在 ES6 中新增了生成器函数的语法,本文解释了生成器函数内 yield 关键字的返回值. 描述 根据语法规范,yield 关键字用来暂停和继续执行一个生成器函数.当外部调用生成器的 next() 方法时,yield 关键字右侧的表达式才会执行. 执行结果会转化为一个对象(包含两个属性, value 和 done),作为 next() 方法的返回值. 对于  var foo = yield expression 语句,yield 左侧变量 foo 的值将在下一次调用 next() 方法时获得,并

Java中synchronized关键字理解

好记性不如烂笔头~~ 并发编程中synchronized关键字的地位很重要,很多人都称它为重量级锁.利用synchronized实现同步的基础:Java中每一个对象都可以作为锁.具体表现为以下三种形式. (1)对于普通同步方法,锁是当前实例对象. (2)对于静态同步方法,锁是当前类的Class对象. (3)对于同步方法块,锁是synchronized括号里配置的对象. 一.普通同步方法 使用synchronized关键字修饰一个普通方法,锁住的是当前实例的对象.当synchronized锁住该对

.NET中的yield关键字

浅谈yield http://www.cnblogs.com/qlb5626267/archive/2009/05/08/1452517.html .NET中yield关键字的用法 http://blog.csdn.net/aspnet2002web/article/details/6083417 When you use the yield keyword in a statement, you indicate that the method, operator, or get access

[转]Python中yield的解释

转自: http://python.jobbole.com/83610/ 本文作者: 伯乐在线 - wklken .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 翻译 来源于stackoverflow问答,原文链接 Here SN上面看到的,顺手翻译下,第一次翻译,好多地方翻的不是很好 :) 问题: 1 Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 1 2 3 def node._get_child_candidates(self, distance,

Python3 中 Yield 理解与使用

转自Felix文章 Python3 中 yield 对初学者一直是一个难点存在,网上很多教程,噼里啪啦写了很多,也举了很多例子,但是读完之后还是不知所以然,下面问题还是不知道如何回答,内容有点多,有些地方可能有点啰嗦,但都是满满的干货. - yield 究竟是干嘛的? - yield 是怎么执行的? - yield 的好处是什么? 1. 迭代器与可迭代对象 开始之前,先理解一下迭代器与可迭代对象,因为 yield 其实是一种特殊的迭代器,不过这种迭代器更加优雅. 可迭代对象 # 可迭代对象:列表

【转载】理解C语言中的关键字extern

原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻译了一下.(原文:http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/)   我确定这篇文章对c语言的初学者会有很大的帮助,因为这将使他们更好更熟练的使用c语言.所以就让我先来说说extern关键字在变量和函数上的应用.最基本

python中yield的用法及生成器的理解

首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受. 接下来是正题: 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了.看做return之后再把它看做一个是

[转]C#中yield用法

yield 关键字向编译器指示它所在的方法是迭代器块.编译器生成一个类来实现迭代器块中表示的行为.在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值.这是一个返回值,例如,在 foreach 语句的每一次循环中返回的值.yield 关键字也可与 break 结合使用,表示迭代结束. 例子:yield return <expression>;yield break; 在 yield return 语句中,将计算 expression 并将结果以值的形式返回给枚举