关于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关键字了。

最后的运行效果:

最新文章

  1. git clone 失败问题解决方案
  2. 【摘】top命令
  3. Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试
  4. JS一个根据时区输出时区时间的函数
  5. 从零开始攻略PHP(6)——代码重用与函数编写的一些注意事项
  6. 第二个sprint第一天
  7. Fixing Poor MySQL Default Configuration Values
  8. 【转】 CSS3阴影 box-shadow的使用和技巧总结
  9. epoll 知识总结
  10. ****JFinal 部署在 Tomcat 下推荐方法
  11. [iOS基础控件 - 3.5] NSBundle, UIImageView和UIButton的区别, 模拟器和文档
  12. asp.net中application,cookies,stateview,session的使用
  13. iOS开发——高级技术&amp;广告功能的实现
  14. python使用pyapns进行ios推送消息
  15. 和Eclipse一起走过的日子
  16. static class - 静态类
  17. 初识hadoop-历史及其家族(日志一)
  18. NancyFX 第六章 视图引擎
  19. JS中some()和every()和join()和concat()和pop(),push(),shift(),unshfit()和map()和filter()
  20. ansible批量自动安装LNMP

热门文章

  1. 带你涨姿势的认识一下 Kafka 消费者
  2. 20191031-9 beta week 1/2 Scrum立会报告+燃尽图 07
  3. HTML学习 day04
  4. 2019-9-9:渗透测试,docker下载dvwa,使用报错型sql注入dvwa
  5. http_web_cache
  6. es5设置属性不能修改
  7. 程序员的算法课(19)-常用的图算法:最短路径(Shortest Path)
  8. SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”
  9. js消除小游戏(极简版)
  10. CSS3(1)---圆角边框、边框阴影