繁体   English   中英

防止在枚举时修改集合

[英]Prevent collection from being modified while enumerating

如何防止枚举期间修改Collection。

这是类源代码。

 public class cars : IEnumerator,IEnumerable
 {
  private car[] carlist;
  int position = -1;

  public IEnumerator GetEnumerator()
  { return (IEnumerator)this; }

  public bool MoveNext()
  {
     position++;
     return (position < carlist.Length);
  }

  public void Reset()
  {position = 0;}

  //IEnumerable
  public object Current
  { get { return carlist[position];}
  }
 }      

首先,您的集合类不应实现IEnumerator ,而应仅实现IEnumerable并在调用GetEnumerator()时返回另一个实现IEnumerator类的实例(可能是carEnumerator )。

IEnumerator (在carEnumerator实现)扩展了IDisposable因此,在cars.GetEnumerator() ,您可以将私有标志(也许private bool isEnumerating )设置为true。 carEnumerator ,保留对集合(汽车)的引用,在carEnumerator.Dispose() ,将isEnumerating设置为false。

最后,在枚举进行过程中要禁用的汽车的所有方法中,检查isEnumerating的状态并引发异常,如果为true, isEnumerating执行任何操作。

至少某些BCL集合通过包含版本计数器来完成此操作。 集合的每次修改都会使计数器递增。 当开始进行集合的枚举时,将保留版本计数的当前值。 在每次调用枚举器的MoveNext将根据保留的计数器检查基础集合的版本,如果不同,则会引发异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM