簡體   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