zoukankan      html  css  js  c++  java
  • yield return

    yield return 是用来实现迭代器的:


    public class ListClass
    {
      public IEnumerable SampleIterator(int start, int end)
      {
        for (int i = start; i <= end; i++)
          yield return i;
      }
    }

    使用代码:

      foreach (int n in test.SampleIterator(1, 10))
        System.Console.WriteLine(n);


    其原理是,每次通过foreach语句获取个体的时候,执行下一句yield return语句。对于上述例子来说,执行到最后一个yeied return 10的时候,下一次foreach又要求获取一个对象,但是SampleIterator()函数直接返回了,那么foreach就执行完成。这样是比较合理的。


    如下例子:

    public System.Collections.IEnumerator GetEnumerator()
    {
      yield return "With an iterator, ";
      yield return "more than one ";
      yield return "value can be returned";
      yield return ".";
    }

    可以迭代4次,每次返回一个String。可能yield return 是通过Fiber实现的:

    template <class T, class R>
    void Enumerator::Return(const R &value)
    {
        Enumerator *E=(Enumerator *)GetFiberData(); // get the context, stored in fiber data
    
        if (E->Fiber!=GetCurrentFiber()) // check, if it is the same fiber - 
    
                                            // Fiber field is spoofed at cleanup
    
        {
            *E->pResult=value; // set the result
    
            SwitchToFiber(E->Fiber); // return to main fiber
        }
    }
    


    先切换到yield的纤程,然后获取数据,然后将控制权交给主纤程。


  • 相关阅读:
    jquery对同级的td做radio限制
    "javascript:void(0)"用法
    SQL 插入查询的最大ID 号 进行批量
    Java数字、货币值和百分数等的格式化处理
    PHP 注意问题
    Android Fragment真正意义上的onResume和onPause
    Android_CodeWiki_03
    Android_CodeWiki_02
    Android_CodeWiki_01
    Android 启动APP黑屏解决方案
  • 原文地址:https://www.cnblogs.com/puncha/p/3877030.html
Copyright © 2011-2022 走看看