yield(C# 参考)

在语句中使用 yield 关键字,表示在该关键字所在的方法、运算符或 get 访问器是迭代器。   通过使用 yield 定义迭代器,可在实现自定义集合类型的 IEnumerableIEnumerator 模式时无需其他显式类(保留枚举状态的类,有关示例,请参阅 IEnumerator<T>)。  

下面的示例演示了 yield 语句的两种形式。

 
复制            
yield return <expression>;
yield break;
备注

 

使用 yield return 语句可一次返回一个元素。

通过 foreach 语句或 LINQ 查询来使用迭代器方法。     foreach 循环的每次迭代都会调用迭代器方法。  迭代器方法运行到 yield return 语句时,会返回一个 expression,并保留当前在代码中的位置。     当下次调用迭代器函数时执行从该位置重新启动。

可以使用 yield break 语句来终止迭代。

有关迭代器的详细信息,请参阅迭代器(C# 和 Visual Basic)

迭代器的声明必须满足以下要求:

返回 IEnumerableIEnumerator 的迭代器的 yield 类型为 object。如果迭代器返回 IEnumerable<T>IEnumerator<T>,则必须将 yield return 语句中的表达式类型隐式转换为泛型类型参数。

你不能在具有以下特点的方法中包含 yield returnyield break 语句:

不能将 yield return 语句置于 try-catch 块中。  可将 yield return 语句置于 try-finally 语句的 try 块中。

yield break     语句可以位于 try 块或 catch  块,但不能位于 finally 块。

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

以下代码从迭代器方法返回 IEnumerable<string>,然后遍历其元素。

复制            
IEnumerable<string> elements = MyIteratorMethod();
foreach (string element in elements)
{

}

调用 MyIteratorMethod 并不执行该方法的主体。  相反,该调用会将 IEnumerable<string> 返回到 elements 变量中。

foreach 循环迭代时,将为 elements 调用 MoveNext 方法。  此调用将执行 MyIteratorMethod 的主体,直至到达下一个 yield return 语句。     yield return 语句返回的表达式不仅决定了循环体使用的 element 变量值,还决定了元素的 Current 属性(它是 IEnumerable<string>)。

foreach 循环的每个后续迭代中,迭代器主体的执行将从它暂停的位置继续,直至到达 yield return 语句后才会停止。  在到达迭代器方法的结尾或 yield break 语句时,foreach 循环便已完成。

示例

下面的示例包含一个位于 for 循环内的 yield return 语句。     Process 中的 foreach 语句体的每次迭代都会创建对 Power 迭代器函数的调用。  对迭代器函数的每个调用将继续到 yield return 语句的下一次执行(在 for 循环的下一次迭代期间发生)。

迭代器方法的返回类型是 IEnumerable(一种迭代器接口类型)。  当调用迭代器方法时,它将返回一个包含数字幂的可枚举对象。

复制            
public class PowersOf2
{
static void Main()
{
// Display powers of 2 up to the exponent of 8:
foreach (int i in Power(2, 8))
{
Console.Write("{0} ", i);
}
} public static System.Collections.Generic.IEnumerable<int> Power(int number, int exponent)
{
int result = 1; for (int i = 0; i < exponent; i++)
{
result = result * number;
yield return result;
}
} // Output: 2 4 8 16 32 64 128 256
}

示例

下面的示例演示一个作为迭代器的 get 访问器。  在该示例中,每个 yield return 语句返回一个用户定义的类的实例。

复制            
public static class GalaxyClass
{
public static void ShowGalaxies()
{
var theGalaxies = new Galaxies();
foreach (Galaxy theGalaxy in theGalaxies.NextGalaxy)
{
Debug.WriteLine(theGalaxy.Name + " " + theGalaxy.MegaLightYears.ToString());
}
} public class Galaxies
{ public System.Collections.Generic.IEnumerable<Galaxy> NextGalaxy
{
get
{
yield return new Galaxy { Name = "Tadpole", MegaLightYears = 400 };
yield return new Galaxy { Name = "Pinwheel", MegaLightYears = 25 };
yield return new Galaxy { Name = "Milky Way", MegaLightYears = 0 };
yield return new Galaxy { Name = "Andromeda", MegaLightYears = 3 };
}
} } public class Galaxy
{
public String Name { get; set; }
public int MegaLightYears { get; set; }
}
}

有关更多信息,请参见C# 语言规范。 该语言规范是 C# 语法和用法的权威资料。

yield(C# 参考)的更多相关文章

  1. 【395】yield 和 yield from

    yield:生成器 yield from:将生成器 yield 的内容相当于逐一在 yield 一般 参考:Python 3: Using "yield from" in Gene ...

  2. 理解迭代器,生成器,yield,可迭代对象

    原文:https://foofish.net/iterators-vs-generators.html 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Gen ...

  3. 通过实例说明在scrapy中 yield的作用

    源https://www.jianshu.com/p/7c1a084853d8 开始前的准备工作: 1.MySQL下载:点我2.python MySQL驱动下载:pymysql(pyMySql,直接用 ...

  4. python yield && scrapy yield

    title: python yield && scrapy yield date: 2020-03-17 16:00:00 categories: python tags: 语法 yi ...

  5. python学习之关键字

    1.assert 语句形式:assert 布尔表达式[,msg] 解释:assert是检验一个表达式是否为真.若不为真,则触发一个错误. 例如: assert False assert 1==2 as ...

  6. Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全

    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全 1. #====提升抽象层次1 2. #----使用通用单词1 3. #===使用术语..1 4.  ...

  7. JavaScript严格模式有什么不同

    看ES6,瞄到“严格模式”,问了下自己什么是“严格模式”?答案好像不是很明朗,遂总结如下: 严格模式声明:“use strict”; 1.禁止变量未声明就赋值 2.限制动态绑定(属性和方法归属哪个对象 ...

  8. 2018-10-17 Chrome插件实现GitHub代码翻译v0.0.3

    续前文浏览器插件实现GitHub代码翻译原型演示, 通过调用浏览器插件-离线英汉词典的批量查词接口, 实现了源码的初步命名直译. 源码库仍在: program-in-chinese/webextens ...

  9. 完全理解 Python 迭代对象、迭代器、生成器

    完全理解 Python 迭代对象.迭代器.生成器 2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 分享到: 原文出处: liuzhijun    本文源自RQ作者 ...

  10. 用Python实现数据结构之树

    树 树是由根结点和若干颗子树构成的.树是由一个集合以及在该集合上定义的一种关系构成的.集合中的元素称为树的结点,所定义的关系称为父子关系.父子关系在树的结点之间建立了一个层次结构.在这种层次结构中有一 ...

随机推荐

  1. CSS 伪类和伪对象选(五)

    一.伪选择器 伪选择器包括:伪类选择器和伪对象选择器,以冒号(:)作为前缀,冒号后紧跟伪类或者伪对象名称,冒号前后没有空格,否则解析为包含选择器 如: div:hover{ font-size:12p ...

  2. OpenGL ES学习笔记(三)——纹理

    首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <OpenGL ES学习笔记( ...

  3. iOS中的单例模式

    概念相关 单例模式 在程序运行过程,一个类只有一个实例 使用场合 在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次) static static关键字会在声明变量的时候分配内存,在程序运行 ...

  4. 设计模式-01-MVC

    概述 Model-View-Controller(MVC),即模型-视图-控制器. MVC将软件系统分成三大部分:Model,View,Controller,三个部分通过某种机制通信 M.V.C的职能 ...

  5. Matlab2014下载和破解方法,以及Matlab很好的学习网站

    ISO镜像下载地址链接: http://pan.baidu.com/s/1i31bu5J 密码: obo1  单独破解文件下载链接: http://pan.baidu.com/s/1c0CGQsw 密 ...

  6. 《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 <五> NSDicionary + NSMutableDictionary

    int main(int argc, const char * argv[]) { @autoreleasepool { //字典, 存储的内存不是连续的 用key和value进行对应(键值) //k ...

  7. Java集合 之 Queue集合

    什么是Queue集合? 答:Queue用于模拟队列这种数据结构.队列通常是指“先进先出(FIFO)”的容器.队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素.新元素插入到队列的尾部 ...

  8. dd 生成指定大小文件

    d命令可以轻易实现创建指定大小的文件,如 dd if=/dev/zero of=test bs=1M count=1000 会生成一个1000M的test文件,文件内容为全0(因从/dev/zero中 ...

  9. HashMap与TreeMap的区别

    首先描述下什么是Map. 在数组中我们是通过数组的下标来对其内容进行索引的,而在Map中我们是通过对象对对象进行索引的,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平常说的键值对. ...

  10. iOS -数据库网络之xml解析之远程解析XML

    1.IOS中XML文件获取    //设置远程访问地址     NSURL *url=[NSURL URLWithString:@""];       //创建动态URL请求,并初 ...