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的纤程,然后获取数据,然后将控制权交给主纤程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值