yield return可一次返回一个元素,并保留当前在代码中的位置,下次调用当前迭代器函数时,将从该位置从新执行。也就是说执行了yield return的时候,迭代器函数就返回了一个元素给foreach中in前面的一个元素,这时代码就执行了foreach方法中,当foreach本次执行完毕之后,程序的执行顺序又重新回到了刚才执行yield return的下一行代码(如果有的话)。

yield break可以终止迭代。发现一个有趣的现象。如果在迭代器函数中有try{}finally{}块,yield break之后不会再次执行try块中的代码,但是会执行finally块中的代码。如下代码和结果所示:

static void Main(string[] args) {
foreach(int i in TestYield()) {
Console.WriteLine("foreach获取值->" + i.ToString());
}
Console.ReadKey();
} static IEnumerable<int> TestYield() {
try {
Console.WriteLine("进入迭代器函数");
for(int i = ; i < ; i++) {
if(i == ) {
Console.WriteLine("执行yield break后,执行finally块中的代码,如果没有finally块,则当前迭代器函数TestYield会直接返回,不再执行本函数中的后续代码");
yield break;
} Console.WriteLine("马上开始yield return返回一个元素值->{0}",i);
yield return i;
Console.WriteLine("yield return返回一个元素到foreach中,foreach当次执行完后,代码执行顺序会马上回到这里");
} Console.WriteLine("yield break 跳出来了!但不执行该条代码!");
}
finally {
Console.WriteLine("yield break 跳出来后!会执行finally中的代码!");
}
}

上述代码执行后的结果:

迭代器函数的声明必须满足以下条件:

一、返回类型必须是IEnumerable、IEnumerable<T>、IEnumerator、IEnumerator<T>;

二、不能有任何ref或out参数。

异常处理:

一、不能将yield return语句置于try-catch块中。但是可以将yield return语句置于try-finally语句的try块中;

二、可以将yield break语句置于try或catch块中,但是不能将之置于finally块中;

三、如果foreach主体(在迭代器函数之外)引发异常,则将执行迭代器函数中的finally块。

读书笔记 C# yield return与yield break执行顺序的浅析的更多相关文章

  1. 12.C#yield return和yield break及实际应用小例(六章6.2-6.4)

    晚上好,各位.今天结合书中所讲和MSDN所查,聊下yield关键字,它是我们简化迭代器的关键. 如果你在语句中使用了yield关键字,则意味着它在其中出现的方法.运算符或get访问器是迭代器,通过使用 ...

  2. yield return 和 yield break

    //yield return 返回类型必须为 IEnumerable.IEnumerable<T>.IEnumerator 或 IEnumerator<T>. static I ...

  3. C#yield return和yield break

    C#yield return和yield break 晚上好,各位.今天结合书中所讲和MSDN所查,聊下yield关键字,它是我们简化迭代器的关键. 如果你在语句中使用了yield关键字,则意味着它在 ...

  4. yield return 和yield break

    这个还是有点意思,两个都是有返回的意思,但是区别在哪里呢? 1.return 会销毁函数的局部变量,下次调用的时候又会产生新的值 2.yield 当退出函数的时候,变量人然存在,函数下次调用的时候变量 ...

  5. C# yield return 和 yield break

    yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 以下对比了使用yield return与不使用yie ...

  6. java中return与finally的执行顺序

    可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定 ...

  7. Go:return 与 defer的执行顺序 (转)

    将下面的代码放入了 double.go 文件内 package main //go:noinline //go:nosplit func test() (x int) { defer println( ...

  8. 读书笔记 C# Type类型与泛型有关的某些属性浅析

    IsGenericType 如果类型为泛型,则返回 true. GetGenericArguments 返回 Type 对象数组,这些对象表示为构造类型提供的类型变量,或泛型类型定义的类型参数.如果是 ...

  9. 《Effective Java》 读书笔记(四) 使用私有构造方法执行非实例化

    在许多时候,我们会写一个类,这个类只是用来提供一些静态方法或静态属性,就好像C++的函数一样,比如 java.lang.Math,java.util.Arrays等,但是有时候这些类的用户可能会在无意 ...

随机推荐

  1. HAL库详解

    转自:https://blog.csdn.net/zcshoucsdn/article/details/55213616

  2. 通过wifi 连接 adb 到 手机

    网上很多文章都需要先用 usb 线连接先做一下设置,然后才能通过下面的方法连接 julian@julian-ThinkPad-T450:~/tools/android_sdk/platform-too ...

  3. Maven报错Please ensure you are using JDK 1.4 or above and not a JRE解决方法!

    https://www.cnblogs.com/shihua513/p/6163682.html 在eclipse下用maven编译时,很有可能出现以下错误: Please ensure you ar ...

  4. 七种常见的核酸序列蛋白编码能力预测工具 | ncRNAs | lncRNA

    注:这些工具的应用都是受限的,有些本来就是只能用于预测动物,在使用之前务必用ground truth数据来测试一些.我想预测某一个植物的转录本,所以可以拿已经注释得比较好的拟南芥来测试一下.(测试的结 ...

  5. 20170907wdVBA_GetCellsContentToExcel

    'WORD 加载项 代码模板 Dim cmdBar As CommandBar, cmdBtn As CommandBarControl Const cmdBtnCap As String = &qu ...

  6. android-------- 常用且应该学习的框架

    今天来分享一下一些常用的库,在Github 上 star数也是很高的,开发中也是很常用的: 简单的分享一下,一起学习. http://www.xiufm.com/blog-1-944.html 框架名 ...

  7. Windows 上安装 Scala

    在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了. 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法. 接下来,我们可以从 S ...

  8. stark 组件 url 二级分发的实现

    模拟 admin 组件url设计思路 项目urls 文件中: from django.contrib import admin from django.urls import path from st ...

  9. 树上第k大联通块

    题意:求树上第k大联通块 n,k<=1e5 考虑转化为k短路的形式. 也就是要建出一张图是的这条图上每一条S到T的路径都能代表一个联通块. 点分治建图 递归下去,假定每个子树的所有联通块中都可以 ...

  10. 6、DHCP

    DHCP 一.DHCP简介 1.什么是DHCP DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一种用户简化计算机IP地址管理的标准: 2.DHC ...