Действительно ли это - плохая идея?
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). Но так или иначе это просто кажется неправильным. Существует ли лучший путь?
Это плохая идея, потому что решение выйдет из строя, если кто-то попытается перечислить вашу коллекцию больше чем один раз одновременно.
Например: Это каким-то образом сломается
For Each cur1 in yourObj
For Each cur2 in yourObj
Console.WriteLine("{0} - {1}", cur1,cur2)
Next
Next
Определенно плохая идея. В частности, это означает, что два вызова GetEnumerator
вернут ссылки на один и тот же объект - тогда как они должны вернуть независимых итераторов.
Сказав это, компилятор C # сгенерирует классы, которые реализуют оба типа, если вы используете блоки итератора ... но он делает все возможное, чтобы убедиться, что все правильно. Я предлагаю вам не подвергать себя этой боли :)
Сделайте метод GetEnumerator(), который возвращает вложенную публичную структуру под названием "Enumerator".
Кстати, этот сайт поддерживает Брэд Абрамс - один из авторов Framework Design Guidelines.