Вопрос
УПД.Здравствуйте, я знаю, как работает код ниже.Я знаю, что крест и круг указывают на методы 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
с помощью IEnumerable
.То есть вы могли бы написать:
foreach (var cross in Cross()) // works with Circle, also
{
// ...
}
И на каждой итерации цикла следующий возвращаемый элемент генерируется внутри Cross
или Circle
метод.Эти методы не выполняются все одновременно, вместо этого каждый раз yield return
достигнут оператор, выполнение программы продолжится в вызывающем коде (теперь foreach
цикл), а выполнение кода внутри генератора возобновляется только тогда, когда требуется следующий элемент.
P.S.: Прежде чем мое интернет-соединение прервалось на несколько часов, я также хотел прокомментировать тот странный факт, что ваши генераторы продолжают возвращать ссылки на себя через yield return
.Честно говоря, для меня это не имеет смысла;Я никогда не видел такого кода, и мне интересно, действительно ли он делает что-то полезное?