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. Android 开发前的基本的配置及第一个Android 程序

     一.JDK 1. 网上下载JDK 2.   配置环境变量(网上百度相关资料)       JAVA_HOME=D:\Java\jdk1.8.0_91       CLASSPATH=.;%JAVA_ ...

  2. Android UI之下拉刷新上拉刷新实现

    在实际开发中我们经常要用到上拉刷新和下拉刷新,因此今天我写了一个上拉和下拉刷新的demo,有一个自定义的下拉刷新控件 只需要在布局文件中直接引用就可以使用,非常方便,非常使用,以下是源代码: 自定义的 ...

  3. git常用命令,git版本控制和Xcode结合使用,用Xcode提交到github,github客户端使用

    1.git常用命令 查看命令: 1.git --help 查看git所有命令 2.git clone -help 查看git clone命令的细节 3.git config -l   查看当前所有配置 ...

  4. UVa 108 - Maximum Sum(最大连续子序列)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  5. paas架构之docker——安装

    1. 概要 本文描述docker的安装 参考官方文档:https://docs.docker.com/engine/installation/linux/ubuntulinux/ 安装操作系统: Ub ...

  6. [Derby]数据库操作说明

    1. 创建新数据库 connect 'jdbc:derby:mydb;create=true'; ij> connect 'jdbc:derby:mydb;create=true'; ij> ...

  7. 问题解决——在STL的queue中使用自定义类

    本文原创,转载请保证文章的完整性,并显要的注明出处. 本文链接:http://blog.csdn.net/wlsgzl/article/details/38843513 平时很少用STL,就算用,也基 ...

  8. 大数据架构-使用HBase和Solr将存储与索引放在不同的机器上

    大数据架构-使用HBase和Solr将存储与索引放在不同的机器上 摘要:HBase可以通过协处理器Coprocessor的方式向Solr发出请求,Solr对于接收到的数据可以做相关的同步:增.删.改索 ...

  9. 笔者的编辑语法:MarkDown

    由于博客园里的文章有很多排版不好,一大堆文字堆在一块会影响到阅读. MarkDowm:百科 Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber).它允许人们“使用易读 ...

  10. log4j日志优先级问题的后续

    前文:http://www.cnblogs.com/chyu/p/4280440.html 出现一处吐槽失误,当时还想怎么会设置成warn级别.. <appender name="ST ...