第20章C sharp.ppt

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第20章C sharp

C#语言程序设计 徐虹 xh27@163.com 第二十章 枚举数和迭代器 20.1 枚举数和可枚举数 ●当我们为数组使用foreach语句时,可以依次取出数组中的每一个元素,允许我们读取它的值。 ●示例代码Page_331。 ●为什么数组可以这么做?原因是数组可以按需提供一个叫做枚举数的对象。枚举数可以一次返回请求的数组的元素。枚举数知道项的次序并且跟踪它在序列中的位置,然后返回请求的当前项。 20.1 枚举数和可枚举数 ●对于有枚举数的类型而言,必须有一个方法来获取它们。在.net中获取一个对象枚举数的标准方法是调用对象的GetEnumerator方法。实现该方法的类型叫可枚举类型。数组是可枚举类型。 ●图20-1演示了可枚举类型和枚举数之间的关系。 20.1 枚举数和可枚举数 ●foreach结构被设计用来和可枚举类型一起使用,只要给它遍历的对象是可枚举类型,它就会执行如下行为: 通过调用GetEnumerator方法获取对象的枚举数。 从枚举数中请求每一项并且把它作为迭代变量,代码可以读但不可以改变。 20.1.2 枚举数类型 枚举数一共有三种,它们工作原理一样: IEnumerator/Ienumerable接口——叫做非泛型接口形式。 IEnumerator<T>/Ienumerable<T>接口——叫做泛型接口形式。 不使用接口形式。 20.2 使用IEnumerator接口 IEnumerator接口包含三个函数成员: Current返回序列中当前位置项的属性。 它是只读属性。 它返回object类型的引用,可以返回任何类型。 MoveNext把枚举数位置前进到集合中下一项。它返回布尔值,指示新的位置是有效位置或已经超过了序列的尾部。 如果新位置是有效的,返回true。 如果新位置是无效的,返回false。 枚举数的原始位置在序列中的第一项之前。MoveNext必须在第一次使用Current之前使用,否则会抛出异常。 Reset方法把位置重置为原始状态。 20.2 使用IEnumerator接口 图20-2显示了一个ArrEumerator类的实例的枚举数。 20.2 使用IEnumerator接口 图20-3演示了三个项的集合的枚举数的状态。这些状态标记了1到5。 20.2 使用IEnumerator接口 有了集合的枚举数,我们就可以使用MoveNext和Current成员来模仿foreach循环遍历集合中的项。(示例代码Page_334) 声明IEnumerator的枚举数 要创建非泛型接口的枚举数类,我们必须声明实现IEnumerator接口的类该接口有如下特性: 它是System.Collection 命名空间的成员。 它包含三个方法Current、MoveNext和Reset。 20.3 IEnumerable接口 IEnumerable接口只有一个成员GetEnumerator方法,它返回对象的枚举数。 图20-4演示了一个有三个枚举项的类MyClass。 20.3 IEnumerable接口 下面代码演示了可枚举类的声明形式。 结合使用IEnumerable和IEnumerator的示例见Page_337。 20.4 不实现接口的枚举数 使用IEnumerator和IEnumerable接口来创建可枚举类型和枚举数,有几个缺点: 由Current返回的对象是object类型的。对于值类型而言,在又Current返回之前必须装箱成object。在从Current获取之后,又必须再一次拆箱。如果需要操作大量的数据,会带来严重的性能问题。 失去了类型安全。值被作为对象来枚举,所以可以是任何类型,这就消除了编译时的类型检测。 20.4 不实现接口的枚举数 我们可以通过对枚举数和可枚举类型类的声明做如下改变来解决这个问题: 对于枚举数类: 不继承自IEnumerator。 实现MoveNext。 实现Current,返回类型设置为和枚举的项一样。 不需要实现Reset。 对于可枚举类: 不要继承自IEnumerable。 实现GetEnumerator,设置返回值为枚举数类。 20.4 不实现接口的枚举数 图20-5现了非泛型接口代码和非接口代码的区别: 20.4 不实现接口的枚举数 对于非接口的枚举数的实现来说,一个可能的问题就是其他程序集的类型可能希望使用接口方法来实现枚举。如果这些类型尝试使用接口转换来获取类对象的枚举,可能就会找不到。 要解决这个问题,我们可在类级别创建Current、MoveNext和GetEnumerator的实现,并且也为它们创建显式接口实现。有了这两

您可能关注的文档

文档评论(0)

xy88118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档