Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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. Yineleyici işlevi bir sonraki çağrılışında yürütme bu konumdan yeniden başlatılır.
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
ByRefparametresi 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 ... Tutmak... Finally Deyimi.
Try deyimi içeren bir Yield blok, Catch blokları içerebilir ve bir Finally bloğu içerebilir.
Yield deyimi 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ır Yield. Sonraki döngü. içindeki Main 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öntemi çağrıldığında, bir sayının gücünü içeren numaralandırı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.