0

0

C# 2.0 Specification(迭代器)(一)

黄舟

黄舟

发布时间:2017-01-03 12:00:25

|

1487人浏览过

|

来源于php中文网

原创

22迭代器

22.1迭代器块

迭代器块就是产生值的有序序列的语句块。迭代器块通过一个或多个yield语句区别于常规语句块。
l yield return 语句产生迭代的下一个值。
l yield break 语句指明迭代完成。
迭代器块可以被用作一个方法体(method-body)、运算符体(operator-body)、访问器体(accessor-body),前提是对应函数成员的返回类型是枚举器(enumerator)接口之一或者可枚举(enumerable)接口之一。
迭代器块在c#语法中不什么独特的元素。它们在几个方面受到限制,并且主要的作用在函数成员声明的语义上,但它们在语法上只是语句块而已。
当一个函数成员使用迭代器块实现时,对于正式参数列表指定任何ref或out参数将导致编译时错误。
return语句出现在迭代器块中将导致编译时错误(但yield return语句是允许的)。
在迭代器块中包含不安全上下文(§18.1)将导致编译时错误。即使是当迭代器声明内嵌在不安全上下文中,迭代器块也总是定义为一个安全上下文。

22.1.1枚举器接口

枚举器接口(enumerator interface)[/b]是System.Collections.IEnumerator接口以及System.Collections.Generic.IEnumerator的所有实例。在本章,这些接口将相应地作为IEnumerator和IEnumerator而引用。

22.1.2可枚举接口

可枚举接口(enumerable interface[/b])[/b]是System.Collections.IEnumerable接口和System.Collections.Generic.IEnumerable的所有实例。在本章,这些接口将相应地作为IEnumerable和IEnumerable而被引用。

22.1.3Yield 类型

迭代器块生成具有相同类型的所有值的序列。给类型被称为迭代器块的yield[/b]类型(yield type[/b])[/b]。
l 迭代器块的yield类型通常用于实现返回IEnumerator或IEnumerable是对象的函数成员。
l 迭代器块的yield类型通常用于实现返回IEnumerator或IEnumerable是T的函数成员。

22.1.4 this 访问

在类的实例成员的迭代器块内,this表达式被归类为值。该值的类型就是类类型,在这个类型可以采用这种用法,这个值就是成员被调用时的对象的引用。
在结构的实例成员的迭代器块内,this表达时被归类作为一个变量。该变量的类型就是结构类型,在这个结构中它可以采用这种用法。该变量表示一个成员被调用时的对应结构的一个拷贝。在结构实例成员的迭代器块内,this变量的行为就好像是结构类型的一个值参数。

22.2枚举对象

当返回枚举器接口类型的函数成员使用迭代器块实现时,调用函数成员并不会立即执行迭代器块中的代码。相反,枚举器对象(enumerator object)将被创建和返回。该对象封装了在迭代器块中指定的代码,当枚举器对象的MoveNext方法被调用时,迭代器块中的代码就会执行。枚举器对象有如下的特征。
l 它实现了IEnumerator和IEnumerator,T是迭代器块的yield类型(产生类型)。
l 它实现了System.IDisposable。



l 它被使用实参值(如果有的话)的拷贝而初始化,而实例值将被传递给函数成员。
l 它有四个潜在的状态before、running、suspended和after,并且它在before状态之前被初始化。

枚举器对象通常是一个编译器生成的枚举器类实例,它封装了迭代器语句块中的代码,并且实现了枚举器接口,但其它实现方法也是可以的。如果一个枚举器类是由编译器生成的,这个类将会是内嵌的,在包含函数成员的类中,类将具有私有可访问性,并且该类具有一个保留为编译器所用的名字(§2.4.2)。
枚举器对象可以实现比在此指定的更多接口。
随后几节描述了由IEnumerable和IEnumerable接口实现的MoveNext、Current、和Dispose成员的确切行为,这两个接口由枚举对象提供。
请注意,枚举器对象并不支持IEnumerator.Reset方法。调用该方法将会抛出System.NotSupportedException异常。

22.2.1MoveNext方法

枚举器对象的MoveNext方法封装了迭代器块的代码。调用MoveNext方法将执行迭代器内的代码,并将枚举对象的Current属性设置为合适的值。由MoveNext方法执行的精确动作,取决于当MoveNext方法被调用时枚举器对象的状态。
l 如果枚举器对象状态是before,调用MoveNext
n 将把状态改为running。
n 将把迭代器块的参数(包括this)初始化为,当枚举器对象被初始化而保存的实参值和实例值。
n 从开始执行迭代器块直到执行被中断(如下面所描述的)。
l 如果枚举器对象的状态是running,调用MoveNext的结果是未指定的。
l 如果枚举器对象的状态是suspended,调用MoveNext
n 将把状态改为running。


