• C# yield


      C#中的yield可以应用在一个可迭代的方法中,我们必须真正理解此关键词,才能将它正确的应用到实际生产中。为了说明yield会出现让我们迷惑的结果,下面先定义一个MyObject类:

    1     class MyObject
    2     {
    3        public int Value{get;set;}
    4     }

      MyObject类用于存放一个值,下面定义一个IEnumerable<MyObject>的方法:

    1 IEnumerable<MyObject> GetYieldObjects()
    2 {
    3     for (int i = 0; i < 10; i++)
    4     {
    5         Console.WriteLine("GetObjects() i="+i.ToString());
    6         yield return new MyObject() { Value = i };
    7     }
    8 }

       方法中用yield return返回实例化的MyObject对象,为了便于记录GetYieldObjects()方法实际调用的过程,这里用Console.WriteLine来记录每次调用的过程。下面声明一个objects对象,然后进行第一次迭代,在第一次迭代过程中,对每个迭代项目的值进行+10处理,然后进行第2此迭代,看看是否会将处理后的值进行输出:

     1 //此时不调用GetObjects()的内部循环
     2 var objects = GetYieldObjects();
     3 //每次迭代会调用GetObjects()对应i的内容
     4 foreach (var item in objects)
     5 {
     6     Console.WriteLine("1 foreach (var item in objects) item.Value=" + item.Value.ToString());//0..9
     7     item.Value += 10;
     8 }
     9 //每次迭代会调用GetObjects()对应i的内容
    10 foreach (var item in objects)
    11 {
    12     Console.WriteLine("2 foreach (var item in objects) item.Value=" + item.Value.ToString());//0..9
    13     Console.WriteLine(item.Value.ToString());//0..9
    14 }

       在第2次迭代时,输出的还是0到9,并不是10到19.请看下面的迭代过程:

    当第一次迭代时候,每次迭代会调用GetObject()方法中的yield return语句,而不是在var objects=GetObjects()进行实例化。当yield取到一个MyObject对象后立刻返回给迭代器,并将其值进行输出,然后继续调用GetObjects方法中的yield return语句,

    因此每次循环时,实际上都是一个新的对象。如下图所示:

       当然如果将上面的代码稍作修改,用objects=GetYieldObjects().ToArray()的话,那么第二次输出的就是10到19:

     1 objects = GetYieldObjects().ToArray();
     2 foreach (var item in objects)
     3 {
     4     item.Value += 10;
     5 }
     6 
     7 foreach (var item in objects)
     8 {
     9     Console.WriteLine(item.Value.ToString());//10..19
    10 }
  • 相关阅读:
    Java实现One-way traffic(单向交通)
    Java实现One-way traffic(单向交通)
    Java实现One-way traffic(单向交通)
    Java实现One-way traffic(单向交通)
    C#调用Delphi Dll返回字符串的示例(使用Move才能拷贝字符串)
    Delphi实现菜单项上出现提示
    WebBrowser中获得脚本中的变量值
    比较两个文件是否相同(比较两个流是否相等)
    WebBrowser执行脚本和调用外部方法
    c#之函数创建和闭包
  • 原文地址:https://www.cnblogs.com/isaboy/p/c_yield.html
Copyright © 2020-2023  润新知