Bill McCarthy 质问到“迭代器是一种基础性缺陷吗?”

  • Jonathan Allen
  • 朱永光

2008 年 8 月 12 日

话题:.NET语言 & 开发架构

迭代器是.NET 编程模型的核心。只有很少的开发人员以索引数据的方式工作,很多人都喜欢使用 for-each 循环来完成大部分任务。但是这种固有地顺序访问方式,在我们大量开发多线程应用程序的时候还适合吗?

如果你考虑一下迭代器获取下一个元素的这一主要任务,然后研究一下它是如何工作,你就应该明白它的重要设计缺陷……这个操作不是原子性的。迭代器是 IEnumerator 或 IEnumerator(Of T) 的实现,IEnumerator 要求你首先调用 MoveNext 方法然后读取 Current 属性。如果你允许多线程使用同样的 IEnumerator,那么你将得到这样一个调用序列:MoveNext、MoveNext、Current、Current,这样将跳过一个条目而重复下一个条目。所以 IEnumerator 并没有很好地考虑多线程的情况。这是一个已知的设计限制,但是不仅如此,像 C# 这样实现自己迭代器的语言还为每个线程生成了不同的迭代器。那就是说,C# 不仅认可了这种限制,还加强了它。

.NET语言 & 开发架构