C#.Net工作笔记009---c#中Yield Return语法的作用和好处
技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152
看到项目里用到了,查了一下,这个的作用是:
yield return会对当前执行的 保存,阻塞当前函数进程,然后回到当前执行的地方,这样有个好处,如果处理大量数据的话,
会处理一条,便显示一条,这样的话,不必要让用户等太久才能看到结果.
还是数据和以前一样,我先上代码,请大家先拿到我的代码或者你跟着敲,运行看效果,以及理解每行带代码的作用。
我们要带着为什么要用Yield这个关键字,不用可以吗这个目的去学知识,我相信会更加的有意思。
首先我贴出平时正常输出偶数集合的办法
/*
*
* 学习Yield Return 语法
* 使用两个方法,显示1 - 100之间的全部偶数
*
*
*/
using System;
using System.Collections.Generic;
namespace YieldReturn语法解析
{
class Program
{
static private List<int> _numArray; //用来保存1-100 这100个整数
Program() //构造函数。我们可以通过这个构造函数往待测试集合中存入1-100这100个测试数据
{
_numArray = new List<int>(); //给集合变量开始在堆内存上开内存,并且把内存首地址交给这个_numArray变量
for (int i = 1; i <= 100; i++)
{
_numArray.Add(i); //把1到100保存在集合当中方便操作
}
}
static void Main(string[] args)
{
new Program();
TestMethod();
}
//测试求1到100之间的全部偶数
static public void TestMethod()
{
foreach (var item in GetAllEvenNumber())
{
Console.WriteLine(item); //输出偶数测试
}
}
//测试我们正常情况下拿到全部偶数的方法
static IEnumerable<int> GetAllEvenNumber()
{
List<int> result = new List<int>(); //开集合内存存偶数用
foreach (int num in _numArray)
{
if(num % 2 == 0) //判断是不是偶数
{
//yield return num;
result.Add(num); //存入集合
}
}
//返回偶数集合变量 可能有人会觉得奇怪返回类型不是List<int>这样可以吗
//这个就要回到我们的里氏替换原则了,子类是可以替换父类的,也就是当父类用
//比如我这个方法是想得到IEnumerable<int> 类型变量,但是我给了List<int>类型变量
//注意List<int> 是继承 IEnumerable<int> 的,什么意思当我们把子类当父类使用,
//那么大才小用,因为子类很多都是继承父亲,你自身增加很多字段或者方法,这样就不能用了。
return result;
//yield break;
}
}
}
贴出使用Yiele Return办法输出耦合集合
/*
*
* 学习Yield Return 语法
* 使用两个方法,显示1 - 100之间的全部偶数
*
*
*/
using System;
using System.Collections.Generic;
namespace YieldReturn语法解析
{
class Program
{
static private List<int> _numArray; //用来保存1-100 这100个整数
Program() //构造函数。我们可以通过这个构造函数往待测试集合中存入1-100这100个测试数据
{
_numArray = new List<int>(); //给集合变量开始在堆内存上开内存,并且把内存首地址交给这个_numArray变量
for (int i = 1; i <= 100; i++)
{
_numArray.Add(i); //把1到100保存在集合当中方便操作
}
}
static void Main(string[] args)
{
new Program();
TestMethod();
}
//测试求1到100之间的全部偶数
static public void TestMethod()
{
foreach (var item in GetAllEvenNumber())
{
Console.WriteLine(item); //输出偶数测试
}
}
//测试我们使用Yield Return情况下拿到全部偶数的方法
static IEnumerable<int> GetAllEvenNumber()
{
foreach (int num in _numArray)
{
if(num % 2 == 0) //判断是不是偶数
{
yield return num; //返回当前偶数
}
}
yield break; //当前集合已经遍历完毕,我们就跳出当前函数,其实你不加也可以
//这个作用就是提前结束当前函数,就是说这个函数运行完毕了。
}
}
}
大家测试了2个代码结果没,是不是都可以正确拿到全部偶数集合,具体我需要你们测,这样进步快,才会真是学会。只看不练假把戏。
现在我们说他们的区别:
这个才是真正要学的地方
我们需要下断点
我希望你是在断点调试,具体就贴太多,你会发现代码跑到Yield return num的时候,当前函数就会结束,并把这个num交给这里,我先上图
最终会给item变量。
然后输出,然后在执行 GetAllEvenNumber()方法,和上次得到偶数是一样。
我们发现这个Yield Return是可以让当前函数的进程状态切换到阻塞状态,然后去选择了把cpu交给当前的出进程,这样就转而执行调用方函数。 (补充个小知识点其实我们写的程序加入到内存中,并不定就是一个进程,我们会根据情况分成几个子进程去干活,方便操作系统去管理以及多道程序运行在内存,提高计算机资源的利用率)
这样有个好处,我们假如有1000000个数据,我们需要得到里面的耦合,当我们通过这个方法得到一个耦合会立马显示在控制台上。而不是等很久也就把全部偶数都查找到存入集合当中,然后在一一遍历输出。
这个好处是很大的。比如我们用户可能就看数据开始肯定不是全部值需要部分就可以,看完这些在看后面的,这样数据会让觉得显示没有延迟。
下面我们来断点调一般的查找偶数的函数
我们发现这个循环没有跑完是不会退出当前函数的,也就是必须要查找全部的偶数才可以。这样假如我们很多数据。就会一直等这个数据才可以拿到这个数据去显示给用户看。
这样就麻烦了。
因此我们下个结论:Yield Return关键字的作用就是退出当前函数,并且会保存当前函数执行到什么地方,也就上下文。你发现没下次执行这个函数上次跑来的代码是不会重复执行的,
但是你一般的return result 假如你在循环体提前return ,下面调这个函数是会从第一步开始重新执行的。不会记录上次执行的地方
---------------------
C#.Net工作笔记009---c#中Yield Return语法的作用和好处相关推荐
- C#中yield return用法分析
转载地址:https://www.jb51.net/article/54810.htm 这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield ret ...
- C#中yield return用法
转载:http://www.jb51.net/article/54810.htm http://www.cnblogs.com/HunterWei/archive/2012/06/13/csharpy ...
- Unity中 yield return 1 的误区
曾经一度认为,使用IEnumerator时yield return 1代表的是等一帧,yield return 100是等100帧,网上也有很多这样的帖子,其实发现是不正确的. yield retur ...
- JS 中的return false的作用
在大多数情况下,为事件处理函数返回false,可以防止默认的事件行为. Return False 就相当于终止符,终止默认的事件行为,反之,Return True 就相当于执行符,执行终止默认的事件行 ...
- 架构设计工作笔记004---架构中常见的概念积累--随时更新
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 1.仓储在企业的整个供应链中起着至关重要的作用,如果不能保证正确的进货和库存控制及发货,将会导致管 ...
- VB.NET工作笔记007---ASP.NET中Session超时一直不起作用
技术交流QQ群[JAVA,.NET,BigData,AI]:170933152 最后发现是这个原因,在IIS中找到应用程序池,然后右边点击,详细设置,然后找到,进程模块中的 最大工作进程数,设置为1 ...
- Java工作笔记-Spring boot中配置文件加密(Jasypt的使用)
Jasypt Spring Boot提供了Spring Boot应用程序配置文件的加密.有下面3种方式在项目中集成jasypt-spring-boot: 1. 在classpath中添加jasypt- ...
- C++工作笔记-在项目中解决编码问题小技巧
这里是在项目中看到某大佬是这样用的,在此记录下以后也这样做,方便日后调试. 在linux上,文件有2个类型的编码,一个是UTF-8,一个是ASCII. 在使用QtCreator创建项目的时候默认是UT ...
- Java工作笔记-Spring Boot中使用Mybatis操作达梦数据库
这里以达梦数据库为例,使用MyBatis对数据库进行增删改查 这里先给出截图 此处为了简单,直接在Controller里面调用dao中数据: 关键代码如下: application.propertie ...
最新文章
- 分布式深度学习DDL解析
- JSON——IT技术人员都必须要了解的一种数据交换格式
- 无法打开Win11系统小组件怎么办
- angular监听输入框值的变化_如何检测Angular中@Input()值何时发生变化?
- 广成 USBCAN-II Pro V502 linux下升级经验
- python中syntaxerror_【已解决】Python中两个星号**参数去传递给函数出错:SyntaxError invalid syntax...
- Ngnix中的fastcgi参数性能优化和解释
- Adversarial examples in the physical world论文解读
- javascript监听输入框_js与jquery实时监听输入框值的oninput与onpropertychange方法
- Qt qmake和mingw32-make
- 2019CBA全明星周末大幕落下 南方明星队大比分获胜
- 政府应用系统应用解决方案
- Android点击打开微信
- 盘点10款超好用的数据可视化工具
- mW和dBm的换算公式
- python数学建模--时间序列模型--指数平滑
- Nacos 2.1.0 正式发布!堪称最强!
- NFT Insider #87:The Sandbox 收购游戏开发工作室 Sviper,GHST 大迁徙即将拉开帷幕
- 【asp.net小札记】Repeater自定义添加排序按钮+显示图片
- 哈工大2020人工智能期末考试复习