C#中yield

C#中yield

一、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,以终止继续创建集合

    标签: