使用yield return时GetEnumerator()方法会发生什么?

时间:2013-08-01 09:56:24

标签: c# collections enumerator yield-return

学习集合和IEnumerable以及IEnumerator接口。 我有以下程序。我什么时候进入

IEnumerator<string> name = sample.GetEnumerator();

它调用Console.WriteLine("inside getenumerator");

class Program
    {
        static void Main(string[] args)
        {
            SampleStrings sample = new SampleStrings();
            IEnumerator<string> name = sample.GetEnumerator();
            foreach (var item in sample)
            {
                Console.WriteLine(item);
            }
            Console.ReadLine();
        }
    }
    class SampleStrings : IEnumerable<string>
    {
        public IEnumerator<string> GetEnumerator()
        {
            Console.WriteLine("inside getenumerator");

            return null;//for testing purpose only
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }
    }

现在如果我在同一IEnumerator<string> name = sample.GetEnumerator();时更换GetEnumerator,如下所示 被调用然后它不会进入函数。我希望它进入函数但不返回任何东西,因为我还没有调用movenext()。 当我指定使其以这种方式运行的产量时发生的事情。该计划有效。

public IEnumerator<string> GetEnumerator()
        {
            Console.WriteLine("inside getenumerator");
            yield return "First";
            yield return "Second";

        }

1 个答案:

答案 0 :(得分:8)

包含IEnumerator的{​​{1}}的代码分为两部分。

创建一个新的yield类,其中包含您的原始代码,尽管已经重写,以便按照您的预期执行。 这是您的原始代码,包含IEnumerator生命。

Console.WriteLine方法包含全新生成的代码,只需实例化上面定义的GetEnumerator()并返回它。

因此,在调用第一个IEnumerator之前,没有任何代码运行。

这就是为什么您经常会看到以下模式,例如:立即执行参数验证。实现分为两部分:普通方法和包含MoveNext()的方法。

yield