C#开发笔记之05-迭代器中的状态机(State Machine)到底是什么?

C#开发笔记之05-迭代器中的状态机(State Machine)到底是什么?

C#开发笔记概述

文章目录

概述

状态机可以理解为实现了备忘录模式(仅作为理解)的记录状态的机器,这个机器记录的是某个对象的中间状态。对于迭代器来说,它所要记录的状态就是迭代器游标,以指示外部的访问导致了迭代器中指针的位置发生了移动。

解释

外部访问迭代器时无需关心迭代器内部的细节,迭代器内部的细节由自身和备忘录(仅作为理解)来维护。每次迭代器被访问时,游标向后移动一位,外部无法准确知道游标当前所处位置也无需知道。当游标移动到最后一个元素之后时,外部无法再获取迭代器内部维护的数据,迭代终止条件达成,迭代结束。

一般而言迭代器内部维护的数据是按顺序返回的,但并不总是这样。若实现自己的迭代器,可以根据业务逻辑选择是否顺序、逆序或随机不重复式返回。但不推荐这样做,因为你可能需要额外的信息和逻辑来判断游标是不是真正的到“最后一个元素”,以决定是否达到迭代终止条件。

如果你能理解上述观点的话,我们再来看看 C# 2.0 中的 yield return。以下摘自微软官方对 yield return 的介绍。

使用 yield return 语句可一次返回一个元素。(外部获取到了数据,运行时为我们创建了一个状态机以便在接下来的过程中为我们记录迭代器游标状态)

通过 foreach 语句或 LINQ 查询来使用迭代器方法。for each 循环的每次迭代都会调用迭代器方法。 迭代器方法运行到 yield return 语句时,会返回一个 expression,并保留当前在代码中的位置(其实是状态机为我们之前的调用记录了状态)。 下次调用迭代器函数时,将从该位置重新开始执行。

可以使用 yield break 语句来终止迭代。

综上所述,迭代器中的状态机仅仅是记录迭代器游标状态的 machine,它是一个维护迭代器状态的 Black Box,对外部代码透明。

本文由 .Net中文网 原创发布,欢迎大家踊跃转载。

转载请注明本文地址:https://www.byteflying.com/archives/961

发表评论

登录后才能评论