yield 是 C# 中用于创建迭代器的关键字。使用 yield 关键字可以使一个方法返回一个可以逐个访问的集合,而不需要立即构建整个集合。
yield 的实现原理如下:
- 当调用包含 yield 关键字的方法时,方法体内的代码不会立即执行,而是返回一个实现了 IEnumerable 或 IEnumerator 接口的迭代器对象。
- 当迭代器对象的 MoveNext() 方法被调用时,方法体内的代码开始执行。直到遇到 yield 关键字,该关键字会将当前的值返回给调用方,并暂停代码的执行。
- 下次调用 MoveNext() 方法时,代码会从上次暂停的位置继续执行,直到遇到下一个 yield 关键字或方法结束。
- 当迭代器对象的 Reset() 方法被调用时,代码会回到初始状态,下次调用 MoveNext() 方法时会重新执行。
- 当迭代器对象到达集合的末尾时,MoveNext() 方法返回 false,表示迭代结束。
这样,通过 yield 关键字可以方便地创建一个延迟加载的集合。在需要迭代集合元素时,只会执行必要的代码,减少了内存开销和计算的时间复杂度。