yield, instruction (Visual Basic)

Envoie l’élément suivant d’une collection à une instruction For Each...Next.

Syntaxe

Yield expression  

Paramètres

Terme Définition
expression Obligatoire. Expression qui est implicitement convertible en type de la fonction d’itérateur ou de l’accesseur Get qui contient l’instruction Yield.

Notes

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

Vous consommez une fonction d’itérateur à partir d’une fonction en utilisant une instruction For Each... Next ou une requête LINQ. Chaque itération de la boucle For Each appelle la fonction d’itérateur. Lorsqu'une instruction Yield est atteinte dans la fonction d’itérateur, expression est retourné, et l'emplacement dans le code est conservé. L'exécution redémarrera à partir de cet emplacement la prochaine fois que la fonction d'itérateur sera appelée.

Une conversion implicite doit exister depuis le type de expression dans l’instruction Yield vers le type de retour de l’itérateur.

Utilisez une instruction Exit Function ou Return pour terminer l’itération.

« Yield » n’est pas un mot réservé et a une signification particulière uniquement lorsqu’il est utilisé dans une fonction Iterator ou un accesseur Get.

Pour plus d’informations sur les fonctions d’itérateur et les accesseurs Get, consultez Itérateurs.

Fonctions d’itérateur et accesseurs Get

La déclaration d'une fonction d’itérateur ou d’un accesseur Get doit respecter les spécifications suivantes :

Une fonction d’itérateur ne peut pas être présente 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.

Gestion des exceptions

Une instruction Yield peut se trouver à l’intérieur d’un bloc Try d’une instruction Try... Catch... Finally. 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 se trouver à l’intérieur d’un bloc Catch ou d’un bloc Finally.

Si le corps For Each (en dehors de la fonction d’itérateur) lève une exception, un bloc Catch dans la fonction d’itérateur n’est pas exécuté, mais un bloc 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) depuis une fonction d’itérateur, puis itère au sein des éléments de 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 elements.

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

À chaque itération suivante de la boucle For Each, l'exécution du corps de l'itérateur reprend à partir de l'emplacement où elle s'est interrompue, et s'arrête encore lorsqu'elle atteint une instruction Yield. La boucle For Each se termine lorsque à la fin de la fonction d’itérateur ou un Return ou lorsqu'une instruction Exit Function est atteinte.

Exemple 1

L’exemple suivant comprend une instruction Yield qui se trouve dans une boucle For…Next. Chaque itération du corps d'instruction For Each dans Main crée un appel à la fonction d'itérateur Power. Chaque appel à la fonction d'itérateur continue vers l'exécution suivante de l'instruction Yield, qui se produit pendant l'itération suivante de la boucle For…Next.

Le type de retour de la méthode Iterator est IEnumerable<T>, un type interface itérateur. Lorsque la méthode Iterator est appelée, elle retourne un objet énumérable contenant 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

Exemple 2

L'exemple suivant illustre un accesseur Get qui est un itérateur. La déclaration de propriété inclut un modificateur 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 plus d’exemples, consultez Itérateurs.

Voir aussi