在使用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的遍历相关推荐

  1. Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与Lin

    1.容器API的类图结构如下: JAVA的集合类是一种特别有用的工具类,它可以用于存储数量不等的多个对象,并可以实现常用数据结构,如栈,队列等,除此之外,JAVA集合还可用于保存具有映射关系的关联数组 ...

  2. 1.12 foreach循环遍历Collection集合

    Java使用foreach循环遍历Collection集合 使用 Iterator 接口迭代访问 Collection 集合里的元素,除了这个方法之外,我们还可以使用 Java 5 提供的 forea ...

  3. 二维数组foreach嵌套遍历,判断连续3天以上的算有效数据

    2019独角兽企业重金招聘Python工程师标准>>> $studycourseinfo = $studycourseinfoModel->where($where)-> ...

  4. 使用foreach循环遍历集合元素

    使用foreach循环遍历集合元素 Java5.0 提供了foreach循环迭代访问Collection和数组 遍历操作不需要获取Collection或数组的长度,无需使用索引访问元素 遍历集合的底层 ...

  5. jsp数据 foreach 循环遍历 (含效果图)- 代码篇

    jsp数据 foreach 循环遍历 (含效果图)- 代码篇 效果图: 重要代码 · 示下: <c:forEach items="${governorlist}" var=& ...

  6. java利用循环打印AVA_ava.util.ArrayList在foreach循环遍历时可以删除元素

    ArrayList是java开发时非常常用的类,常碰到需要对ArrayList循环删除元素的情况.这时候大家都不会使用foreach循环的方式来遍历List,因为它会抛java.util.Concur ...

  7. 使用foreach标签遍历数组

    foreach标签用于实现对数组与集合类型的输入参数的遍历 collection属性表示要遍历的集合类型 separator属性表示间隔符 open属性表示起始 close属性表示结束 item属性值 ...

  8. foreach循环遍历的原理解析

    先编写一个foreach循环遍历的测试方法 运行 public class MyTest {public static void main(String[] args) {List<String ...

  9. foreach循环遍历数组方法vue介绍

    在vue中用foreach循环遍历数组全部元素,利用回调函数对数组进行操作,自动遍历整个数组,且无法break中途跳出循环,不可控,不支持return操作输出,return只用于控制循环是否跳出当前循 ...

  10. C#通过foreach语句遍历arraylist源码演示

    如下的代码是关于C#通过foreach语句遍历arraylist演示的代码. using System; using System.Collections;namespace Client.Chapt ...

最新文章

  1. android 背景切换动画效果代码,关于Android shape gradient背景渐变
  2. 剩余 大小 查看内存_计算机内存管理介绍
  3. 一次利用位图索引进行SQL优化的案例
  4. python meataclass详解
  5. ios微信本地视频上传到服务器,ios本地视频wx.uploadFile上传
  6. 使用 IAsyncResult 进行 .NET 异步编程
  7. python测验3_基于Python3的漏洞检测工具
  8. 完美摄影作品展,它可以是你作品的风格
  9. 文件服务器 重复文件,ftp服务器校验重复文件
  10. Ubuntu: No space left on device,无法创建新文件夹,无法创建新文件,无法存储文件
  11. JavaWeb 利用jsp 实现分页查询
  12. FineUI 后台Grid中 某列添加背景色 AspCore MVC
  13. abaqus2018+intel fortran2019+vs2015安装全记录
  14. 关于idea链接oracle数据库出现[08006][17002] IO 错误: Got minus one from a read call, connect lapse 1 ms., Authen
  15. Netd 中 NetworkManager 分析
  16. 九爷带你了解 zabbix 飞信以及机器人报警
  17. 格式工厂怎么将qlv转换成mp4 转换方法最新
  18. CSS预处理器——Sass、LESS和Stylus区别及联系
  19. FreeRTOS中的堆栈计算
  20. 【附源码】计算机毕业设计java志愿者招募系统设计与实现

热门文章

  1. Linux--Linux下安装JDk
  2. Gym - 100623J Just Too Lucky (数位dp)
  3. 3.struts2中Action的三种写法
  4. 20145212 罗天晨 Web安全基础实践
  5. SQL2000和SQL2005同时安装问题(转载)
  6. java属性和普通方法
  7. mysql关键字了解
  8. emmet工具使用和技巧
  9. Docker概念学习系列之详谈Docker 的核心组件与概念(5)
  10. Spark Streaming实例