Bagikan melalui


Pernyataan Hasil (Visual Basic)

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:

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.

Lihat juga