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:

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.

Lihat juga