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

5
задан Jason S 25 March 2010 в 20:46
поделиться

3 ответа

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

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

For Each cur1 in yourObj 
  For Each cur2 in yourObj
    Console.WriteLine("{0} - {1}", cur1,cur2)
  Next
Next
4
ответ дан 13 December 2019 в 22:05
поделиться

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

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

5
ответ дан 13 December 2019 в 22:05
поделиться

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

Сделайте метод GetEnumerator(), который возвращает вложенную публичную структуру под названием "Enumerator".

Кстати, этот сайт поддерживает Брэд Абрамс - один из авторов Framework Design Guidelines.

1
ответ дан 13 December 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: