An Iterator returns values when repeatedly called—it maintains state between calls. The Yield keyword returns a value from an Iterator. Control then resumes next after the Yield.
In VB.NET, the Yield and Iterator keywords use code generation. Special classes are generated. In these classes, the state of Iterators are maintained.
The ComputePower
Function generates a series of numbers with an increasing exponent value. We pass, as arguments, 2 values—the base number and the highest exponent required.
ComputePower
we iterate through the exponents. We compute the running total and store it in the local variables.ComputePower
to Main
. When next called, we resume after Yield.Module Module1 Sub Main() ' Loop over first 10 exponents. For Each value As Integer In ComputePower(2, 10) Console.WriteLine(value) Next End Sub Public Iterator Function ComputePower( ByVal number As Integer, ByVal exponent As Integer) As IEnumerable(Of Integer) Dim exponentNum As Integer = 0 Dim numberResult As Integer = 1 ' Yield all numbers with exponents up to the argument value. While exponentNum < exponent numberResult *= number exponentNum += 1 Yield numberResult End While End Function End Module2 4 8 16 32 64 128 256 512 1024
For performance, a simple For
-loop or List
is a better choice. Generate values, place into an array, and return. This avoids much of the excess classes that an Iterator will require.
short
syntax, but a significant amount of code is generated.The Iterator and Yield features in VB.NET are advanced—complex code is generated. We often call Iterators within a For Each
loop. Values can be returned based on any logic.