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 expression
Yield
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:
Tartalmaznia kell egy Iterator módosítót.
A visszatérési típusnak a következőnek kell lennieIEnumerable: , IEnumerable<T>IEnumeratorvagy IEnumerator<T>.
Nem rendelkezhet
ByRef
paraméterekkel.
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 Main
meghí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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: