Partager via


yield, instruction (Visual Basic)

Envoie le premier élément d'une collection à une instruction d' For Each...Next .

Yield expression

Paramètres

Terme

Définition

expression

Requis.Une expression qui est implicitement convertible au type de la fonction d'itérateur ou de l'utilisateur d' Get qui contient l'instruction d' Yield .

Notes

L'instruction d' Yield retourne un élément d'une collection à la fois.L'instruction d' Yield est incluse dans une fonction d'itérateur ou un utilisateur d' Get, qui exécutent des itérations personnalisées sur une collection.

Vous consommez une fonction d'itérateur à l'aide de For Each...Next, instruction (Visual Basic) ou d'une requête LINQ.Chaque itération de la boucle d' For Each appelle la fonction d'itérateur.Lorsqu'une instruction d' Yield atteinte dans la fonction d'itérateur, expression est retourné, et la position actuelle dans le code est conservée.L'exécution est redémarrée de cet emplacement à la prochaine fois que la fonction d'itérateur est appelé.

Une conversion implicite doit exister du type d' expression dans l'instruction d' Yield au type de retour de l'itérateur.

Vous pouvez utiliser une instruction d' Exit Function ou d' Return pour terminer l'itération.

Le rendement «  » n'est pas un mot réservé et a un ordre particulier uniquement lorsqu'il est utilisé dans une fonction d' Iterator ou un utilisateur d' Get .

Pour plus d'informations sur les fonctions des itérateurs et des utilisateurs d' Get, consultez l' Itérateurs (C# et Visual Basic).

Utilisateurs de fonctions et get itérateur

La déclaration d'une fonction d'itérateur ou d'un utilisateur d' Get doit répondre aux conditions suivantes :

Une fonction d'itérateur ne peut pas apparaître dans un événement, un constructeur d'instance, un constructeur statique, ou un destructeur statique.

Une fonction d'itérateur peut être une fonction anonyme.Pour plus d'informations, consultez Itérateurs (C# et Visual Basic).

Gestion des exceptions

Une instruction d' Yield peut se trouver dans un bloc d' Try de Try...Catch...Finally, instruction (Visual Basic).Un bloc Try qui a une instruction Yield peut avoir des blocs Catch , et peut avoir un bloc Finally .

Une instruction Yield ne peut pas être dans un bloc Catch ou un bloc Finally .

Si le corps d' For Each (en dehors de la fonction d'itérateur) lève une exception, un bloc d' Catch dans la fonction d'itérateur n'est pas exécuté, mais un bloc d' Finally dans la fonction d'itérateur est exécuté.Un bloc Catch à l'intérieur d'une fonction d'itérateur intercepte uniquement les exceptions qui se produisent à l'intérieur de la fonction d'itérateur.

Implémentation technique

Le code suivant retourne IEnumerable (Of String) d'une fonction d'itérateur puis itère au sein de les éléments d' IEnumerable (Of String).

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

L'appel à MyIteratorFunction n'exécute pas le corps de la fonction.À la place l'appel retourne IEnumerable(Of String) dans la variable d' elements .

Sur une itération de la boucle d' For Each, la méthode d' MoveNext est appelée pour elements.Cet appel exécute le corps d' MyIteratorFunction jusqu'à ce que l'instruction suivante d' Yield soit atteinte.L'instruction d' Yield retourne une expression qui détermine non seulement la valeur de la variable d' element en vue de leur utilisation par le corps de la boucle mais également la propriété d' Current des éléments, qui est IEnumerable (Of String).

Pour chaque itération suivante de la boucle d' For Each, l'exécution du corps des itérateurs continue à laquelle elle a été arrêté, de nouveau arrêtant lorsqu'elle atteint une instruction d' Yield .La boucle d' For Each se termine lorsque la fin de la fonction d'itérateur ou d'une instruction d' Return ou d' Exit Function est atteinte.

Exemple

L'exemple suivant présente une instruction d' Yield qui est à l'intérieur d'une boucle d' For… next .Chaque itération du corps d'instruction d' Pour chaque dans Main crée un appel à la fonction d'itérateur d' Power .Chaque appel à la fonction d'itérateur continue à la prochaine exécution de l'instruction d' Yield, qui se produit pendant l'itération suivante de la boucle d' For…Next .

Le type de retour de la méthode d'itérateur est IEnumerable<T>, un type d'interface d'itérateur.Lorsque la méthode d'itérateur est appelée, elle retourne un objet énumérable qui contient les puissances d'un nombre.

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

L'exemple suivant montre un utilisateur d' Get qui est un itérateur.La déclaration de propriété inclut un modificateur d' 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

Pour obtenir d'autres exemples, consultez Itérateurs (C# et Visual Basic).

Configuration requise

Visual Studio 2012

Voir aussi

Autres ressources

Itérateurs (C# et Visual Basic)

Instructions (Visual Basic)