Поскольку я обычно использую VB.net в качестве предпочтительного языка, я еще не справился с yielding. Сейчас я прочитал, что yielding также был введен в VB.net, поэтому я попытался узнать об этом, и теперь у меня есть вопрос.
Скажем, у меня есть функция Iterator, которая использует yielding. Ради этого вопроса я создал эту довольно бесполезную функцию:
Public Iterator Function Test(ByVal gap As Integer) As IEnumerable(Of Integer)
Dim running As Integer
Do While running < (Integer.MaxValue - gap)
Yield running
running += gap
Loop
End Function
Если я правильно понял yielding, то код останавливается после yielding и продолжается только тогда, когда запрашивается следующий элемент.
Итак, в моем примере ... если для получения следующего значения переменной running потребуется 1 секунда, тогда мой код будет работать только 1 секунду, если мне нужно только первое число, и он будет работать 5 секунд, если мне нужно 5 чисел .
Пока все хорошо, но теперь я хочу перегрузить свою функцию:
Public Function Test() As IEnumerable(Of Integer)
Return Test(1)
End Function
Это больше не функция Iterator, так что я потерял то преимущество, что мне нужно ровно столько времени, сколько мне нужно чисел?





It's not an Iterator function anymore, so did I lose the advantage of only needing as much time as I need numbers?
Ты не. Функции итератора - это не волшебство, все, что они делают, - это удобный способ реализации интерфейса IEnumerable(Of T). Итак, чтобы получить преимущество создания только тех значений, которые вам требуются, все, что вам нужно, - это метод, возвращающий хорошую реализацию этого интерфейса. И это может быть любое из:
Test(ByVal gap As Integer).Test().IEnumerable(Of T) вручную.
Спасибо за разъяснение.