提示:有待后续持续更新
前言
提示:这里可以添加本文要记录的大概内容:
例如:
一、一个简单的迭代器产生整数
static IEnumerable<int> CreatSimpleIterator()
{
yield return 10;
for (int i = 0; i < 3; i++)
{
yield return i;
}
yield return 20;
}
// 延迟执行 这个写在main中
foreach (int value in CreatSimpleIterator())
{
Console.WriteLine(value);
}
二、foreach循环就相当于执行了下面这些语句
IEnumerable<int> enumerable = CreatSimpleIterator(); // IEnumerable相当于一本书
using (IEnumerator<int> enumerator=enumerable.GetEnumerator()) // IEnumberator相当于书签 括号里面调用这本书的GetEnumerator()方法相当于把一个新的书签放到了这本书的开头,接下来,只要改变书签的位置就可以获取到数的内容
{
// 当到达end of the method或者yield break语句时,MoveNext()方法返回false,停止执行
// 当MoveNext()方法返回true,意味着你已经移动到下一个值并且你可以access这个Current属性
while (enumerator.MoveNext()) // 例子中为yield return语句,当执行到yield return语句,MoveNext()方法返回true,并且Current获取到的属性值为yield return后面的值,然后输出
{
int value = enumerator.Current;
Console.WriteLine(value);
}
}
三、当执行了一个yield return语句后,接下来该如何执行呢?
The generated code keeps track of the point you’va reached in the method along with any other state,这就和循环中的一个局部属性i一样。When MoveNext() is called again,execution picks up from the point you’ve reached and keeps going.