l 恢复所有局部变量和参数(包括this)的值为迭代器最后一次挂起(suspended)时执行状态的值。请注意,由这些变量所引用的任何对象的内容,都可能因为前一次对MoveNext的调用而改变。
n 在引发执行挂起的yield return 语句之后重新开始执行迭代器块,并且这个状态会继续直到执行被中断(如下所描述)。
l 如果枚举器对象的状态是after,那么调用MoveNext将返回false。
当MoveNext执行迭代器块时,有四种方法可以中断执行:通过一个yield return 语句,通过一个yield break语句,到达迭代器块的结束点,以及一个异常被抛出,并被传播到迭代器块之外。
l 当遇到一个yield return 语句时(§22.4),将会发生如下情况
n 在该语句中被给定的表达式将被计算,隐式地转换到产生类型(yield type),并被赋值给枚举对象的Current属性。
n 迭代器体的执行将被挂起。所有局部变量的值和参数(包括this)被保存,该yield return 语句的位置也被保存。如果yield return 语句在一个或多个try块之内,与之关联的finally块在此时将不会执行。
n 枚举器对象的状态被改为suspended。
n MoveNext方法对调用方返回true,表明迭代器成功前进到下一个值。
l 当遇到yield break 语句时,将会发生如下情况
n 如果yield break 语句在一个或多个try块之内,与之关联的finally语句将被执行。
n 枚举器对象的状态被改为after。
n MoveNext方法对调用方返回false,表明迭代已经完成。
l 当遇到迭代器块的结束点时,将会发生如下情况。
n 枚举器对象的状态被改为after。
n MoveNext方法对调用方返回false,表明迭代已经完成。


l 当一个异常被抛出并被传播到迭代器块之外时,将会发生如下情况。
n 在迭代器块之内将会由于异常传播(exception propagation)而执行合适的finally块。
n 枚举器对象的状态被改为after。
n 对于MoveNext方法的调用方来说,异常传播将会继续。

华锐行业电子商务系统
华锐行业电子商务系统

华锐行业电子商务系统2.0采用微软最新的.net3.5(c#)+mssql架构,代码进行全面重整及优化,清除冗余及垃圾代码,运行速度更快、郊率更高。全站生成静态、会员二级域名、竞价排名、企业会员有多套模板可供选择;在界面方面采用DIV+CSS进行设计,实现程序和界面分离,方便修改适合自己的个性界面,在用户体验方面,大量使用ajax技术,更加易用。程序特点:一、采用微软最新.net3.5+MSSQL

下载

22.2.2 Current属性

枚举器对象的Current属性受到迭代器块的yield return 语句的影响。
当枚举器对象处于suspended状态时,Current的值就是最后一次调用MoveNext时被设置的值。当枚举器对象处于before、running或after状态时,访问Current的所得结果是未指定的。
对于一个具有非object类型的yield 类型迭代器块,通过枚举器对象的IEnumerable实现访问Current所得实现,对应于通过枚举器对象的IEnumerator访问Current所得实现,并将结果转换到object类型。

22.2.3 Dispose方法

Dispose方法通过将枚举器对象的状态置为after,以清理迭代结果。
l 如果枚举器对象的状态是before,调用Dispose将改变其状态为after。
l 如果枚举器对象的状态是running,调用Dispose的结果是为指定的。
l 如果枚举器对象的状态是suspended,调用Dispose将
n 改变其状态为running。
n 执行finally块,就好像最后执行的yield return语句是一个yield break语句。如果这里引发一个异常被抛出并传播到迭代器体之外,枚举器对象的状态将被置为after,并且该异常将被传播给Dispose方法的调用方。
n 改变其状态为after。
l 如果枚举器对象的状态为after,调用Dispose没有效果。

22.3可枚举对象

当返回一个可枚举接口类型的函数成员使用迭代器块实现时,调用函数成员不会立即执行迭代器块代码。相反,一个可枚举对象([/b]enumerable object[/b])[/b]将被创建并返回。可枚举对象的GetEnumerator方法返回一个枚举器对象,它封装了在迭代器块中指定的代码,当枚举器对象的MoveNext方法被调用时,将触发迭代器块代码的执行。可枚举对象具有如下特征。
l 它实现了IEnumerable和IEnumerable接口,这里T是迭代器块的产生类型(yield type)。
l 它使用实参值的拷贝进行初始化(如果有的话),并将实例值传递给函数成员。

可枚对象通常是一个由编译器生成的可枚举类的实例,该类封装了迭代器块的代码,并实现了可枚举接口,但其他实现方法也是可以的。如果可枚举类由编译器生成,该类将内嵌在包含函数成员的类中,并具有私有可访问性,以及一个为编译器所保留使用的名字(§2.4.2)。
可枚对象可以实现比在此说明的更多接口。特别的是,可枚举对象也可以实现IEnumerator和IEnumerator接口,这使得它既可以作为一个可枚举对象又可作为枚举器对象。在那个实现类型中,对可枚举对象的GetEnumerator方法的首次调用,将返回可枚举对象自身。对于该可枚举对象的GetEnumerator方法的后续调用,如果有的话,将会返回可枚举对象的一个拷贝。因此,每次返回的枚举器将有它自己的状态,并且在一个枚举器中所作的改变不会影响另一个枚举器。

22.3.1 GetEnumerator方法

可枚举对象提供了IEnumerable和IEnumerable接口的GetEnumerator方法的一个实现。这两个GetEnumerator方法共享一个公共实现,它是用来得到并返回一个有效的枚举器对象。
枚举器对象使用实参值进行初始化,当可枚举对象被初始化时其实例值将被保存,另一方面,枚举器对象函数将如§22.2所描述。
(To be continued)

以上就是C# 2.0 Specification(迭代器)(一)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

2

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

2

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

0

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

0

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.29

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

25

2026.01.29

clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址
clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址

clawdbot龙虾机器人官网入口:https://clawd.bot/,clawdbot ai是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

16

2026.01.29

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

8

2026.01.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

622

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.9万人学习

C 教程
C 教程

共75课时 | 4.3万人学习

C++教程
C++教程

共115课时 | 14.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号