IEnumerable接口
IEnumerable接口顾名思义就是 可枚举的,可列举的。
接口也很简单,返回一个 枚举器对象 IEnumerator 。
[ComVisible(true), Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable
{
[DispId(-)]
IEnumerator GetEnumerator();
}
1. IEnumerable 与 IEnumerator
IEnumerable只有一个抽象方法:GetEnumerator(),而IEnumerator又是一个迭代器,真正实现了访问集合的功能。 IEnumerator只有一个Current属性,MoveNext和Reset两个方法。
有个小问题,只搞一个访问器接口不就得了?为什么要两个看起来很容易混淆的接口呢?一个叫枚举器,另一个叫迭代器。因为
1) 实现IEnumerator是个脏活累活,白白加了两个方法一个属性,而且这两个方法其实并不好实现(后面会提到)。
(2) 它需要维护初始状态,知道如何MoveNext ,如何结束,同时返回迭代的上一个状态,这些并不容易。
(3)迭代显然是非线程安全的,每次IEnumerable都会生成新的IEnumerator,从而形成多个互相不影响的迭代过程。在迭代过程中,不能修改迭代集合,否则不安全。
所以只要你实现了IEnumerable,编译器就会帮我们实现IEnumerator。何况绝大多数情况都是从现有集合继承,一般不需要重写MoveNext和Reset方法。 IEnumerable当然还有泛型实现,这个不影响问题的讨论。
IEnumerable也有它的缺点,它没法后退,没法跳跃(只能一个一个的跳过去),而且实现Reset并不容易,无法实现索引访问。想想看, 如果是一个实例集合的枚举过程,直接返回到第0个元素就可以了,但是如果这个IEnumerable是漫长的访问链条,想找到最初的根是很困难的!所 以CLR via C#的作者告诉你,其实很多Reset的实现根本就是谎言,知道有这个东西就行了,不要太过依赖它。
具体实现请看我的另外一篇文章 http://www.cnblogs.com/yplong/p/5286906.html
IEnumerable接口的更多相关文章
- C# 索引器,实现IEnumerable接口的GetEnumerator()方法
当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [ ...
- 你可能不知道的陷阱, IEnumerable接口
1. IEnumerable 与 IEnumerator IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的 ...
- foreach为什么要实现IEnumerable接口而不是直接用IEnumerator接口
在.Net中,要想被foreach遍历,那么目标对象要实现IEnumerable或IEnumerable<T>接口,这个接口有一个方法,GetEnumerator(),返回一个IEnume ...
- EF架构~为IEnumerable接口添加增删查等操作,原因是IEnumerable导航属性更放心
回到目录 对EF开发来说,导航属性肯定都用过,事实上,它是由VS IDE工具根据你的数据库关系结构自动生成的外键属性,在类视图中可以看到相关属性,它是以外键表名来标识的,如果是一对多的关系,那么,它会 ...
- IEnumerable接口的实现
对象要实现可以迭代需IEnumerable接口并实现GetEnumerator方法.一下简单例子 public class SPEnumerable<T> : IEnumerable { ...
- IEnumerable 接口 实现foreach 遍历 实例
额 为啥写着东西? 有次面试去,因为用到的时候特别少 所以没记住, 这个单词 怎么写! 经典的面试题: 能用foreach遍历访问的对象的要求? 答: 该类实现IEnumetable 接口 声明 ...
- IEnumerator/IEnumerable接口
IEnumberator函数成员 Current返回序列中当前位置项的 属性 只读属性 返回object类型 MoveNext把枚举器位置前进到集合中下一项的方法 新位置有效返回true,否则fals ...
- IEnumerable接口的扩展方法
/// <summary>/// IEnumerable接口的扩展方法,支持它的实现类是List的情况/// </summary>using System.Collection ...
- 一位有着工匠精神的博主写的关于IEnumerable接口的详细解析
在此,推荐一位有着工匠精神的博主写的一篇关于IEnumerable接口的深入解析的文章:http://www.cnblogs.com/zhaopei/p/5769782.html#autoid-0-0 ...
随机推荐
- ab 测试模块高并发
转载:http://gekie.iteye.com/blog/1704235 作为程序员,写好一个模块后,不知道这个模块在高并发的情况下能不能平稳过渡,这里所说的平稳过渡是指,在高并发的情况下还能正常 ...
- 无须任何软件配置iis+ftp服务器图文说明
1.1 检查是否安装已安装IIS6组件 在windows service 2003 操作系统中,windows组件“IIS6.0”是用户搭建站点以及ftp文件共享的服务器. 具体检查步骤如下: 进入“ ...
- GitLab 的 Developer 角色没有权限提交问题
"C:\Program Files\Git\bin\git.exe" push --recurse-submodules=check --progress "origin ...
- git第一次提交代码到远程仓库
博客搬家了,本文新地址:http://www.zicheng.net/article/4 感谢支持 本操作说明是先有代码,后来创建git仓库,然后把本地代码提交到远程仓库的操作步骤: 1.初始化 在当 ...
- Ubuntu 14.04 安装nVidia驱动后不能进入图形界面的恢复过程
想要解决Ubuntu14.04的风扇不停的转的问题.由于ubuntu本身不支持双显卡切换,导致集显独显都处于开启状态,发热量和耗电量居高不下. 1. 安装驱动过程 参考[1]中的步骤,做了如下的操作. ...
- Hadoop 2.4.1 Map/Reduce小结【原创】
看了下MapReduce的例子.再看了下Mapper和Reducer源码,理清了参数的意义,就o了. public class Mapper<KEYIN, VALUEIN, KEYOUT, VA ...
- nginx 安装与反向代理测试 under MAC
安装 在 Mac 下可以直接使用 homebrew 安装 nginx brew search nginx brew install nginx 启动 nginx: sudo nginx,访问 8080 ...
- 在线程池使用Callable和Runnable的区别以及如何关闭线程
一.区别总结: Callable定义的方法是call,而Runnable定义的方法是run. Callable的call方法可以有返回值,而Runnable的run方法不能有返回值,这是核心区别. C ...
- JQM[jquery mobile] 实战经验汇总
动态装载的子页面(data-role=”page”),完全不用page div之外的tag,也不会起作用.子页面的javascript脚本必须写在page的</div>之前. 切换按钮(a ...
- iOS SDK Release Notes for iOS 9 iOS9 SDK 版本更新说明
Important: This is a preliminary document for an API or technology in development. Apple is supplyin ...