IEnumerable和IEnumerator在同一个类中,不好主意?

时间:2010-03-25 20:36:39

标签: c# ienumerable ienumerator

这是个坏主意吗?

Private Class GH_DataStructureEnumerator(Of Q As Types.IGH_Goo)
  Implements IEnumerable(Of Q)
  Implements IEnumerator(Of Q)
  ....
  ....
  'Current, MoveNext, Reset etc.'
  ....
  ....

  Public Function GetEnumerator_Generic() As IEnumerator(Of Q) _
                  Implements IEnumerable(Of Q).GetEnumerator
    Return Me
  End Function
End Class

此类仅作为IEnumerable(Of T)readonly属性可见,它为我节省了一个包装IEnumerator(Of T)的附加类。但不知何故,这似乎是错误的。还有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

绝对是个坏主意。特别是,这意味着对GetEnumerator的两次调用将返回对同一对象的引用 - 当它们应该返回独立的迭代器时。

现在已经说过了,如果使用迭代器块,C#编译器将生成实现这两种类型的类......但是它确实能够确保它正确。我建议你不要让自己忍受这种痛苦:)

答案 1 :(得分:4)

这是一个糟糕的主意,因为如果有人尝试同时枚举您的集合,解决方案将会中断。

例如:这会以某种方式破坏

For Each cur1 in yourObj 
  For Each cur2 in yourObj
    Console.WriteLine("{0} - {1}", cur1,cur2)
  Next
Next

答案 2 :(得分:1)

来自Implementing IEnumerable

  

提供GetEnumerator()方法,返回名为“Enumerator”的 嵌套公共结构

顺便说一下,这个网站由Brad Abrams维护 - 他是Framework Design Guidelines的作者之一。