C#开发笔记概述

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/961 访问。

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

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

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

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


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

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

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

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/961 访问。


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

【转】C#开发笔记之05-迭代器中的状态机(State Machine)到底是什么?相关推荐

  1. 【QtDesigner 开发笔记】在PyCharm中配置、使用方法、信号与槽、菜单、Tab Widget、子窗口

    QtDesigner开发笔记 在PyCharm中配置QtDesigner和Pyuic QtDesigner使用:跑起一个最简单的项目 QtDesigner中使用信号与槽 方法1:设计器中连接信号与槽 ...

  2. Bluedroid中SSM(stream state machine)

    文章目录 Bluedroid中ssm 状态定义 状态表 如何追踪ssm消息处理机制 Bluedroid中ssm 状态定义 ssm(stream state machine) Bluedroid中的状态 ...

  3. IOS开发笔记17-Object-C中的继承

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 在前面的程序Person.h文件中可以看到,Person继承了NSObj ...

  4. IOS开发笔记16-Object-C中的属性

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/54667858 本文出自:[顾林海的博客] 前言 前一篇笔记记录了自定类 ...

  5. IOS开发笔记13-Object-C中的NSString

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53572258 本文出自:[顾林海的博客] 前言 NSString是Ob ...

  6. IOS开发笔记12-Object-C中的对象与内存

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53556243 本文出自:[顾林海的博客] 前言 Object-C的内存 ...

  7. IOS开发笔记11-Object-C中的传递消息

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53534039 本文出自:[顾林海的博客] 前言 在前一篇例子中传递的是 ...

  8. IOS开发笔记10-Object-C中的对象

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53513004 本文出自:[顾林海的博客] 前言 关于c语言的基础部分已 ...

  9. [开发笔记]-DataGridView控件中自定义控件的使用

    最近工作之余在做一个百度歌曲搜索播放的小程序,需要显示歌曲列表的功能.在winform中采用DataGirdView来实现. 很久不写winform程序了,有些控件的用法也有些显得生疏了,特记录一下. ...

  10. TC397 SPI开发笔记【持续更新中...】

    文章目录 背景 特性 芯片手册的信息 特性 QSPI模块抽象 外部信号 操作模式 队列支持概述 架构概述 三线连接 功能描述 频率域 主模式状态机 一个通讯周期的各个阶段 背景 公司一个项目,要实现两 ...

最新文章

  1. 跨平台PHP调试器设计及使用方法——界面设计和实现
  2. java length 使用方法 例题_java.util.BitSet.length()方法实例
  3. [Enterprise Library]Configuration类设计分析
  4. 在Vista下配置VS2003
  5. boost::hana::not_用法的测试程序
  6. Caffe-windows入门学习,编译、训练、测试详细教程
  7. fopen,fopen_s,fclose, _fcloseall函数用法
  8. Oracle事务处理
  9. 小新触控板不能用了_小新Pad Pro体验----高颜值新青年平板
  10. oracle左连接查询代码,ORACLE连接查询,内外连接
  11. Python 处理分析 128 张 Excel 表格竟不到3秒?| 附数据集
  12. Ubuntu 16.zabbixserver服务报错: Assuming that agent dropped connection because of access permissions.
  13. 电脑位数怎么看_怎么用电脑播放4K视频?怎么用电脑看4K电影? 附带详细教程...
  14. Ubuntu安装显卡驱动详细步骤
  15. html鼠标经过小手,css鼠标小手
  16. 金角大王 python_【51CTO学院三周年】 老男孩python全栈心路
  17. 斐讯w2Android Wear,有人研究过W2的连接QRcode吗?
  18. HMM原理解析(转载)
  19. Win7下配置PHP+Nginx
  20. 高性价比掌机Retroid Pocket 3:搭载展锐芯片T310,采用PowerVR GPU

热门文章

  1. 【软件开发底层知识修炼】十二 C/C++语言中内嵌汇编语言(asm)
  2. 【C++深度剖析教程10】C++中的字符串类
  3. python之Map函数 reduce 函数
  4. LOJ10121 与众不同
  5. Redis实现之对象(三)
  6. 浅谈高斯消元的实现和简单应用
  7. angular-cli构建
  8. javascript知识点记录(2)
  9. cad刷新快捷键_第16期分享:常用电脑快捷键是哪些?
  10. python写入二进制文件的库_python之写入二进制文件