关闭

关于foreach的一些体会

754人阅读 评论(0) 收藏 举报

使用foreach的约束
   ①使用 foreach , 必须在被 foreach in对象类 中实现
    GetEnumerator 方法(继承IEnumerable) 。
   ②foreach 语句是对枚举数的包装,它只允许从集合中读取,不允许写入集合。
   ③foreach 内部,不允许更改 foreach in对象 中的集合。

 

问题  

  ArrayList arr = new ArrayList();
   arr.Add("123");
   arr.Add("456");
   arr.Add("789");

   foreach (string str in arr)
   {
       arr.Remove("789");
       Console.WriteLine(str);
   }

 以上代码当便利ArrayList中的第二个对象时,会引发InvalidOperationException异常。

 

分析
   当使用 foreach 时,首先调用被遍历对象的 GetEnumerator 方法,返回一个Enumerator ,
   然后 foreach 将对这个返回的枚举数进行遍历。
   个人感觉 foreach 实际做的操作就是:
  IEnumerator enumArr = arr.GetEnumerator();
   while (enumArr.MoveNext())
   {
       set.Remove("789");
       System.Console.WriteLine(enumArr.Current);
   }
   而MSDN上有如下说明:
   ”只要集合保持不变,枚举数就将保持有效。
    如果对集合进行了更改(例如添加、修改或删除元素),
    则该枚举数将失效且不可恢复,并且下一次对 MoveNext 或 Reset 的调用将引发
    InvalidOperationException。”
   所以发生了上面问题中的代码发生了异常。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16467次
    • 积分:248
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论