C# yield关键字
关于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关键字的更多相关文章
- 从yield关键字看IEnumerable和Collection的区别
C#的yield关键字由来以久,如果我没有记错的话,应该是在C# 2.0中被引入的.相信大家此关键字的用法已经了然于胸,很多人也了解yield背后的“延迟赋值”机制.但是即使你知道这个机制,你也很容易 ...
- .NET中的yield关键字
浅谈yield http://www.cnblogs.com/qlb5626267/archive/2009/05/08/1452517.html .NET中yield关键字的用法 http://bl ...
- 使用yield关键字让自定义集合实现foreach遍历
一般来说当我们创建自定义集合的时候为了让其能支持foreach遍历,就只能让其实现IEnumerable接口(可能还要实现IEnumerator接口) 但是我们也可以通过使用yield关键字构建的迭代 ...
- C#的yield关键字
using System; using System.Collections.Generic; using System.Reflection; using System.Text.RegularEx ...
- 从range和xrange的性能对比到yield关键字(中)
上节提出了range和xrange的效率问题,这节我们来探究其中的原因 yield的使用 我们看下面的程序: #coding: utf-8 def test(): print 4 print ...
- (转) Python Generators(生成器)——yield关键字
http://blog.csdn.net/scelong/article/details/6969276 生成器是这样一个函数,它记住上一次返回时在函数体中的位置.对生成器函数的第二次(或第 n 次) ...
- 转载yield关键字理解
实现IEnumerable接口及理解yield关键字 [摘要]本文介绍实现IEnumerable接口及理解yield关键字,并讨论IEnumerable接口如何使得foreach语句可以使用. 本 ...
- yield关键字的用法
在上一篇文章中,说了下foreach的用法,但是还是比较复杂的,要实现接口才能进行遍历,有没有简单些的方法呢?答案是肯定的.且看下面. yield关键字的用法: 1.为当前类型添加一个任意方法,但是要 ...
- yield 关键字和迭代器
一般使用方法 yield 关键字向编译器指示它所在的方法是迭代器块 在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值. 这是一个返回值,例如,在 forea ...
- C# 基础小知识之yield 关键字 语法糖
原文地址:http://www.cnblogs.com/santian/p/4389675.html 对于yield关键字我们首先看一下msdn的解释: 如果你在语句中使用 yield 关键字,则意味 ...
随机推荐
- Python和BeautifulSoup进行网页爬取
在大数据.人工智能时代,我们通常需要从网站中收集我们所需的数据,网络信息的爬取技术已经成为多个行业所需的技能之一.而Python则是目前数据科学项目中最常用的编程语言之一.使用Python与Beaut ...
- Java基础IO类之字节输入输出流
一.IO流概述 1.IO流:输入输出流(Input/Output) 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象,即数据在设备间的传输流, 流的本质是数据传输,根据数据传输特性将 ...
- pyenv virtualenv和virtualwrapper
pyenv pyenv最大的优势是:可以在”全局”管理不同版本的Python, 可以随时配置当前的使用的Python版本,并对其他使用Python解释器的程序生效.当系统安装多个版本的Python,使 ...
- Session.run() & Tensor.eval()
如果有一个Tensor t,在使用t.eval()时,等价于: tf.get_defaut_session().run(t) t = tf.constant(42.0) sess = tf.Sessi ...
- iptables简单命令
IPTables是基于Netfilter基本架构实现的一个可扩展的数据报高级管理系统或核外配置工具,利用table.chain.rule三级来存储数据报的各种规则.Netfilter-iptables ...
- Netty网络框架
Netty网络框架 Netty是一个异步的基于事件驱动的网络框架. 为什么要使用Netty而不直接使用JAVA中的NIO 1.Netty支持三种IO模型同时支持三种Reactor模式. 2.Netty ...
- python元类深入解析
元类 什么是元类 元类是类的类,是类的模板(就如对象的模板是类一样) 元类的实例为类,类的实例为对象 元类是用来产生类的 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,是运行时动 ...
- 爬取电影top250 电影名 导演 演员 风格 国家 时长 评分 录入mySQL数据库
import requestsfrom lxml import etreeimport reimport pymysqlimport time conn = pymysql.connect(host= ...
- 格式化JS代码
平常在项目中经常会遇到下载别人的js文件都是加密过的,不方便阅读都是一整行, 个人无法进行阅读,浏览器能够识别出来,所以就可以使用浏览器进行格式化js代码: 1.打开浏览器chrome为例,打开使用j ...
- 小白的springboot之路(四)、mybatis-generator自动生成mapper和model、dao
0-.前言 在用mybatis开发项目中,数据库动辄上百张数据表,如果你一个一个去手动编写,比较耗费时间:还好,我们有mybatis-generator插件,只需简单几步就能自动生成mybatis的m ...