Pernyataan Yield (Visual Basic)
Mengirim elemen koleksi berikutnya ke pernyataan For Each...Next
.
Sintaks
Yield expression
Parameter
Term | Definisi |
---|---|
expression |
Harus diisi. Ekspresi yang secara implisit dapat dikonversi ke jenis fungsi iterator atau pengakses Get yang berisi pernyataan Yield . |
Keterangan
Pernyataan Yield
mengembalikan satu elemen koleksi pada satu waktu. Pernyataan Yield
ini disertakan dalam fungsi iterator atau pengakses Get
, yang melakukan iterasi kustom atas koleksi.
Anda menggunakan fungsi iterator dengan menggunakan For Each...Next Statement atau kueri LINQ. Setiap iterasi perulangan For Each
memanggil iterator. Ketika pernyataan Yield
tercapai di iterator fungsi, expression
akan kembali, dan lokasi saat ini dalam kode akan dipertahankan. Eksekusi dimulai ulang dari lokasi tersebut pada saat berikutnya ketika fungsi iterator tersebut dipanggil.
Konversi implisit harus ada dari jenis expression
dalam pernyataan Yield
ke jenis pengembalian iterator.
Anda dapat menggunakan pernyataan Exit Function
atau Return
untuk mengakhiri iterasi.
"Yield" bukan kata yang disyaratkan dan memiliki arti khusus hanya ketika digunakan dalam fungsi Iterator
atau pengakses Get
.
Untuk informasi lebih lanjut tentang fungsi iterator dan pengakses Get
, lihat Iterator.
Fungsi Iterator dan Dapatkan Pengakses
Deklarasi fungsi iterator atau pengakses Get
harus memenuhi persyaratan berikut:
Ini harus mencakup pengubah Iterator.
Jenis pengembalian harus IEnumerable, IEnumerable<T>, IEnumerator, atau IEnumerator<T>.
Ini tidak dapat memiliki parameter
ByRef
apa pun.
Fungsi iterator tidak dapat terjadi dalam suatu peristiwa, konstruktor instans, konstruktor statis, atau destruktor statis.
Fungsi iterator dapat menjadi fungsi anonim. Untuk informasi selengkapnya, lihat Iterator.
Penanganan Pengecualian
Pernyataan Yield
dapat berada di dalam blok Try
dari Try...Catch...Finally Statement. Blok Try
yang berisi pernyataan Yield
dapat memiliki blok Catch
, dan dapat memiliki blok Finally
.
Pernyataan Yield
tidak boleh berada di dalam blok Catch
atau blok Finally
.
Jika isi For Each
(di luar fungsi iterator) memunculkan pengecualian, blok Catch
dalam fungsi iterator tidak dijalankan, tetapi blok Finally
dalam fungsi iterator dijalankan. Blok Catch
di dalam fungsi iterator hanya menangkap pengecualian yang terjadi di dalam fungsi iterator.
Implementasi teknis
Kode berikut mengembalikan IEnumerable (Of String)
dari fungsi iterator, lalu melakukan iterasi melalui elemen IEnumerable (Of String)
.
Dim elements As IEnumerable(Of String) = MyIteratorFunction()
…
For Each element As String In elements
Next
Panggilan ke MyIteratorFunction
tidak menjalankan isi fungsi. Sebaliknya, panggilan mengembalikan IEnumerable(Of String)
ke dalam variabel elements
.
Pada iterasi perulangan For Each
, metode MoveNext dipanggil untuk elements
. Panggilan ini menjalankan isi MyIteratorFunction
hingga pernyataan Yield
berikutnya tercapai. Pernyataan Yield
mengembalikan ekspresi yang menentukan tidak hanya nilai variabel element
yang dikonsumsi oleh isi perulangan, tetapi juga properti elemen Current, yang merupakan IEnumerable (Of String)
.
Pada setiap iterasi berikutnya dari perulangan For Each
, eksekusi isi iterator berlanjut dari tempat terakhirnya, berhenti lagi saat mencapai pernyataan Yield
. Perulangan For Each
selesai ketika akhir fungsi iterator atau pernyataan Return
atau Exit Function
tercapai.
Contoh 1
Contoh berikut memiliki satu pernyataan Yield
yang ada di dalam perulangan For…Next. Setiap iterasi isi pernyataan For Each dalam Main
membuat panggilan ke fungsi iterator Power
. Setiap panggilan ke fungsi iterator berlanjut ke eksekusi pernyataan Yield
berikutnya, yang terjadi selama iterasi pengulangan For…Next
berikutnya.
Jenis pengembalian metode iterator adalah IEnumerable<T>, jenis antarmuka iterator. Ketika metode iterator dipanggil, metode ini mengembalikan objek enumerasi yang berisi kekuatan angka.
Sub Main()
For Each number In Power(2, 8)
Console.Write(number & " ")
Next
' Output: 2 4 8 16 32 64 128 256
Console.ReadKey()
End Sub
Private Iterator Function Power(
ByVal base As Integer, ByVal highExponent As Integer) _
As System.Collections.Generic.IEnumerable(Of Integer)
Dim result = 1
For counter = 1 To highExponent
result = result * base
Yield result
Next
End Function
Contoh 2
Contoh berikut menunjukkan aksesor Get
yang merupakan iterator. Deklarasi properti menyertakan pengubah Iterator
.
Sub Main()
Dim theGalaxies As New Galaxies
For Each theGalaxy In theGalaxies.NextGalaxy
With theGalaxy
Console.WriteLine(.Name & " " & .MegaLightYears)
End With
Next
Console.ReadKey()
End Sub
Public Class Galaxies
Public ReadOnly Iterator Property NextGalaxy _
As System.Collections.Generic.IEnumerable(Of Galaxy)
Get
Yield New Galaxy With {.Name = "Tadpole", .MegaLightYears = 400}
Yield New Galaxy With {.Name = "Pinwheel", .MegaLightYears = 25}
Yield New Galaxy With {.Name = "Milky Way", .MegaLightYears = 0}
Yield New Galaxy With {.Name = "Andromeda", .MegaLightYears = 3}
End Get
End Property
End Class
Public Class Galaxy
Public Property Name As String
Public Property MegaLightYears As Integer
End Class
Untuk contoh tambahan, lihat Iterator.