学习集合和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";
}
答案 0 :(得分:8)
包含IEnumerator
的{{1}}的代码分为两部分。
创建一个新的yield
类,其中包含您的原始代码,尽管已经重写,以便按照您的预期执行。 这是您的原始代码,包含IEnumerator
生命。
Console.WriteLine
方法包含全新生成的代码,只需实例化上面定义的GetEnumerator()
并返回它。
因此,在调用第一个IEnumerator
之前,没有任何代码运行。
这就是为什么您经常会看到以下模式,例如:立即执行参数验证。实现分为两部分:普通方法和包含MoveNext()
的方法。
yield