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. 关于https的Error:Error Domain=NSURLErrorDomain Code=-1012

    昨天闲着没事就随便搞点demo,随便找了一个https的接口,运行之后,一直发现Error Domain=NSURLErrorDomain Code=-1012.好奇怪,请求https的配置我基本都配 ...

  2. 【读书笔记】iOS网络-运行循环

    运行循环是由类NSRunLoop表示的,有些线程可以让操作系统唤醒睡眠的线程以管理到来的事件,而运行循环则是这些线程的基本组件.运行循环是这样一种循环,可以在一个周期内调度任务并处理到来的事件.iOS ...

  3. cell自适应高度

    MyModel.h #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface MyModel : ...

  4. Android Service使用拾遗[阿里工程师分享]

    Service作为android的四大组件之一常用来帮助我们完成一些需要放在后台处理的任务,通过startService和bindService两种方式被调用.因为Service也是在主线程中运行的, ...

  5. UnityShader之固定管线Fixed Function Shader【Shader资料3】

    Fixed function shader简介:  属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的情况.使用的是ShaderLab语言,语法与微软的FX files 或 ...

  6. 【iOS开发】多屏尺的自动适配 AutoLayout (纯代码方式)

    关于AutoLayout,最早从iOS6开始引入使用.   主要功能是使用约束,对视图进行相对布局,以适应不同屏尺的变换.   网上大量的资料都在介绍xib和storyboard,如何使用AutoLa ...

  7. 使用ObjectOutputStream进行socket通信的时候出现固定读到四个字节乱码的问题

    问题描述: 最近在写一个通信相关的项目,服务器端和客户端通过socket进行通信.本来想利用read的阻塞特性,服务器端和客户端按照一定的流程进行文件读写.结果发现客户端或者服务器read方法一直都返 ...

  8. myeclipse2013 安装 egit

    myeclipse2013版本: Version: 2013 Build id: 11.0-20130401     手工安装不了,那就到市场上安装.     1.Help--->Install ...

  9. 【Other】U盘FAT32转NTFS且无数据丢失

    序: 做了一个U盘启动盘后发现文件系统格式为FAT32.这种格式支持单个文件最大4G,超过4G就无法拷贝了.为了防止以后突发情况所以提前把FAT32转换成NTFS.为避免导入导出数据最简单的方法利用D ...

  10. PHP添加Redis模块及连接

    上几篇文章介绍了Redis的安装及使用,下面将介绍php如何添加Redis扩展! php手册并没有提供Redis的类和方法,也没有提供相关的扩展模块,但我们可以在Redis的官网下载PHP的扩展,里面 ...