IEnumerable и IEnumerator в одном классе, плохая идея? - PullRequest
5 голосов
/ 25 марта 2010

Это плохая идея?

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), доступное только для чтения, и он спасает меня от дополнительного класса, заключающего IEnumerator (Of T). Но так или иначе это только кажется неправильным. Есть ли лучший способ?

Ответы [ 3 ]

5 голосов
/ 25 марта 2010

Определенно плохая идея. В частности, это означает, что два вызова GetEnumerator будут возвращать ссылки на один и тот же объект - когда они должны возвращать независимых итераторов.

Теперь, сказав, что компилятор C # будет генерировать классы, которые реализуют оба типа, если вы используете блоки итераторов ... но он делает все возможное, чтобы убедиться, что все правильно. Я предлагаю вам не испытывать себя от этой боли:)

4 голосов
/ 25 марта 2010

Это плохая идея, потому что решение сломается, если кто-то попытается перечислить вашу коллекцию более одного раза одновременно.

Например: это каким-то образом сломается

For Each cur1 in yourObj 
  For Each cur2 in yourObj
    Console.WriteLine("{0} - {1}", cur1,cur2)
  Next
Next
1 голос
/ 25 марта 2010

С Реализация IEnumerable :

Предоставьте метод GetEnumerator (), который возвращает вложенную открытую структуру , называемую «Enumerator».

Кстати, этот веб-сайт поддерживается Брэдом Абрамсом - одним из авторов Руководства по проектированию рамок .

...