- 1、本文档共28页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
.NET面向对象程序设计 第19章 枚举集合 19.1枚举集合中的元素 foreach语句极大的简化了需要编写的代码 int[ ] pins = { 9, 3, 7, 2 }; foreach (int pin in pins) { Console.WriteLine(pin); } 为什么数组可以这么做呢? 数组可以按需提供一个叫做枚举器的对象,枚举器可以依次返回请求的数组的元素 枚举器指导项的次序并且跟踪它在序列中的位置,然后返回请求的当前项 对于枚举器的类型而言,必须有一个方法来获取它们 在.net中获取一个对象枚举器的标准方法是调用对象的GetEnumerator方法 凡是实现了GetEnumerator方法的类型叫做可枚举类型enumerable 可枚举的集合:实现了System.Collections .IEnumerable接口的一个集合 C#中所有数组都是System.Array类的实例 该类是实现了IEnumerable接口的一个集合类 在IEnumerable接口中,包含一个名为GetEnumerator的方法: IEnumerator GetEnumerator(); GetEnumerator方法返回一个枚举器对象,该枚举器实现了System.Collections .IEnumerable接口 枚举器对象用于遍历集合中的元素 IEnumerator接口指定了以下方法和属性: object Current { get; } bool MoveNext(); void Reset(); foreach结构被设计用来和可枚举类型一起使用,只要给他的遍历对象是可枚举类型,比如数组,它会执行以下操作: 通过调用GetEnumerator方法获取对象的枚举器 从枚举器中请求每一项并且把它作为迭代变量 枚举器类型 枚举器一共有三种,工作原理相同,但有一些细小的区别 IEnumerator/IEnumerable接口—非泛型接口形式 IEnumeratorT/IEnumerableT接口—泛型接口形式 不使用接口形式 2、使用IEnumerator 接口 IEnumerator接口包含三个函数成员:Current、MoveNext以及Reset。 Current返回序列中当前位置项的属性。 它是只读属性。 它返回object类型的引用,所以可以返回任何类型。 MoveNext是把枚举数位置前进到集合中下一项的方法。它也返回布尔值,指示新的位置是有效位置或已经超过了序列的尾部。 如果新的位置是有效的,方法返回true。 如果新的位置是无效的(比如到达了尾部),方法返回false 枚举数的原始位置在序列中的第一项之前。MoveNext必须在第一次使用Current之前使用,否则CLR会抛出一个InvalidOperationException异常。 Reset方法把位置重置为原始状态。 枚举数类通常被声明为类中的嵌套类 枚举数与序列中的当前项保持联系的方式完全取决于实现。可以通过对象引用、索引值或其他方式来实现。对于数组来说,就使用项的索引。 有了集合的枚举数,我们就可以使用MoveNext和Current成员来模仿foreach循环遍历集合中的项。 例如数组就是可枚举类型,所以下面的代码手动做foreach语句自动做的事情。输出和使用foreach循环的输出一样。 要创建非泛型接口的枚举数类,必须声明实现IEnumerator接口的类。 IEnumerator接口有如下的特性: 它是System.Collection命名空间的成员。 它包含三个方法Current、MoveNext和Reset。 非泛型枚举数类的框架 示例:实现一个列出颜色名数组的枚举类型 3、IEnumerable 接口 IEnumerable接口只有一个成员—GetEnumerator方法,它返回对象的枚举数。 使用IEnumerable 和IEnumerator 的示例 4、不实现接口的枚举数 使用IEnumerable和IEnumerator接口可以创建可枚举类型和枚举数,但是这种方法有几个缺点: 首先,由Current返回的对象是object类型的。对于值类型而言,在由Current返回之前必须装箱成object。在从Current获取之后,又必须再一次拆箱。如果需要操作大量的数据,会带来严重的性能问题。 非泛型接口方法的另外一个缺点是失去了类型安全。值被作为对象来枚举,所以可以是任何类型。这就消除了编译时的类型检测 解决方法: 对于枚举数类: 不要继承自IEnumerator。 像以前一样实现MoveNext。 像以前一样实现Current,把返回类型设置为和枚举的项一样。 不需要实现Reset
文档评论(0)