[英]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.