UPD。 你好, 我知道下面的代码是如何工作的。我知道cross和circle指向Cross()和Circle()方法。但我仍然对这部分代码感到困惑。你能帮我解释一下吗?
public GameMoves()
{
cross = Cross();
circle = Circle();
}
所有代码
static void Main(string[] args)
{
GameMoves game = new GameMoves();
IEnumerator enumerator = game.Cross();
while (enumerator.MoveNext())
{
enumerator = (IEnumerator)enumerator.Current;
}
}
}
public class GameMoves
{
private IEnumerator cross;
private IEnumerator circle;
public GameMoves()
{
cross = Cross();
circle = Circle();
}
private int move = 0;
public IEnumerator Cross()
{
while (true)
{
Console.WriteLine("X, step {0}", move);
move++;
if (move > 9)
yield break;
yield return circle;
}
}
public IEnumerator Circle()
{
while (true)
{
Console.WriteLine("O, step {0}", move);
move++;
if (move > 9)
yield break;
yield return cross;
}
}
}
答案 0 :(得分:1)
Cross
和Circle
都是生成器。它们通过object
返回IEnumerable
s序列。也就是说,你可以写:
foreach (var cross in Cross()) // works with Circle, also
{
// ...
}
在每次循环迭代中,要返回的下一个元素都是在Cross
或Circle
方法中生成的。这些方法不是一次执行所有方法,而是每次达到yield return
语句时,程序执行将在调用代码(foreach
循环)中继续,并且生成器内的代码只是在需要下一个项目时恢复。
P.S。:在我的互联网连接中断了几个小时之前,我还想评论一下这样一个奇怪的事实:你的发电机通过yield return
不断返回对自己的引用。说实话,这对我来说真的没有意义;我从来没有见过那种代码,我想知道它是否真的有用吗?