一、C#中yield关键字用于遍历循环中,yield语句的两种形式

yield return用于返回IEnumerable<T>,

yield break用于终止循环遍历。

二、yield return的用法

使用yield return获取集合,并遍历。

 
C# 代码   复制

    class Program

    {

public static Random r = new Random();


static IEnumerable<int> GetList(int count)

{


for (int i = 0; i < count; i++)

{

yield return r.Next(10);

}

}


static void Main(string[] args)

{

foreach(int item in GetList(5))

Console.WriteLine(item);

Console.ReadKey();

}

}

生成项目,并用反编译可执行文件。查看GetList方法,发现该方法返回的是一个GetList类的实例。原来yield return是"语法糖",其本质是生成了一个GetList的实例。

那GetList实例是什么呢?点击反编译工具中<GetList>链接查看

分析代码后可以知道

1、原来GetList类实现了IEnumerable和IEnumerator的泛型、非泛型接口 2、yield return返回的集合之所以能被迭代、遍历,是因为GetList内部有迭代器 3、yield return之所以能实现"按需供给",是因为GetList内部有一个_state字段记录这上次的状态

三、yield break的用法

使用yield break可以在获取集合的时候,当符合某种条件就终止获取集合。

 
C# 代码   复制

    class Program

    {

static Random rand = new Random();


static IEnumerable<int> GetList()

{

while (true)

{

int temp = rand.Next(100);

if (temp%10 == 0)

{

yield break;

}

yield return temp;

}

}


static void Main(string[] args)

{

foreach (int item in GetList())

{

Console.WriteLine(item);

}

Console.ReadKey();

}

}

四、C#中yield关键字的总结

1、yield return能返回一个"按需供给"的集合 2、yield return是"语法糖",其背后是一个实现了IEnuerable,IEnumerator泛型、非泛型接口的类,该类维护着一个状态字段,以保证yield return产生的集合能"按需供给" 3、yield break配合yield return使用,当产生集合达到某种条件的时候使用yield break,以终止继续创建集合

最新文章

  1. python2.7安装PIL.Image模块
  2. windows 7系统下出现某盘回收站损坏解决办法
  3. 获取app安装信息私有api
  4. 《HTTP 权威指南》
  5. zw版【转发&#183;台湾nvp系列Delphi例程】HALCON ObjToInteger1-4
  6. River Hopscotch(二分POJ3258)
  7. vyatta的fork开源版本
  8. 谈谈 JavaScript 中的 this 指向问题
  9. GNOME Shell叫板Ubuntu Unity:优劣PK
  10. Sqlserver更新数据表xml类型字段内容某个节点值的脚本
  11. MD5 加密 以及 加盐加密
  12. 《阿里巴巴Java开发手册(正式版》读记
  13. fifteen-puzzle
  14. Spring-data-redis操作redis知识总结
  15. [Oracle][DATAGUARD]关于REDO_TRANSPORT_USER参数
  16. Java编程思想__异常
  17. 【CF850E】Random Elections(FWT)
  18. 3ds max学习笔记(九)-- 实例操作(路径阵列)
  19. wordpress添加面包屑
  20. ionic3中创建pipe管道

热门文章

  1. Node.js 部署到 CentOs
  2. JSP文件管理后门工具jsp-file-browser
  3. iOS 9的新的改变 iOS SDK Release Notes for iOS 9 说了些改变
  4. Redis学习篇(五)之Set类型及其操作
  5. C和指针之学习笔记(2)
  6. 【BZOJ 2121】 (字符串DP,区间DP)
  7. java 接口 继承 接口 抽象类 继承 实体类
  8. hihocoder #1071 : 小玩具
  9. Codeforces Round #479 (Div. 3)
  10. MySql - GROUP BY 和 HAVING关键字