yield(C# 参考)

yield(C# 参考)

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

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

复制            
yield return <expression>;
yield break;

备注


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

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

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

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

迭代器方法和 get 访问器


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

  • 返回类型必须为 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>。

  • 该声明不能有任何 ref 或out https://msdn.microsoft.com/zh-cn/library/t3c3bfhx.aspx 参数。

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

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

  • 匿名方法。  有关详细信息,请参阅匿名方法(C# 编程指南)。

  • 包含不安全的块的方法。  有关详细信息,请参阅unsafe(C# 参考)。

异常处理


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

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

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

技术实现


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

C#
复制            
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(一种迭代器接口类型)。  当调用迭代器方法时,它将返回一个包含数字幂的可枚举对象。

C#
复制            
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 语句返回一个用户定义的类的实例。

C#
复制            
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# 语法和用法的权威资料。

posted on 2016-10-18 20:50 时空观察者9号 阅读(...) 评论(...) 编辑 收藏

yield(C# 参考)相关推荐

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

    本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网 ...

  2. openstack ice自定义调度算法项目详解(horizon、novaclient、api、scheduler、db、自定义数据库)

    原文转自:openstack ice自定义调度算法项目详解(horizon.novaclient.api.scheduler.db.自定义数据库) 第一部分:页面层即horizon与novaclien ...

  3. Python3.5 Django1.10 Scrapy1.2 Ubuntu16.04 HTML5

    1.Python3.5 1. 虚拟环境 venv python3.4 创建虚拟环境(py3.4自带venv,不需要安装) Ubuntu 16.4 python3.5升级python3.6 sudo a ...

  4. 【头歌实验】二、Python入门之基础语法

    文章目录 >>> 第1关:行与缩进 任务描述 相关知识 缩进 多行语句 编程要求 测试说明 参考答案 >>> 第2关:标识符与保留字 任务描述 相关知识 标识符 保 ...

  5. python3可迭代对象、迭代器、生成器、协程yield入门

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-24 16:13:07 # @Author : cdl (1217096 ...

  6. 五分钟理解yield在python中的简单用法,让你不再迷惑

    很多同学无论是在学习python还是使用python的过程中,都会遇到yield关键字,这个让人头大的问题,今天,就给大家分享一下我自学yield的心路历程 基本概念: (1)在 Python 中,使 ...

  7. python yield用法_Python中迭代器和生成器的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  8. python迭代器两个基本方法可供参考_浅析python迭代器和生成器

    可迭代对象 概念 一个对象(在Python里面一切都是对象)只要实现了只要实现了__iter__()方法,那么这个对象就是可迭代对象 常见的可迭代对象 集合或序列类型(如list.tuple.set. ...

  9. Python 参考手册

    声明:转载自 http://blog.csdn.net/jerry_1126/article/details/41240149#comments 感谢作者的辛勤总结! 由于作者的python版本是2. ...

最新文章

  1. 如何在Java中检查字符串是否为数字
  2. 机器学习:从感知机模型体会随机梯度下降
  3. 轻松理解spring IOC
  4. leetcode222. 完全二叉树的节点个数(两种做法)
  5. Android官方开发文档Training系列课程中文版:数据存储之文件存储
  6. Android蓝牙通信具体解释
  7. springboot导入项目依赖报错_如何解决spring boot 项目导入依赖后代码报错问题
  8. ajax:dataType
  9. springmvc生成注册验证码
  10. linux 查看进程关系树
  11. UI05 - UILabel05
  12. 组概念_【收藏】学习质谱一定要知道的6组概念
  13. JDK源码阅读调试环境搭建
  14. 雷赛服务器信号er020,雷赛配合松下电机做三轴,xy轴到位信号的问题
  15. 手机浏览器设置为纯净百度主页 去除百度首页推送
  16. 计算机键盘字母排列依据,键盘上的26个字母排序有什么规律吗?是怎么定的?...
  17. 致凯利定理(Cayley公式)
  18. NR、EN-DC等名词解释
  19. 前端 Vue 浏览器调试工具 Vue.js devtools 安装
  20. 环境诉讼与当事人适格

热门文章

  1. delphi中exit,abort,break,continue,halt,runerro 的区别
  2. 一行Python代码就可以玩一些童年小游戏
  3. ZedGraph怎样实现将图形右键菜单的打印和页面设置合并为打印的二级子菜单
  4. VS中安装DevExpress后在Winform的工具箱中不显示控件
  5. C# Winform程序中使用TeeChart实现简单的图表展示
  6. request请求和response响应时的乱码解决代码
  7. 计算机网络总结:第三章 运输层
  8. python中对切片的理解
  9. 神策数据全面支持出海客户合规 GDPR!
  10. 驱动利器:数据驱动下的产品决策(上)