可能重复:
What is the yield keyword used for in C#?
假设我有如下代码:
(蒸汽是污秽物)
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;
}
..
}屈服到底在做什么?它能追踪到它的位置吗?
我相信它是返回到调用的前端循环,但继续到下一个迭代时,再次调用?
发布于 2011-07-18 19:36:24
简而言之,该方法中的代码被重写为一台状态机,正如您所怀疑的那样:它跟踪循环中的位置,返回给调用者,并继续其中断的位置。
发布于 2011-07-18 19:35:36
yield在C#中非常特殊,因为它不遵循正常的控制流。
当迭代返回的IEnumerable时,BreakBytes函数将被调用并运行,直到它产生一个值。控件将被传递回foreach循环。当循环步骤到下一项时,BreakBytes将继续并运行,直到它到达另一个yield。
这个有点奇怪的构造给出的好处是,如果只枚举了IEnumerable的一部分,那么只需要生成该部分。
发布于 2011-07-18 19:42:24
乔恩·斯基特可以告诉你关于他们的一切:http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx
是。它跟踪自己的内部状态。
https://stackoverflow.com/questions/6738342
复制相似问题