• C#中yield关键字理解


    yield关键字之前用得较少,但是在做项目开发的过程中也遇到了,当时有点迷惑,就顺便研究学习了一下,以下是个人理解,不到之处欢迎拍砖!废话就到这,上代码:

    class Program
    {
    static void Main(string[] args)
    {
    string[] strs = new string[] { "1", "2", "3", "4" };
    foreach (var item in GetInts(strs))
     {
    Console.WriteLine(item.GetType() + "----" + item);
    }
    Console.ReadKey();
    }

    static IEnumerable<int> GetInts(string[] strs)
    {
    foreach (var item in strs)
    {
    //这里写了个扩展方法 yield return item.ToInt32();
    }
    }
    }

    执行结果:

    简单说明:(1)正常我们返回值的时候,可以将GetInts方法写成一个List方法接受返回,代码多行List.Add()不说,用完yeild return 后直接一行代码返回,代码精简了许多;可以理解成一个容器,先这么使用;(注意:这里的理解不正确)

    下面来看正确理解:

    对上述代码进行改造:

     1      static void Main(string[] args)
     2         {
     3             string[] strs = new string[] { "1", "2", "3", "4" };
     4            
     5             foreach (var item in GetInts(strs))
     6             {
     7                 if (item>2)
     8                 {
     9                     break;
    10                 }            
    11                 Console.WriteLine(item.GetType() + "----" + item);
    12 
    13             }
    14             Console.ReadKey();
    15         }
    16 
    17         static IEnumerable<int> GetInts(string[] strs)
    18         {
    19             foreach (var item in strs)
    20             {
    21                 Console.WriteLine(item.GetType());
    22 
    23                 //这里写了个扩展方法
    24                 yield return item.ToInt32(); 
    25             }
    26         }
    27     }

    注意标红色部分的代码,下面来看执行结果:
    说明:正常我们不加yield关键字的时候,是需要先把整个GetInts()方法体内的foreach循环全部执行完后,然后才做判断,现在不一样了,可以通过代码调试发现:yield会执行到yield return
    这行代码后进行冻结,然后把控制权转交到外部,只要满足条件if(item>2){break;},所以我们通过结果可以发现他的执行顺序,由此可以放大,现在仅仅是个数组数据小,如果有成千上万行的对象
    数据,那么他的性能就非常明显,找到满足的条件就可以返回结果;

    总结:当前代码示例 yield 关键字 一次性返回过来,这种一种用法,不过理解错误;正确理解为:将当前代码块执行冻结,将控制权交给外界,一旦得到想要的结果立即返回,不往下执行。
    更多的可以参考开源项目:如EF和MVC中大量使用。


    如有兴趣,欢迎大家加入微软实战训练营QQ群203822816进行技术探讨交流,里面有国内最新C#技术,绝对最新哦!!!



  • 相关阅读:
    布局(layout)文件图形界面不能显示:An error has occurred. See error log for more details. java.lang.NullPointe
    Mac下无法推出硬盘
    Excel导入导出数据库(MVC)
    json导入数据库
    XML导入数据库
    Excel表格导入数据库
    Lambda高级查询
    Linq高级查询
    多线程
    反射
  • 原文地址:https://www.cnblogs.com/xiaowu54/p/5425352.html
Copyright © 2020-2023  润新知