技术交流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语法的作用和好处相关推荐

  1. C#中yield return用法分析

    转载地址:https://www.jb51.net/article/54810.htm 这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield ret ...

  2. C#中yield return用法

    转载:http://www.jb51.net/article/54810.htm http://www.cnblogs.com/HunterWei/archive/2012/06/13/csharpy ...

  3. Unity中 yield return 1 的误区

    曾经一度认为,使用IEnumerator时yield return 1代表的是等一帧,yield return 100是等100帧,网上也有很多这样的帖子,其实发现是不正确的. yield retur ...

  4. JS 中的return false的作用

    在大多数情况下,为事件处理函数返回false,可以防止默认的事件行为. Return False 就相当于终止符,终止默认的事件行为,反之,Return True 就相当于执行符,执行终止默认的事件行 ...

  5. 架构设计工作笔记004---架构中常见的概念积累--随时更新

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 1.仓储在企业的整个供应链中起着至关重要的作用,如果不能保证正确的进货和库存控制及发货,将会导致管 ...

  6. VB.NET工作笔记007---ASP.NET中Session超时一直不起作用

    技术交流QQ群[JAVA,.NET,BigData,AI]:170933152 最后发现是这个原因,在IIS中找到应用程序池,然后右边点击,详细设置,然后找到,进程模块中的 最大工作进程数,设置为1 ...

  7. Java工作笔记-Spring boot中配置文件加密(Jasypt的使用)

    Jasypt Spring Boot提供了Spring Boot应用程序配置文件的加密.有下面3种方式在项目中集成jasypt-spring-boot: 1. 在classpath中添加jasypt- ...

  8. C++工作笔记-在项目中解决编码问题小技巧

    这里是在项目中看到某大佬是这样用的,在此记录下以后也这样做,方便日后调试. 在linux上,文件有2个类型的编码,一个是UTF-8,一个是ASCII. 在使用QtCreator创建项目的时候默认是UT ...

  9. Java工作笔记-Spring Boot中使用Mybatis操作达梦数据库

    这里以达梦数据库为例,使用MyBatis对数据库进行增删改查 这里先给出截图 此处为了简单,直接在Controller里面调用dao中数据: 关键代码如下: application.propertie ...

最新文章

  1. 分布式深度学习DDL解析
  2. JSON——IT技术人员都必须要了解的一种数据交换格式
  3. 无法打开Win11系统小组件怎么办
  4. angular监听输入框值的变化_如何检测Angular中@Input()值何时发生变化?
  5. 广成 USBCAN-II Pro V502 linux下升级经验
  6. python中syntaxerror_【已解决】Python中两个星号**参数去传递给函数出错:SyntaxError invalid syntax...
  7. Ngnix中的fastcgi参数性能优化和解释
  8. Adversarial examples in the physical world论文解读
  9. javascript监听输入框_js与jquery实时监听输入框值的oninput与onpropertychange方法
  10. Qt qmake和mingw32-make
  11. 2019CBA全明星周末大幕落下 南方明星队大比分获胜
  12. 政府应用系统应用解决方案
  13. Android点击打开微信
  14. 盘点10款超好用的数据可视化工具
  15. mW和dBm的换算公式
  16. python数学建模--时间序列模型--指数平滑
  17. Nacos 2.1.0 正式发布!堪称最强!
  18. NFT Insider #87:The Sandbox 收购游戏开发工作室 Sviper,GHST 大迁徙即将拉开帷幕
  19. 【asp.net小札记】Repeater自定义添加排序按钮+显示图片
  20. 哈工大2020人工智能期末考试复习

热门文章

  1. 网络分裂(network partition)
  2. 【转】Qt调用dll中的功能函数
  3. 原生JS如何实现包含各种类型数据的深克隆
  4. 一起学设计模式 - 桥接模式
  5. linux模拟磁盘和用户管理总结
  6. 使用 TeamCity 实现持续集成(CI)
  7. STL库的内存配置器(allocator)
  8. 图论--有向图强连通分量的标记及缩点模板
  9. 实战突击:PHP项目开发案例整合(第2版)
  10. 自定义jQuery 跨域请求 callback 函数名