欢迎来到天天文库
浏览记录
ID:52267774
大小:889.00 KB
页数:28页
时间:2020-04-03
《Net面向对象程序设计-19-枚举集合.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、.NET面向对象程序设计第19章枚举集合19.1枚举集合中的元素foreach语句极大的简化了需要编写的代码int[]pins={9,3,7,2};foreach(intpininpins){Console.WriteLine(pin);}为什么数组可以这么做呢?数组可以按需提供一个叫做枚举器的对象,枚举器可以依次返回请求的数组的元素枚举器指导项的次序并且跟踪它在序列中的位置,然后返回请求的当前项对于枚举器的类型而言,必须有一个方法来获取它们在.net中获取一个对象枚举器的标准方法是调用对象的GetEnumerator
2、方法凡是实现了GetEnumerator方法的类型叫做可枚举类型enumerable可枚举的集合:实现了System.Collections.IEnumerable接口的一个集合C#中所有数组都是System.Array类的实例该类是实现了IEnumerable接口的一个集合类在IEnumerable接口中,包含一个名为GetEnumerator的方法:IEnumeratorGetEnumerator();GetEnumerator方法返回一个枚举器对象,该枚举器实现了System.Collections.IEnume
3、rable接口枚举器对象用于遍历集合中的元素IEnumerator接口指定了以下方法和属性:objectCurrent{get;}boolMoveNext();voidReset();foreach结构被设计用来和可枚举类型一起使用,只要给他的遍历对象是可枚举类型,比如数组,它会执行以下操作:通过调用GetEnumerator方法获取对象的枚举器从枚举器中请求每一项并且把它作为迭代变量枚举器类型枚举器一共有三种,工作原理相同,但有一些细小的区别IEnumerator/IEnumerable接口—非泛型接口形式IEnum
4、erator/IEnumerable接口—泛型接口形式不使用接口形式2、使用IEnumerator接口IEnumerator接口包含三个函数成员:Current、MoveNext以及Reset。Current返回序列中当前位置项的属性。它是只读属性。它返回object类型的引用,所以可以返回任何类型。MoveNext是把枚举数位置前进到集合中下一项的方法。它也返回布尔值,指示新的位置是有效位置或已经超过了序列的尾部。如果新的位置是有效的,方法返回true。如果新的位置是无效的(比如到达了尾部),方法返回fa
5、lse枚举数的原始位置在序列中的第一项之前。MoveNext必须在第一次使用Current之前使用,否则CLR会抛出一个InvalidOperationException异常。Reset方法把位置重置为原始状态。枚举数类通常被声明为类中的嵌套类枚举数与序列中的当前项保持联系的方式完全取决于实现。可以通过对象引用、索引值或其他方式来实现。对于数组来说,就使用项的索引。有了集合的枚举数,我们就可以使用MoveNext和Current成员来模仿foreach循环遍历集合中的项。例如数组就是可枚举类型,所以下面的代码手动做fo
6、reach语句自动做的事情。输出和使用foreach循环的输出一样。要创建非泛型接口的枚举数类,必须声明实现IEnumerator接口的类。IEnumerator接口有如下的特性:它是System.Collection命名空间的成员。它包含三个方法Current、MoveNext和Reset。非泛型枚举数类的框架示例:实现一个列出颜色名数组的枚举类型3、IEnumerable接口IEnumerable接口只有一个成员—GetEnumerator方法,它返回对象的枚举数。使用IEnumerable和IEnumerator
7、的示例4、不实现接口的枚举数使用IEnumerable和IEnumerator接口可以创建可枚举类型和枚举数,但是这种方法有几个缺点:首先,由Current返回的对象是object类型的。对于值类型而言,在由Current返回之前必须装箱成object。在从Current获取之后,又必须再一次拆箱。如果需要操作大量的数据,会带来严重的性能问题。非泛型接口方法的另外一个缺点是失去了类型安全。值被作为对象来枚举,所以可以是任何类型。这就消除了编译时的类型检测解决方法:对于枚举数类:不要继承自IEnumerator。像以前一
8、样实现MoveNext。像以前一样实现Current,把返回类型设置为和枚举的项一样。不需要实现Reset。对于可枚举类:不要继承自IEnumerable。像以前一样实现GetEnumerator,设置返回值为枚举数类。比较基于接口的和非基于接口的枚举数5、泛型枚举接口第三种形式的枚举数是使用泛型接口IEnumerable和
此文档下载收益归作者所有