C#中foreach的实现原理

在探讨foreach如何内部如何实现这个问题之前,我们需要理解两个C#里边的接口,IEnumerable 与 IEnumerator. 在C#里边的遍历集合时用到的相关类中,IEnumerable是最基本的接口。这是一个可以进行泛型化的接口,比如说IEnumerable<User>.在微软的.NET推出了这两个接口后,才有了foreach的用法,可以说,foreach是建立在这两个接口的基础之上的,foreach的前提是其里边的容器要实现了IEnumerable接口。

IEnumerable 这个接口里边定义的内容非常简单,最重要的就是里边有一个抽象方法GetEnumerator. IEnumerable的意思是这个集合是可以遍历的,而这个GetEnumerator方法返回的IEnumerator的就是一个遍历器,用这个工具来遍历这个类。如果说IEnumerable 是一瓶香槟,那么IEnumerator就是一个开瓶器。在实现这个IEnumerable接口的时候,必须要实现这个GetEnumerator方法,要返回一个实例化的IEnumorator.

下面来介绍一下这个IEnumorator接口。这个接口中定义的内容也很简单,包括Current,就是返回这个遍历工具所指向的那个容器的当前的元素,MoveNext 方法就是指向下一个元素,当遍历到最后没有元素时,返回一个false.当我们实现一个IEnumerable类的时候,我们的目的就应该是遍历这个集合,所以同时我们要实现IEnumerator这个工具类,定义我们自己的逻辑来告诉CLR我们怎么去遍历这个集合。

最新文章

  1. 了解JavaScript 数组对象及其方法
  2. ibatis order by 防止sql注入
  3. Arduino中的setup()和loop()函数
  4. cocos2d-html5版日历组件
  5. BZOJ 2243: [SDOI2011]染色 (树链剖分+线段树合并)
  6. 初始——第一款个人开发上线app store
  7. Java学习之字符串练习
  8. C奇淫技巧,——宏神奇
  9. 安装程序添加iis的方法经验分享
  10. 尚学堂Java面试题整理
  11. jBPM学习之利用API完成流程实例
  12. Wannafly挑战赛29-A/B
  13. Python的程序入口 __name__属性
  14. &lt;OFFER&gt; 06_PrintListInReversedOrder
  15. 如何正确的加载和执行 JavaScript 代码
  16. angularJS1笔记-(10)-自定义指令(templateUrl属性)
  17. 2008ZJOI树的统计
  18. drupal7请求异常,执行时间过长的解决方法
  19. 基于Linux的智能家居的设计(5)
  20. 20145238-荆玉茗《Java程序设计》课程总结

热门文章

  1. 项目中对获取的数据进行下载成Excel表格
  2. 使用pdfobject.js
  3. 在wildfly中使用SAML协议连接keycloak
  4. ⑦SpringCloud 实战:引入Sleuth组件,完善服务链路跟踪
  5. CORS(跨域资源共享)笔记
  6. 中小学生的噩梦:怎样用Python检测抄袭行为?广大中小学生们的美梦就此结束
  7. Nocalhost,让开发回归原始又简单
  8. Log4Net日志的简单使用示例
  9. Java进阶专题(二十) 消息中间件架构体系(2)-- RabbitMQ研究
  10. python初学者-鸡兔同笼简单算法