码迷,mamicode.com
首页 > Windows程序 > 详细

C#中的yield

时间:2014-10-28 09:18:41      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:style   http   os   ar   使用   for   sp   strong   文件   

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

yield return用于返回IEnumerable<T>,

yield break用于终止循环遍历。

 

二、yield return的用法

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

 
C# 代码   复制
bubuko.com,布布扣bubuko.com,布布扣
    class Program
bubuko.com,布布扣bubuko.com,布布扣
    {
bubuko.com,布布扣
bubuko.com,布布扣        public static Random r = new Random();
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣        static IEnumerable<int> GetList(int count)
bubuko.com,布布扣
bubuko.com,布布扣        {
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣            for (int i = 0; i < count; i++)
bubuko.com,布布扣
bubuko.com,布布扣            {
bubuko.com,布布扣
bubuko.com,布布扣                yield return r.Next(10);
bubuko.com,布布扣
bubuko.com,布布扣            }
bubuko.com,布布扣
bubuko.com,布布扣        }
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣        static void Main(string[] args)
bubuko.com,布布扣
bubuko.com,布布扣        {
bubuko.com,布布扣
bubuko.com,布布扣            foreach(int item in GetList(5))
bubuko.com,布布扣
bubuko.com,布布扣                Console.WriteLine(item);
bubuko.com,布布扣
bubuko.com,布布扣            Console.ReadKey();
bubuko.com,布布扣
bubuko.com,布布扣        }
bubuko.com,布布扣
bubuko.com,布布扣    }
bubuko.com,布布扣

 

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

 

bubuko.com,布布扣

 

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

 

bubuko.com,布布扣

 

分析代码后可以知道

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

 

三、yield break的用法

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

 
C# 代码   复制
bubuko.com,布布扣bubuko.com,布布扣
    class Program
bubuko.com,布布扣bubuko.com,布布扣
    {
bubuko.com,布布扣
bubuko.com,布布扣        static Random rand = new Random();
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣        static IEnumerable<int> GetList()
bubuko.com,布布扣
bubuko.com,布布扣        {
bubuko.com,布布扣
bubuko.com,布布扣            while (true)
bubuko.com,布布扣
bubuko.com,布布扣            {
bubuko.com,布布扣
bubuko.com,布布扣                int temp = rand.Next(100);
bubuko.com,布布扣
bubuko.com,布布扣                if (temp%10 == 0)
bubuko.com,布布扣
bubuko.com,布布扣                {
bubuko.com,布布扣
bubuko.com,布布扣                    yield break;
bubuko.com,布布扣
bubuko.com,布布扣                }
bubuko.com,布布扣
bubuko.com,布布扣                yield return temp;
bubuko.com,布布扣
bubuko.com,布布扣            }
bubuko.com,布布扣
bubuko.com,布布扣        }
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣        static void Main(string[] args)
bubuko.com,布布扣
bubuko.com,布布扣        {
bubuko.com,布布扣
bubuko.com,布布扣            foreach (int item in GetList())
bubuko.com,布布扣
bubuko.com,布布扣            {
bubuko.com,布布扣
bubuko.com,布布扣                Console.WriteLine(item);             
bubuko.com,布布扣
bubuko.com,布布扣            }
bubuko.com,布布扣
bubuko.com,布布扣            Console.ReadKey();
bubuko.com,布布扣
bubuko.com,布布扣        }
bubuko.com,布布扣
bubuko.com,布布扣    }
bubuko.com,布布扣
bubuko.com,布布扣

 

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

 

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

C#中的yield

标签:style   http   os   ar   使用   for   sp   strong   文件   

原文地址:http://www.cnblogs.com/gc2013/p/4055925.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!