문제
업드안녕하세요, 아래 코드가 어떻게 작동하는지 알고 있습니다.나는 그 십자가를 알고,원은 십자가(),원()방법을 가리키고 있습니다.그러나 나는 여전히 코드의 이 부분에 약간의 혼란을 채우고 있습니다.당신은 나를 위해 그것을 설명 할 수?
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
다음 항목이 필요할 때만 생성기 내부의 코드가 다시 시작됩니다.
추신:: 내 인터넷 연결이 몇 시간 동안 고장 전에,나는 또한 당신의 발전기를 통해 자신에 대한 참조를 반환 유지하는 이상한 사실에 대해 언급하고 싶었다 yield return
.그건 정말 나에게 이해가되지 않습니다,솔직히 말해서;나는 그런 종류의 코드를 본 적이 없으며 실제로 유용한 것을하는지 궁금합니다.
제휴하지 않습니다 StackOverflow