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 关键字,则意味 ...
 
随机推荐
- Linux配置SSH和Xshell连接服务器
			
>>>>>Ubuntu安装和配置ssh教程 SSH分为客户端 openssh-client 和服务器 openssh-server,可以利用以下命令确认电脑 上是否安装了 ...
 - Github远程库与Git本地库连接
			
Github远程库与Git本地库连接 以下有任何[]符号只是将内容扩起,输入命令不需要将[]加入 创建SSH Key 用户主目录有.ssh->id_rsa和id_rae.pub->直接跳过 ...
 - 2019-9-9:渗透测试,基础学习,pydictor使用,sql盲注,docker使用,笔记
			
pydictor,强大的密码生成工具,可以合并密码字典,词频统计,去重,枚举数字字典生成字典python3 pydictor.py -base d --len 4 4 生成纯数字4位密码python3 ...
 - Power Query系列 - 排序Ranking
			
Power Query系列 - 排序Ranking 难度: ★★☆☆☆(1星) 适用范围: ★★★☆☆(3星) 概况: 在数据分析中,我们常常需要对数据进行排序,同时我们想知道某个项目或者产品的排名, ...
 - promise实现图片按照指定的加载顺序执行
			
promise实现图片按照指定的加载顺序执行,先加载第二张,再加载第一张,最后加载第三张 <!DOCTYPE html> <html lang="en"> ...
 - Linux01机和Linux02机的切换 和秘钥的配置
			
先试一下 01机和02机是否可以切换成功 使用 ssh root@ip地址 输入密码 ifconfig查看ip是否正确 切换回01机 01机配置的秘钥 查看隐形文件 01机配置秘钥 输入 ssh-c ...
 - SpringCloud Sleuth + Zipkin 实现链路追踪
			
一.Sleuth介绍 为什么要使用微服务跟踪? 它解决了什么问题? 1.微服务的现状? 随着业务的发展,单体架构变为微服务架构,并且系统规模也变得越来越大,各微服务间的调用关系也变得越来越复杂 ...
 - JavaScript如何创建一个对象
			
我们可以利用JavaScript的语法特征,以类的思想来创建对象. 方法一:原始方法代码如下: <script> var obj = new Object(); obj.name = &q ...
 - C语言I作业10
			
问题 回答 这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/10100 我在 ...
 - 【洛谷P1835】素数密度
			
题目描述: 给定区间[L,R](L≤R≤2147483647,R-L≤1000000),请计算区间中素数的个数. 思路: 暴力: 蒟蒻:哦?绿题?这么水?(便打出下面代码) 这绝对是最容易想到的!但, ...