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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值