Yield Deyimi (Visual Basic)

Bir koleksiyonun sonraki öğesini bir For Each...Next deyime gönderir.

Sözdizimi

Yield expression  

Parametreler

Süre Tanım
expression Gerekli. deyimini içeren Yield yineleyici işlevinin veya Get erişimcinin türüne örtük olarak dönüştürülebilir bir ifade.

Açıklamalar

deyimi bir Yield kerede bir koleksiyonun bir öğesini döndürür. deyimi Yield , bir koleksiyon üzerinde özel yinelemeler gerçekleştiren bir yineleyici işlevine veya Get erişimciye dahil edilir.

Her İçin... kullanarak yineleyici işlevi tüketirsiniz. Next Deyimi veya LINQ sorgusu. Döngünün For Each her yinelemesi yineleyici işlevini çağırır. Yineleyici işlevinde bir Yield deyime ulaşıldığında döndürülür expression ve koddaki geçerli konum korunur. Yürütme, yineleyici işlevinin bir sonraki çağrılmasında bu konumdan başlar.

deyimindeki türünden expression yineleyicinin Yield dönüş türüne örtük dönüştürme bulunmalıdır.

Yinelemeyi sonlandırmak için bir Exit Function veya Return deyimi kullanabilirsiniz.

"Verim" ayrılmış bir sözcük değildir ve yalnızca bir işlevde veya Get erişimcide kullanıldığında özel bir Iterator anlamı vardır.

Yineleyici işlevleri ve Get erişimcileri hakkında daha fazla bilgi için bkz . Yineleyiciler.

Yineleyici İşlevleri ve Erişimcileri Al

Yineleyici işlevinin veya Get erişimcinin bildirimi aşağıdaki gereksinimleri karşılamalıdır:

Yineleyici işlevi bir olayda, örnek oluşturucusunda, statik oluşturucuda veya statik yıkıcıda gerçekleşemez.

Yineleyici işlevi anonim bir işlev olabilir. Daha fazla bilgi için bkz . Yineleyiciler.

Özel Durum İşleme

Bir Yield deyim, bir Try bloğunun içinde Try olabilir... Yakalamak... Finally Deyimi. Try Deyimi olan bir Yield bloğun blokları olabilir Catch ve bir Finally bloğu olabilir.

Deyimi Yield bir Catch blok veya Finally blok içinde olamaz.

For Each Gövde (yineleyici işlevinin dışında) bir özel durum oluşturursa, yineleyici işlevindeki bir Catch blok yürütülür, ancak yineleyici işlevindeki bir Finally blok yürütülür. Catch Yineleyici işlevinin içindeki bir blok yalnızca yineleyici işlevinin içinde oluşan özel durumları yakalar.

Teknik Uygulama

Aşağıdaki kod bir yineleyici işlevinden bir IEnumerable (Of String) döndürür ve öğelerini yineler IEnumerable (Of String).

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

çağrısı MyIteratorFunction işlevin gövdesini yürütmez. Bunun yerine çağrısı değişkenine elements bir IEnumerable(Of String) döndürür.

Döngünün MoveNext yinelemesinde For Each yöntemi için elementsçağrılır. Bu çağrı, sonraki Yield deyime ulaşılana kadar gövdesini MyIteratorFunction yürütür. deyimi Yield , yalnızca döngü gövdesi tarafından tüketilmek üzere değişkenin element değerini değil, aynı zamanda bir olan öğelerinin özelliğini de Current belirleyen bir IEnumerable (Of String)ifade döndürür.

Döngünün For Each sonraki her yinelemesinde, yineleyici gövdesinin yürütülmesi kaldığı yerden devam eder ve bir Yield deyime ulaştığında yeniden durdurulır. Yineleyici For Each işlevinin veya veya ReturnExit Function deyiminin sonuna ulaşıldığında döngü tamamlanır.

Örnek 1

Aşağıdaki örnekte for... içinde yer alan bir deyim vardırYield. Sonraki döngü. içindeki Main For Each deyimi gövdesinin her yinelemesi yineleyici işlevine Power bir çağrı oluşturur. Yineleyici işlevine yapılan her çağrı, döngünün bir sonraki yinelemesi Yield sırasında gerçekleşen deyiminin bir sonraki yürütmesine For…Next devam eder.

Yineleyici yönteminin IEnumerable<T>dönüş türü, yineleyici arabirim türüdür. Yineleyici yöntem çağrıldığında, bir sayının kuvvetlerini içeren sayılabilir bir nesne döndürür.

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

Örnek 2

Aşağıdaki örnekte yineleyici olan bir Get erişimci gösterilmektedir. Özellik bildirimi bir Iterator değiştirici içerir.

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

Ek örnekler için bkz . Yineleyiciler.

Ayrıca bkz.