Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Mengirim elemen kumpulan berikutnya ke For Each...Next pernyataan.
Sintaksis
Yield expression
Parameter-parameternya
| Istilah | Definisi |
|---|---|
expression |
Dibutuhkan. Ekspresi yang secara implisit dapat dikonversi ke jenis fungsi iterator atau Get aksesor yang berisi Yield pernyataan . |
Komentar
Pernyataan Yield mengembalikan satu elemen koleksi pada satu waktu. Pernyataan Yield ini disertakan dalam fungsi iterator atau Get aksesor, yang melakukan iterasi kustom melalui koleksi.
Anda menggunakan fungsi iterator dengan menggunakan Untuk Setiap... Pernyataan Berikutnya atau kueri LINQ. Setiap perulangan perulangan For Each memanggil fungsi iterator.
Yield Ketika pernyataan tercapai dalam fungsi iterator, expression dikembalikan, dan lokasi saat ini dalam kode dipertahankan. Eksekusi dimulai ulang dari lokasi tersebut saat berikutnya fungsi iterator dipanggil.
Konversi implisit harus ada dari jenis expression dalam Yield pernyataan ke jenis pengembalian iterator.
Anda dapat menggunakan Exit Function pernyataan atau Return untuk mengakhiri iterasi.
"Hasil" bukan kata yang dipesan dan memiliki arti khusus hanya ketika digunakan dalam Iterator fungsi atau Get aksesor.
Untuk informasi selengkapnya tentang fungsi dan Get aksesor iterator, lihat Iterator.
Fungsi Iterator dan Dapatkan Aksesor
Deklarasi fungsi atau Get aksesor iterator harus memenuhi persyaratan berikut:
Ini harus menyertakan pengubah Iterator .
Jenis pengembalian harus IEnumerable, , IEnumerable<T>IEnumerator, atau IEnumerator<T>.
Ini tidak dapat memiliki parameter apa pun
ByRef.
Fungsi iterator tidak dapat terjadi dalam 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 Try blok Coba... Menangkap... Pernyataan Terakhir.
Try Blok yang memiliki Yield pernyataan dapat memiliki Catch blok, dan dapat memiliki Finally blok.
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 dan kemudian 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 elements variabel .
Pada perulangan perulangan For Each , MoveNext metode dipanggil untuk elements. Panggilan ini menjalankan isi MyIteratorFunction hingga pernyataan berikutnya Yield tercapai. Pernyataan Yield mengembalikan ekspresi yang menentukan tidak hanya nilai element variabel untuk dikonsumsi oleh isi perulangan tetapi juga Current properti elemen, yang merupakan IEnumerable (Of String).
Pada setiap perulangan For Each perulangan berikutnya, eksekusi isi iterator berlanjut dari tempat yang ditinggalkannya, sekali lagi berhenti ketika mencapai Yield pernyataan. Perulangan For Each selesai ketika akhir fungsi iterator atau Return pernyataan atau Exit Function tercapai.
Contoh 1
Contoh berikut memiliki Yield pernyataan yang ada di dalam For... Perulangan berikutnya . Setiap iterasi isi pernyataan Untuk Setiap dalam Main membuat panggilan ke fungsi iterator Power . Setiap panggilan ke fungsi iterator melanjutkan ke eksekusi Yield pernyataan berikutnya, yang terjadi selama perulangan perulangan berikutnya For…Next .
Jenis pengembalian metode iterator adalah IEnumerable<T>, jenis antarmuka iterator. Ketika metode iterator dipanggil, metode ini mengembalikan objek enumerable 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 Get aksesor yang merupakan iterator. Deklarasi properti mencakup 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.