Hozamkimutatás (Visual Basic)

A gyűjtemény következő elemét elküldi egy For Each...Next utasításnak.

Syntax

Yield expression  

Paraméterek

Időszak Definíció
expression Szükséges. Olyan kifejezés, amely implicit módon konvertálható az utasítást tartalmazó Yield iterátorfüggvény vagy Get tartozék típusára.

Megjegyzések

Az Yield utasítás egyszerre egy gyűjtemény egy elemét adja vissza. Az Yield utasítás szerepel egy iterátorfüggvényben vagy Get tartozékban, amely egyéni iterációkat hajt végre egy gyűjteményen keresztül.

Iterátorfüggvényt használ egy Mindenhöz... Következő utasítás vagy LINQ-lekérdezés. A hurok minden iterációja For Each meghívja az iterátorfüggvényt. Yield Amikor az iterátorfüggvényben egy utasítást ér el, expression a rendszer visszaadja, és a kód aktuális helyét megtartja. A végrehajtás az iterátorfüggvény következő meghívásakor indul újra erről a helyről.

Implicit átalakításnak kell léteznie az utasítás típusától expressionYield az iterátor visszatérési típusához.

Az iteráció befejezéséhez használhat egy vagy Return több Exit Function utasítást.

A "Hozam" nem fenntartott szó, és csak akkor jelent különleges jelentést, ha egy Iterator függvényben vagy Get tartozékban használják.

További információ az iterátorfüggvényekről és Get tartozékokról: Iterators.

Iterátorfüggvények és tartozékok lekérése

Az iterátorfüggvény vagy Get tartozék deklarációjának meg kell felelnie a következő követelményeknek:

Iterátorfüggvény nem fordulhat elő eseményben, példánykonstruktorban, statikus konstruktorban vagy statikus destruktorban.

Az iterátorfüggvény lehet névtelen függvény. További információ: Iterators.

Kivételkezelés

Az Yield utasítás a Kipróbálás blokkon belül Try is lehet... Fogás... Végül nyilatkozat. Az Try utasítással Yield rendelkező blokkok blokkokat tartalmazhatnak Catch , és blokkokat is tartalmazhatnak Finally .

Az Yield utasítás nem lehet blokkban Catch vagy blokkban Finally .

Ha a For Each törzs (az iterátorfüggvényen kívül) kivételt jelez, Catch az iterátorfüggvény blokkja nem lesz végrehajtva, de az iterátorfüggvény egy Finally blokkja lesz végrehajtva. Az Catch iterátorfüggvényen belüli blokkok csak az iterátorfüggvényben előforduló kivételeket rögzítik.

Technikai megvalósítás

Az alábbi kód egy iterátorfüggvényből ad vissza egy IEnumerable (Of String) értéket, majd végigvezeti a IEnumerable (Of String)függvény elemein.

Dim elements As IEnumerable(Of String) = MyIteratorFunction()  
    …  
For Each element As String In elements  
Next  

A hívás MyIteratorFunction nem hajtja végre a függvény törzsét. Ehelyett a hívás egy IEnumerable(Of String) értéket ad vissza a elements változóba.

A ciklus iterációja For Each esetén a MoveNext metódust meghívjuk elements. Ez a hívás addig hajtja végre a törzset MyIteratorFunction , amíg el nem éri a következő Yield utasítást. Az Yield utasítás egy olyan kifejezést ad vissza, amely nem csak a ciklustörzs által használt változó értékét element határozza meg, hanem az Current elemek tulajdonságát is, amely egy IEnumerable (Of String).

A ciklus minden további iterációján For Each az iterátor törzsének végrehajtása onnan folytatódik, ahonnan abbahagyta, és ismét leáll, amikor egy utasítást ér el Yield . A For Each ciklus akkor fejeződik be, ha az iterátorfüggvény vagy egy Return vagy Exit Function utasítás vége el van érve.

1. példa

Az alábbi példában egy Yield for ... Következő ciklus. A For Each utasítástörzs minden iterációja Mainmeghívja az Power iterátorfüggvényt. Az iterátorfüggvény minden hívása Yield az utasítás következő végrehajtásával folytatódik, amely a ciklus következő iterációja For…Next során következik be.

Az iterátor metódus visszatérési típusa az IEnumerable<T>iterátor felületének típusa. Az iterátor metódus meghívásakor egy számokat tartalmazó, számokat tartalmazó, számokat tartalmazó, számokat tartalmazó objektumot ad vissza.

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

2. példa

Az alábbi példa egy Get iterátort bemutató kiegészítőt mutat be. A tulajdonságdeklaráció tartalmaz egy Iterator módosítót.

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

További példákért lásd : Iterators.

Lásd még