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

时间: 2024-12-31 17:29:12

C#中的yield的相关文章

关于Python中的yield

关于Python中的yield http://www.cnblogs.com/tqsummer/archive/2010/12/27/1917927.html http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ 一.迭代器(iterator) 在Python中,for循环可以用于Python中的任何类型,包括列表.元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器 迭代器是一个实现了迭代器协议

python中的yield

例如这个函数 def fab(max): n, a, b = 0, 0, 1 while n < max: yield b # print b a, b = b, a + b n = n + 1 简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab

C#中的yield return与Unity中的Coroutine(协程)

C#中的yield return C#语法中有个特别的关键字yield, 它是干什么用的呢? 来看看专业的解释: yield 是在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一:yield return <expression>;yield break 看如下例子: 1 public class CustomCollection :IEnumerable { 2 3 public static void Main (string[] args) 4 { 5 Custom

python中的yield(转载)

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

理解php中的yield

<?php function gen() { $ret = (yield 'yield1'); var_dump($ret); $ret = (yield 'yield2'); var_dump($ret); } $gen = gen(); var_dump($gen->current()); // string(6) "yield1" var_dump($gen->send('ret1')); // string(4) "ret1" (the f

了解多线程中的yield

最近在学习多线程这一块,发现里面有好多让人产生误区的地方,今天我来分析下java多线程中的yield功能,希望其他朋友也可以从中学习到相关知识. 开始之前先看下面一幅图: 这幅图表示线程的运行状态:新建--->就绪<--阻塞-->运行---->死亡 yield从字面上看是礼让的意思,顾名思义就是让其他线程有执行的机会.这里有个很大的误区,以为执行yield方法就能暂停当前线程让其他线程执行,这是错误的. yield方法只是让当前执行的线程从"运行"状态转变为&q

【转】C# 中的&quot;yield&quot;使用

C# 中的"yield"使用 yield是C#为了简化遍历操作实现的语法糖,我们知道如果要要某个类型支持遍历就必须要实现系统接口IEnumerable,这个接口后续实现比较繁琐要写一大堆代码才能支持真正的遍历功能.举例说明 using System;using System.Collections.Generic;using System.Collections;using System.Linq;using System.Text; namespace {    class Prog

关于Python中的yield(转载)

您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield 的概念. 如何生成斐波那契數列 斐波那契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到.用计算机程序输出斐波那契數列的前 N 个数是一个非常简单的问题,许多初学者都可以轻易写出如下函数: 清单 1. 简单输出斐波那契數列前 N 个数 def

python中的yield函数

简单讲,yield的作用就是把一个函数变成一个generator,带有yield的函数不再是一个普通的函数,Python解释器会将其视为一个generator,调用fab(5)斐波拉契函数不会执行fab函数,而是返回一个iterable对象!在for循环执行时,每次循环都会执行fab函数内部的代码,执行到yeild b时,fab函数就返回一个迭代值,下一次迭代时,代码从yield b的下一条语句继续执行,而函数的本地变量看起来和上次终端执行前是完全一样的,于是函数继续执行,直到再次遇到yield

C#中的yield return与Unity中的Coroutine(协程)(下)

Unity中的Coroutine(协程) 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件, Image: 将以下代码绑定到Image 1 using UnityEngine; 2 using System.Collections; 3 using System.Threading; 4 using UnityEngine.UI; 5 6 public class CoroutineDemo : MonoBehaviour { 7 8 //