忽隐忽现欢迎您

许多事情,总是在经历以后才会懂

关于foreach的一些体会

使用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。”
   所以发生了上面问题中的代码发生了异常。

阅读更多
文章标签: string
个人分类: .Net足迹
上一篇使用MeasureString测量字符串
下一篇利用SharpZipLib实现压缩多个文件或整个目录
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