美文网首页
协程(四)yield与迭代器

协程(四)yield与迭代器

作者: 86a262e62b0b | 来源:发表于2019-10-28 14:59 被阅读0次

协程(一)基本使用
协程(二)协程什么时候调用
协程(三)IEnumerable、IEnumerator、foreach、迭代
协程(四)yield与迭代器
协程(五)简单模拟协程
协程(六)有关优化

yield文档:
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/yield

一.yield

  • 概念:yield上下文关键字,出现在一个方法、运算符(?)或get访问器 ,并且表明他们是一个迭代器。
  • 作用:使用yield,你不再需要像上一节那样,通过写一个类,并实现 IEnumerator<T>接口,来实现迭代器。

yield语句两种形式:

yield return <expression>;
yield break;

二. 迭代器方法

  1. 迭代器的声明必须满足以下要求:
  • 返回类型必须为 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>。
  • 声明不能有任何 in、ref 或 out 参数。
  1. 提示:
  • 返回 yield 或 IEnumerable 的迭代器的 IEnumerator 类型为 object。
  • 如果迭代器返回 IEnumerable<T> 或 IEnumerator<T>,则必须将 yield return 语句中的表达式类型隐式转换为泛型类型参数

代码实现:

IEnumerable<string> elements = MyIteratorMethod();
foreach (string element in elements)
{
   ...
}
理解:
  • 调用 MyIteratorMethod 不执行该方法的主体。 该调用会将IEnumerable<string> 返回到 elements 变量中。
  • 在 foreach 循环迭代时,将为 elements调用 MoveNext方法。 此调用将执行 MyIteratorMethod 的主体,直至到达下一个 yield return 语句。
  • yield return 语句返回的表达式不仅决定了循环体使用的 element 变量值,还决定了 elements 的 Current 属性(它是 IEnumerable<string>)。
  • 在 foreach 循环的每个后续迭代中,迭代器主体的执行将从它暂停的位置继续,直至到达 yield return 语句后才会停止。 在到达迭代器方法的结尾或 yield break语句时,foreach 循环完成。

另外一个案例:

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 访问器

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; }
}

相关文章

  • PHP高级用法

    一、迭代器 二、生成器 三、yield 四、协程

  • Python 高级 7

    迭代、迭代器、生成器、协程、yield、greenlet、gevent、进程线程协程对比、gevent多任务图片下...

  • 协程(四)yield与迭代器

    协程(一)基本使用协程(二)协程什么时候调用协程(三)IEnumerable、IEnumerator、foreac...

  • iOS类似async/await的用法

    yield 协程里面重要的关键字yield,在生成的迭代器调用next,每次都会将yield后面的数据返回,并中断...

  • 四、协程——1、协程基础

    1、协程并不是多线程,本质上是一个迭代器,但是起到一个多线程的作用。2、协程以yield为返回标志,表示yield...

  • Python协程

    目录:一、基于生成器的协程二、协程状态三、协程预激装饰器四、终止协程和异常处理五、协程返回值六、yield fro...

  • 迭代器,可迭代对象,yield,生成器

    迭代器 协程

  • 协程

    gevent方法实现多任务(协程) 了解yield和grenlet yield方法创建协程 greenlet方法创建协程

  • chapter16 协程

    从语法上看,协程与生成器类似。但是协程中,yield通常出现在表达式的右边(例如, datum = yield)。...

  • Python day17_协程

    协程的引入 要讲协程 先要知道什么是迭代对象 迭代器 以及生成器 迭代对象 迭代: 使用for循环遍历取值的过程就...

网友评论

      本文标题:协程(四)yield与迭代器

      本文链接:https://www.haomeiwen.com/subject/smfbvctx.html