读书笔记 C# yield return与yield break执行顺序的浅析
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执行顺序的浅析的更多相关文章
- 12.C#yield return和yield break及实际应用小例(六章6.2-6.4)
晚上好,各位.今天结合书中所讲和MSDN所查,聊下yield关键字,它是我们简化迭代器的关键. 如果你在语句中使用了yield关键字,则意味着它在其中出现的方法.运算符或get访问器是迭代器,通过使用 ...
- yield return 和 yield break
//yield return 返回类型必须为 IEnumerable.IEnumerable<T>.IEnumerator 或 IEnumerator<T>. static I ...
- C#yield return和yield break
C#yield return和yield break 晚上好,各位.今天结合书中所讲和MSDN所查,聊下yield关键字,它是我们简化迭代器的关键. 如果你在语句中使用了yield关键字,则意味着它在 ...
- yield return 和yield break
这个还是有点意思,两个都是有返回的意思,但是区别在哪里呢? 1.return 会销毁函数的局部变量,下次调用的时候又会产生新的值 2.yield 当退出函数的时候,变量人然存在,函数下次调用的时候变量 ...
- C# yield return 和 yield break
yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 以下对比了使用yield return与不使用yie ...
- java中return与finally的执行顺序
可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定 ...
- Go:return 与 defer的执行顺序 (转)
将下面的代码放入了 double.go 文件内 package main //go:noinline //go:nosplit func test() (x int) { defer println( ...
- 读书笔记 C# Type类型与泛型有关的某些属性浅析
IsGenericType 如果类型为泛型,则返回 true. GetGenericArguments 返回 Type 对象数组,这些对象表示为构造类型提供的类型变量,或泛型类型定义的类型参数.如果是 ...
- 《Effective Java》 读书笔记(四) 使用私有构造方法执行非实例化
在许多时候,我们会写一个类,这个类只是用来提供一些静态方法或静态属性,就好像C++的函数一样,比如 java.lang.Math,java.util.Arrays等,但是有时候这些类的用户可能会在无意 ...
随机推荐
- (转)c# 扩展方法
扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型,重新编译或以其他方式修改原始类型.扩展方法必须是静态方法,可以像实例方法一样进行调用.且调用同名中实际定义的方法优先级要高于扩展方法. 先来 ...
- ffmpeg 无损改变纵横比aspect
最后发觉, potplayer 里 Ctrl+Enter 或者 Enter 可以扩展到整个屏幕/保持比例,根本不需要额外去转换 如果整个视频都要改的话,把 -ss -t 参数去掉 ffmpeg -ss ...
- IntelliJ IDEA的这些配置,你值得拥有
一.自动编译开关 二.忽略大小写开关 IDEA默认是匹配大小写,此开关如果未关.你输入字符一定要符合大小写.比如你敲string是不会出现代码提示或智能补充.但是,如果你开了这个开关,你无论输入Str ...
- LeetCode--415--字符串相加
问题描述: 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和nu ...
- 20180429 xlVBA套打单据自适应列宽
Sub TestAutoAdjustColumnWidthBaseOnModel() Set ModelSheet = ThisWorkbook.Worksheets("单据模板" ...
- 『TensorFlow Internals』笔记_系统架构
一.架构概览 TensorFlow 的系统结构以 C API 为界,将整个系统分为前端和后端两个子系统: 前端系统:提供编程模型,负责构造计算图: 后端系统:提供运行时环境,负责执行计算图,后端系统的 ...
- 关于移动端rem适配
var num = 1 / window.devicePixelRatio; var fontSize = document.documentElement.clientWidth / 10; doc ...
- 1.两数之和(Two Sum) C++
暴力法可解决,速度很慢. 解决办法:哈希表 知识点: map的构造 遍历map使用迭代器,判断条件 插入 pair<int,int> 寻找key是否存在 class Solution { ...
- 数据结构与算法之PHP查找算法(顺序查找)
对于查找数据来说,最简单的方法就是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,或者直到列表结尾也没有找到,这种方法称为顺序查找. 一.基本写法 顺序查找的实现很简单.只要从列表 ...
- 通过DBMS_REDEFINITION包对表在线重定义
基础介绍 Oracle Online Redefinition可以保证在数据表进行DDL类型操作,如插入.删除数据列,分区处理的时候,还能够支持DML操作,特别是insert/update/delet ...