关于yield关键字,网上有很多文章介绍了,但是看了之后,虽然明白了"哦,原来是这么回事",但是在日常开发中并没有真正的用起来,所以,写此一篇,介绍一下在真正的项目中怎么使用这个关键字。

开始我的正文介绍之前,可以先看一下微软的官方文档是怎么介绍yield关键字的,传送门:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/yield

在这里我新建了一个控制台程序,用于输出斐波那契数列,代码如下:我们直接在Main方法中输出斐波那契数列,这个也没有什么问题,很完美,但是考虑到实际开发中不可能把所有的处理都写在程序入口,所以我们考虑对这段代码封装一个方法V1

static void Main(string[] args)
{int a = , b = , c = ;
for (int i = ; i < ; i++)
{
Console.WriteLine("{0}", b);
c = a + b;
a = b;
b = c;
} //V1(10); //foreach (var i in V2(10))
//{
// Console.WriteLine(i);
//} //foreach (var i in V3(10))
//{
// Console.WriteLine(i);
//} Console.ReadKey();
}

方法V1代码如下:与Main方法中的代码段是一模一样的,那么有经验的同学肯定会想,既然已经封装了方法,那么方法的输出应该封装成返回值,返回给Main方法,然后再输出到控制台,于是我们再次修改,封装成方法V2

private static void V1(int number)
{
Console.WriteLine("V1");
int a = , b = , c = ;
for (int i = ; i < number; i++)
{
Console.WriteLine("{0}", b);
c = a + b;
a = b;
b = c;
}
}

方法V2代码如下:方法V2中创建了一个List<int>的列表,用来接收方法返回的结果,然后在Main方法中输出。那么这里有什么问题呢?问题就是如果循环的基数很大,那么,我们的List中的item就很大,占用内存也会随之增加,于是,我们在此基础上再次改造成方法V3

private static IEnumerable<int> V2(int number)
{
Console.WriteLine("V2");
List<int> vs = new List<int>();
int a = , b = , c = ;
for (int i = ; i < number; i++)
{
vs.Add(b);
c = a + b;
a = b;
b = c;
}
return vs;
}

方法V3代码如下:这里便用到了关键字yield,正如官方文档中所述,迭代器方法运行到 yield return 语句时,会返回一个 expression,并保留当前在代码中的位置。 下次调用迭代器函数时,将从该位置重新开始执行。这样的话,内存不会随着基数的增加而增加,而效果却是一模一样的。

private static IEnumerable<int> V3(int number)
{
Console.WriteLine("V3");
int a = , b = , c = ;
for (int i = ; i < number; i++)
{
yield return b;
c = a + b;
a = b;
b = c;
}
}

那么,总结经验,在你需要返回一个继承自IEnumerable的集合类型的时候,就可以使用这个yield关键字了。

最后的运行效果:

C# yield关键字的更多相关文章

  1. 从yield关键字看IEnumerable和Collection的区别

    C#的yield关键字由来以久,如果我没有记错的话,应该是在C# 2.0中被引入的.相信大家此关键字的用法已经了然于胸,很多人也了解yield背后的“延迟赋值”机制.但是即使你知道这个机制,你也很容易 ...

  2. .NET中的yield关键字

    浅谈yield http://www.cnblogs.com/qlb5626267/archive/2009/05/08/1452517.html .NET中yield关键字的用法 http://bl ...

  3. 使用yield关键字让自定义集合实现foreach遍历

    一般来说当我们创建自定义集合的时候为了让其能支持foreach遍历,就只能让其实现IEnumerable接口(可能还要实现IEnumerator接口) 但是我们也可以通过使用yield关键字构建的迭代 ...

  4. C#的yield关键字

    using System; using System.Collections.Generic; using System.Reflection; using System.Text.RegularEx ...

  5. 从range和xrange的性能对比到yield关键字(中)

    上节提出了range和xrange的效率问题,这节我们来探究其中的原因   yield的使用   我们看下面的程序: #coding: utf-8 def test(): print 4 print ...

  6. (转) Python Generators(生成器)——yield关键字

    http://blog.csdn.net/scelong/article/details/6969276 生成器是这样一个函数,它记住上一次返回时在函数体中的位置.对生成器函数的第二次(或第 n 次) ...

  7. 转载yield关键字理解

    实现IEnumerable接口及理解yield关键字   [摘要]本文介绍实现IEnumerable接口及理解yield关键字,并讨论IEnumerable接口如何使得foreach语句可以使用. 本 ...

  8. yield关键字的用法

    在上一篇文章中,说了下foreach的用法,但是还是比较复杂的,要实现接口才能进行遍历,有没有简单些的方法呢?答案是肯定的.且看下面. yield关键字的用法: 1.为当前类型添加一个任意方法,但是要 ...

  9. yield 关键字和迭代器

    一般使用方法     yield 关键字向编译器指示它所在的方法是迭代器块 在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值. 这是一个返回值,例如,在 forea ...

  10. C# 基础小知识之yield 关键字 语法糖

    原文地址:http://www.cnblogs.com/santian/p/4389675.html 对于yield关键字我们首先看一下msdn的解释: 如果你在语句中使用 yield 关键字,则意味 ...

随机推荐

  1. Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  2. 小白学 Python 爬虫(7):HTTP 基础

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  3. scrapy抓取人人网上的“新鲜事”

    利用scrapy模拟登陆人人网,笔者本打算抓取一下个人页面新鲜事,感觉这个网站越做越差,都懒得抓里面的东西了.这里仅仅模拟人人网登陆,说明一下scrapy的POST请求问题. 人人网改版之后,反爬措施 ...

  4. nginx实现内网服务唯一端口外网映射

    2.1         内网服务唯一端口外网映射 (一)       组网图 (二)       简要说明: 如标题所示,该功能可以实现内网环境下所有服务端口通过nginx的正向代理通过唯一端口映射至 ...

  5. Identityserver4配置证书

    IS4中如果token的类型是JWT,则需要使用RS256算法生成非对称签名,这意味着必须使用私钥来签名JWT token,并且必须使用对应的公钥来验证token签名,即验证token是否有效.使用R ...

  6. 【JavaEE】之MyBatis开发DAO

    在SSM框架中的DAO层就是MyBatis中的Mapper,Mapper分为两部分:Mapper接口(JAVA文件)和Mapper映射文件(XML文件).DAO开发(Mapper开发)有两种方式:原始 ...

  7. python基础-并发编程part01

    并发编程 操作系统发展史 穿孔卡片 读取数据速度特别慢,CPU利用率极低 单用户使用 批处理 读取数据速度特别慢,CPU利用率极低 联机使用 脱机批处理(现代操作系统的设计原理) 读取数据速度提高 C ...

  8. 使用Jq实现弹出层

    对于前端程序员来说,弹出层是经常用到的,下面我叫大家如何用实现JQuery实现弹出层的效果,代码如下: CSS:弹出层的效果 .mask { position: absolute; top: 0px; ...

  9. 大型情感剧集Selenium:2_options设置 #华为云·寻找黑马程序员#

    上集回顾 昨天说简单介绍了什么是selenium,它能干what,和发展史与梗概.当的是python如何通过pip安装selenium,并下载对应浏览器的webdriver. 最后简单通过一个Demo ...

  10. HC大会,华为联合合作伙伴发布一站式物联网IoT开发工具小熊派BearPi

    传统的物联网产品开发步骤复杂,涉及硬件开发.软件开发.云端开发等众多流程.而且产品的开发周期长.开发成本高.产品稳定性不佳.维护成本高.而物联网设备本身市场竞争激烈,价格低,设备更新迭代快,所以在保证 ...