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