【发布时间】:2013-05-24 06:32:30
【问题描述】:
我试图了解在 C# 中使用 yield 关键字,因为我正在使用的队列建模包广泛使用它。
为了演示yield的使用,我正在使用以下代码:
using System;
using System.Collections.Generic;
public class YieldTest
{
static void Main()
{
foreach (int value in ComputePower(2, 5))
{
Console.Write(value);
Console.Write(" ");
}
Console.WriteLine();
}
/**
* Returns an IEnumerable iterator of ints
* suitable for use in a foreach statement
*/
public static IEnumerable<int> ComputePower(int number, int exponent)
{
Console.Write ("Arguments to ComputePower are number: " + number + " exponent: " + exponent + "\n");
int exponentNum = 0;
int numberResult = 1;
while (exponentNum < exponent)
{
numberResult *= number;
exponentNum++;
// yield:
// a) returns back to the calling function (foreach),
// b) updates iterator value (2,4,8,16,32 etc.)
yield return numberResult;
}
}
}
代码的作用非常明显,它只是使用 ComputePower 将 2 提高到一个幂,返回一个 IEnumerable。在调试代码时,我看到yield 语句将控制权返回给foreach 循环,并且value 变量更新为最新的power ie 结果。 2、4、8、16、32。
不完全理解yield 的使用,我预计ComputePower 会在值迭代ComputePower 时被多次调用,并且我会看到"Arguments to ComputePower are " 等控制台写入发生5 次。但实际发生的情况是,ComputePower 方法似乎只调用了一次。我每次运行只看到一次"Arguments to ComputePower.." 字符串。
有人可以解释为什么会这样吗?跟yield关键字有关系吗?
【问题讨论】:
-
你读过yield吗?
-
您应该能够在调试器中单步执行它以查看确切的流程。
-
是的,或者 Jon Skeet 的 C# in Depth 很好地解释了这一点
-
另外,this answer 提供了一些关于该主题的最佳资源的链接
标签: c# yield-return