Yield Deyimi (Visual Basic)
Bir koleksiyonun sonraki öğesini bir deyimine For Each...Next gönderir.
Sözdizimi
Yield expression
Parametreler
| Süre | Tanım |
|---|---|
expression |
Gereklidir. Deyimini içeren tekrarlayıcı işlevinin veya erişimcinin türüne örtülü olarak dönüştürülebilir Get bir Yield ifade. |
Açıklamalar
deyimi Yield aynı anda bir koleksiyonun bir öğesini döndürür. deyimi, Yield bir koleksiyon üzerinde özel yinelemeler gerçekleştiren bir Get tekrarlayıcı işlevine veya erişimcisine dahil edilir.
Her biri için... kullanarak birerator işlevi kullanırsanız... Sonraki Deyim veya LINQ sorgusu. Döngülerin her For Each yinelemesi, tekrarlayıcı işlevi çağrılır. Bir Yield deyimine tekrarlayıcı işlevinde ulaşıldı, expression döndürülür ve kodda geçerli konum korunur. Yürütme, yineleyici işlevinin bir sonraki çağrılmasında bu konumdan başlar.
deyiminde türünden tekrarlayıcının expression dönüş Yield türüne örtülü bir dönüştürme mevcut olması gerekir.
Yinelemeyi sona Exit Function Return erdiren bir veya deyimi kullanabilirsiniz.
"Yield" ayrılmış bir sözcük değildir ve yalnızca bir işlevde veya erişimcide kullanılırken Iterator özel bir anlamı Get vardır.
Tekrarlayıcı işlevleri ve erişimcileri hakkında daha Get fazla bilgi için bkz. Tekrarlayıcılar.
Iterator İşlevleri ve Erişimcileri Al
Bir iterator işlevinin veya Get erişimcinin bildirimi aşağıdaki gereksinimleri karşılamalıdır:
Bir Iterator değiştiricisi içermesi gerekir.
Dönüş türü , IEnumerable IEnumerable<T> , veya türünde olması IEnumerator IEnumerator<T> gerekir.
Hiçbir
ByRefparametreye sahip olamaz.
Bir olayda, örnek oluşturucuda, statik oluşturucuda veya statik yıkıcıda bir tekrarlayıcı işlevi olamaz.
Bir tekrarlayıcı işlev anonim bir işlev olabilir. Daha fazla bilgi için bkz. Tekrarlayıcılar.
Özel Durum İşleme
Deyimi Yield bir Try Try... bloğu içinde olabilir. Yakalamak... Finally Deyimi. Deyimi Try olan bir Yield bloğun blokları olabilir ve bir bloğu Catch Finally olabilir.
Deyim Yield bir bloğun veya Catch bloğun içinde Finally olamaz.
Gövde (yineleyici işlevinin dışında) bir özel durum oluşturursa yineleyici işlevinde bir blok yürütülmez, ancak yineleyici işlevinde bir For Each Catch blok Finally yürütülür. Bir Catch iterator işlevinin içindeki bir blok, yalnızca bir kez dahaerator işlevinin içinde oluşan özel durumları yakalar.
Teknik Uygulama
Aşağıdaki kod bir IEnumerable (Of String) yineleyici işlevinden bir döndürür ve ardından öğ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övdesinde yürütülmez. Bunun yerine çağrısı IEnumerable(Of String) değişkenine elements bir döndürür.
Döngü yinelemesinde For Each yöntemi MoveNext için çağrılır. elements Bu çağrı, bir sonraki MyIteratorFunction deyime ulaşıncaya Yield kadar gövdeyi yürütür. deyimi, yalnızca döngü gövdesi tarafından tüketilmek üzere değişkenin değerini değil, aynı zamanda öğelerinin özelliğini de belirleyen bir Yield element ifade Current döndürür. IEnumerable (Of String)
Döngüyü izleyen her yinelemede yineleyici gövdesinin yürütülmesi, deyimine ulaştığında tekrar durdurularak geriye doğru For Each devam Yield eder. Döngü, For Each tekrarlayıcı işlevin veya veya deyiminin sonuna Return Exit Function ulaşıldıklarda tamamlanır.
Örnek 1
Aşağıdaki örnekte Yield for... içinde bir deyimi vardır. Sonraki döngü. içinde For Each deyimi gövdesinin her Main yinelemesi, tekrarlayıcı Power işlevine bir çağrı oluşturur. Yineleme işlevine yapılan her çağrı, döngüyü bir sonraki yinelemesinde oluşan Yield deyiminin sonraki yürütme işlemine For…Next devam eder.
Tekrarlayıcı yönteminin dönüş türü, bir IEnumerable<T> bir tekrarlayıcı arabirim t type'tı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 örnek, bir Get iterator olan bir erişimciyi gösteriyor. Özellik bildirimi bir değiştirici Iterator 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. Tekrarlayıcılar.