题
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;
}
}
}
解决方案
两者兼而有之 Cross
和 Circle
是发电机。他们返回一个序列 object
s通过一个 IEnumerable
.也就是说,你可以写:
foreach (var cross in Cross()) // works with Circle, also
{
// ...
}
在每次循环迭代中,要返回的下一个元素会在 Cross
或 Circle
方法。这些方法不是一次全部执行,而是每次执行 yield return
语句到达,程序执行将继续在调用代码( foreach
循环),并且生成器内部的代码只有在下一项需要时才恢复。
附:: 在我的互联网连接中断了几个小时之前,我还想评论一个奇怪的事实,即你的生成器不断通过 yield return
.老实说,这对我来说没有意义;我从未见过这种代码,我想知道它是否真的有用?
不隶属于 StackOverflow