zoukankan      html  css  js  c++  java
  • C# yield关键字

    关于yield关键字,网上有很多文章介绍了,但是看了之后,虽然明白了"哦,原来是这么回事",但是在日常开发中并没有真正的用起来,所以,写此一篇,介绍一下在真正的项目中怎么使用这个关键字。

    开始我的正文介绍之前,可以先看一下微软的官方文档是怎么介绍yield关键字的,传送门:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/yield

    在这里我新建了一个控制台程序,用于输出斐波那契数列,代码如下:我们直接在Main方法中输出斐波那契数列,这个也没有什么问题,很完美,但是考虑到实际开发中不可能把所有的处理都写在程序入口,所以我们考虑对这段代码封装一个方法V1

    static void Main(string[] args)
    {int a = 0, b = 1, c = 0;
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("{0}", b);
            c = a + b;
            a = b;
            b = c;
        }
    
        //V1(10);
    
        //foreach (var i in V2(10))
        //{
        //    Console.WriteLine(i);
        //}
    
        //foreach (var i in V3(10))
        //{
        //    Console.WriteLine(i);
        //}
    
        Console.ReadKey();
    }

    方法V1代码如下:与Main方法中的代码段是一模一样的,那么有经验的同学肯定会想,既然已经封装了方法,那么方法的输出应该封装成返回值,返回给Main方法,然后再输出到控制台,于是我们再次修改,封装成方法V2

    private static void V1(int number)
    {
        Console.WriteLine("V1");
        int a = 0, b = 1, c = 0;
        for (int i = 0; i < number; i++)
        {
            Console.WriteLine("{0}", b);
            c = a + b;
            a = b;
            b = c;
        }
    }

    方法V2代码如下:方法V2中创建了一个List<int>的列表,用来接收方法返回的结果,然后在Main方法中输出。那么这里有什么问题呢?问题就是如果循环的基数很大,那么,我们的List中的item就很大,占用内存也会随之增加,于是,我们在此基础上再次改造成方法V3

    private static IEnumerable<int> V2(int number)
    {
        Console.WriteLine("V2");
        List<int> vs = new List<int>();
        int a = 0, b = 1, c = 0;
        for (int i = 0; i < number; i++)
        {
            vs.Add(b);
            c = a + b;
            a = b;
            b = c;
        }
        return vs;
    }

    方法V3代码如下:这里便用到了关键字yield,正如官方文档中所述,迭代器方法运行到 yield return 语句时,会返回一个 expression,并保留当前在代码中的位置。 下次调用迭代器函数时,将从该位置重新开始执行。这样的话,内存不会随着基数的增加而增加,而效果却是一模一样的。

    private static IEnumerable<int> V3(int number)
    {
        Console.WriteLine("V3");
        int a = 0, b = 1, c = 0;
        for (int i = 0; i < number; i++)
        {
            yield return b;
            c = a + b;
            a = b;
            b = c;
        }
    }

    那么,总结经验,在你需要返回一个继承自IEnumerable的集合类型的时候,就可以使用这个yield关键字了。

    最后的运行效果:

  • 相关阅读:
    商城项目开发(一)
    java基础
    SpringBoot笔记
    设计模式-创建型模式
    讲真的 曾惜
    Linux常用精简命令实训练习
    使用ZeroClipboard.js复制内容到剪贴板上
    浅谈Jquery中的bind(),live(),delegate(),on()绑定事件方式
    jQuery mouseover与mouseenter,mouseout与mouseleave的区别
    div中的img垂直居中
  • 原文地址:https://www.cnblogs.com/dwBurning/p/yield.html
Copyright © 2011-2022 走看看