zoukankan      html  css  js  c++  java
  • [c#] 理解与使用 yield

    理解 yield 源码

    比如我们有一段 code 如下所示:

    public class Yield : IDemoBase
    {
        public static IEnumerable<int> GetList(int[] nums)
        {
            foreach (var num in nums)
            {
                yield return num;
            }
        }
    
        public void Run()
        {
            var list = GetList(new int[] { 1, 2, 3, 4, 5 });
        }
    }
    

    反编译一下看看源码:

    可以理解为带有 yield 语法糖的方法, getList() 在编译后, 底层实际上多了一个方法叫做: <getList>d_x

    实际上底层实现了一个迭代器, 这个实现其实和设计模式中迭代模式很相似. 反过来推, 当我们不使用 yield 时, 自己手写需要写这么多代码.

    使用 yield

    仔细品下面两段代码的区别?

    public void Run()
    {
        IEnumerable<int> items = GetList_v2(new int[] { 1, 2, 3, 4, 5 });
        Console.WriteLine("Begin to iterate the items from GetList_v2.");
        foreach (var item in items)
        {
            Console.WriteLine(item);
        }
    
        items = GetList_v3(new int[] { 6, 7, 8, 9, 10 });
        Console.WriteLine("Begin to iterate the items from GetList_v3.");
        foreach (var item in items)
        {
            Console.WriteLine(item);
        }
    }
    
    public IEnumerable<int> GetList_v2(int[] nums)
    {
        Console.WriteLine("Begin to invoke GetList_v2() method");
        return nums.Where(num => num % 2 == 0);
    }
    
    public IEnumerable<int> GetList_v3(int[] nums)
    {
        Console.WriteLine("Begin to invoke GetList_v3() method");
        foreach (var num in nums)
        {
            if (num % 2 == 0) yield return num;
        }
    }
    

    GetList_v2 和 GetList_v3 都是具备一定业务逻辑处理能力的方法, 并返回处理后的数据集合.

    区别只是是否使用了 yield 关键字. 执行下看看:

    可能已经看出来区别了就是 GetList_v3 与 GetList_v2 代码实际执行的实际不一样. GetList_v3 我们可以理解为当有真正的资源消费方时才真正执行.

    reference

    感谢:

    c# yield关键字的用法

  • 相关阅读:
    freebsd安装mysql
    freebsd安装ports
    分布式拒绝服务攻击
    如何用命令获知当前是一年中的第多少周和今天是周几
    freebsd软件包下载地址
    mod_wsgi的两种模式
    freebsd中/etc/rc.conf配置文件导致不能启动的问题
    进程ID[PID(Process ID)]与端口号[(Port ID)]的联系
    Java EE之HttpServletRequest
    Chrome之控制台使用【转载】
  • 原文地址:https://www.cnblogs.com/it-dennis/p/12732437.html
Copyright © 2011-2022 走看看