FOREACH的遍历
在使用FOREACH对集合进行遍历的时候,要求被遍历的对象必须实现了IENUMABLE接口,而该接口的唯一成员方法GETENUMATOR返回实现了IENUMATOR接口的实例对象。
检测IENUMATOR,发现有3个成员,分别是:CURRENT、MOVENEXT、RESET,CURRENT返回当前的成员对象;MOVENEXT把指针向下移动一个位置,如果存在实例成员则返回true,否则返回false,是FOREACH判断循环结束的条件;RESET则重置循环指针。
通过以上分析,想当然的在定义实现了IENUMABLE接口的类时一起实现IENUMATOR接口,也没有发现问题。直到一天需要对自定义的集合连续进行两次FOREACH的时候,发现第一次OK,第二次出现了问题,郁闷呀。调试很久都解决不了问题。
多方面测试、跟踪后,发现FOREACH并不会调用RESET这个重置方法,从而当第二个FOREACH执行的时候,成员指针已经指到最后面,MOVENEXT永远返回false,而之前想当然的认为在调用FOREACH的时候,要么开始执行RESET,要么最后执行RESET,结果不然。
反编译MS对集合类定义的代码,发现,类在实现IENUMABLE的方法GETENUMATOR的时候,是全新的创建了一个实现了IENUMATOR接口内部类实例,所以不会出现连续FOREACH时数据不正常的情况。
MS为什么采用这样的方案实现IENUMATOR呢?想想也是自己蠢呀,如果一个实例集合在多线程中被同时FOREACH,那指针还不混乱?这个实现方案是MS保证集合类实例在多线程环境安全的至要保证。
转载于:https://www.cnblogs.com/Daview/archive/2006/09/15/505317.html
FOREACH的遍历相关推荐
- Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与Lin
1.容器API的类图结构如下: JAVA的集合类是一种特别有用的工具类,它可以用于存储数量不等的多个对象,并可以实现常用数据结构,如栈,队列等,除此之外,JAVA集合还可用于保存具有映射关系的关联数组 ...
- 1.12 foreach循环遍历Collection集合
Java使用foreach循环遍历Collection集合 使用 Iterator 接口迭代访问 Collection 集合里的元素,除了这个方法之外,我们还可以使用 Java 5 提供的 forea ...
- 二维数组foreach嵌套遍历,判断连续3天以上的算有效数据
2019独角兽企业重金招聘Python工程师标准>>> $studycourseinfo = $studycourseinfoModel->where($where)-> ...
- 使用foreach循环遍历集合元素
使用foreach循环遍历集合元素 Java5.0 提供了foreach循环迭代访问Collection和数组 遍历操作不需要获取Collection或数组的长度,无需使用索引访问元素 遍历集合的底层 ...
- jsp数据 foreach 循环遍历 (含效果图)- 代码篇
jsp数据 foreach 循环遍历 (含效果图)- 代码篇 效果图: 重要代码 · 示下: <c:forEach items="${governorlist}" var=& ...
- java利用循环打印AVA_ava.util.ArrayList在foreach循环遍历时可以删除元素
ArrayList是java开发时非常常用的类,常碰到需要对ArrayList循环删除元素的情况.这时候大家都不会使用foreach循环的方式来遍历List,因为它会抛java.util.Concur ...
- 使用foreach标签遍历数组
foreach标签用于实现对数组与集合类型的输入参数的遍历 collection属性表示要遍历的集合类型 separator属性表示间隔符 open属性表示起始 close属性表示结束 item属性值 ...
- foreach循环遍历的原理解析
先编写一个foreach循环遍历的测试方法 运行 public class MyTest {public static void main(String[] args) {List<String ...
- foreach循环遍历数组方法vue介绍
在vue中用foreach循环遍历数组全部元素,利用回调函数对数组进行操作,自动遍历整个数组,且无法break中途跳出循环,不可控,不支持return操作输出,return只用于控制循环是否跳出当前循 ...
- C#通过foreach语句遍历arraylist源码演示
如下的代码是关于C#通过foreach语句遍历arraylist演示的代码. using System; using System.Collections;namespace Client.Chapt ...
最新文章
- android 背景切换动画效果代码,关于Android shape gradient背景渐变
- 剩余 大小 查看内存_计算机内存管理介绍
- 一次利用位图索引进行SQL优化的案例
- python meataclass详解
- ios微信本地视频上传到服务器,ios本地视频wx.uploadFile上传
- 使用 IAsyncResult 进行 .NET 异步编程
- python测验3_基于Python3的漏洞检测工具
- 完美摄影作品展,它可以是你作品的风格
- 文件服务器 重复文件,ftp服务器校验重复文件
- Ubuntu: No space left on device,无法创建新文件夹,无法创建新文件,无法存储文件
- JavaWeb 利用jsp 实现分页查询
- FineUI 后台Grid中 某列添加背景色 AspCore MVC
- abaqus2018+intel fortran2019+vs2015安装全记录
- 关于idea链接oracle数据库出现[08006][17002] IO 错误: Got minus one from a read call, connect lapse 1 ms., Authen
- Netd 中 NetworkManager 分析
- 九爷带你了解 zabbix 飞信以及机器人报警
- 格式工厂怎么将qlv转换成mp4 转换方法最新
- CSS预处理器——Sass、LESS和Stylus区别及联系
- FreeRTOS中的堆栈计算
- 【附源码】计算机毕业设计java志愿者招募系统设计与实现