在编写一个枚举时,什么产生return var?

可能重复:
在C#中使用的yield关键字是什么?

假设我的代码如下所示:

(蒸汽是文件流)

using(BinaryWriter bw = new BinaryWriter(stream))
{
  foreach(byte[] b in BreakBytes(objectOfBytes))
  {
    writer.Write(b);
  }
}

所以对于BreakBytes的工作,它必须做一些事情:

public static IEnumerable<byte[]> BreakBytes(byte[] b)
{
  ..
  while(..) {

     yield return some_buffer;

  }
  ..
}

什么是收益率? 它是否跟踪它在哪里位置明智?

我相信它会返回到调用的foreach循环,但在再次调用时继续进行下一次迭代?


简而言之,该方法中的代码被重写为一个状态机,它可以像您怀疑的那样执行:它会跟踪它在循环中的位置,返回给调用者并继续停止。


在C#中, yield非常特殊,因为它没有遵循正常的控制流程。

迭代返回的IEnumerableBreakBytes函数将被调用并运行,直到它产生一个值。 控制权将被传回给foreach循环。 当循环步进到下一个项目时, BreakBytes被恢复并运行,直到它达到另一个yield

这个有点奇怪的构造给出的好处是,如果只枚举IEnumerable一部分,则只需要生成该部分。


Jon Skeet可以告诉你关于它们的所有信息:http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx

是。 它跟踪其内部状态。

链接地址: http://www.djcxy.com/p/9093.html

上一篇: When writing an enumerable, what does yield return var?

下一篇: What is the exact usage of Yield Keyword