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