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:
Bir Yineleyici değiştirici içermelidir.
Dönüş türü , , IEnumerable<T>IEnumeratorveya IEnumerator<T>olmalıdırIEnumerable.
Herhangi bir
ByRef
parametresi olamaz.
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 Return
Exit 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.