zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    算法训练 表达式计算
    基础练习 十六进制转十进制
    基础练习 十六进制转十进制
    基础练习 十六进制转十进制
    New ways to verify that Multipath TCP works through your network
    TCP的拥塞控制 (Tahoe Reno NewReno SACK)
    Multipath TCP Port for Android 4.1.2
    How to enable ping response in windows 7?
    NS3
    Multipath TCP Port for Android
  • 原文地址:https://www.cnblogs.com/isaboy/p/c_yield.html
Copyright © 2011-2022 走看看