Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A gyűjtemény következő elemét elküldi egy For Each...Next utasításnak.
Szemantika
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 Exit Function vagy Return 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
ByRefparamé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 ... Elkap... 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.