通过无限循环示例在C#中产生

Edw*_*d83 2 c# state loops yield

我试图了解C#中的yield如何工作.为了测试我做了一些示例代码:

using System;
using System.Text;

namespace ConsoleApplication1
{
    class GameFrame
    {
    };

    class GameState
    {
        public static GameFrame Begin()
        {
            Console.WriteLine("GameState.Begin");

            return new GameFrame();
        }

        public static GameFrame Play()
        {
            Console.WriteLine("GameState.Play");

            return new GameFrame();
        }

        public static System.Collections.Generic.IEnumerator<GameFrame> MainLoop()
        {
            yield return Begin();

            while (true)
            {
                yield return Play();
            }
        }
    };


    class Program
    {
        static void Main()
        {
            while (GameState.MainLoop() != null)
            {
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码仅尝试运行一次Begin函数并调用无限次函数Play.请告诉我为什么我从未在控制台中看到我的消息?

Sri*_*vel 12

您需要枚举集合,您只需检查结果是否结果null,不会启动枚举.

foreach (var frame in GameState.MainLoop())
{
    //Do whatever with frame
}
Run Code Online (Sandbox Code Playgroud)

为了使它可以使用`foreach,可以使MainLoop方法返回IEnumerable<GameFrame>而不是IEnumerator<GameFrame>只是使用

var enumerator = GameState.MainLoop();
while (enumerator.MoveNext())
{
     //Do whatever with enumerator.Current
}
Run Code Online (Sandbox Code Playgroud)