1. Yield ile uygulanan fonksiyonlar
Getiri Getirisi:
Aşağıdaki kodu inceleyelim; bu kod, yield return'u içeren bir diziyi foreach ile yield return ile dolaştırmaya benzer bir fonksiyon uygular; bu da yield return'un iteratorun işlevini uygulamak için de kullanıldığını gösterir.
Verim Kırılması:
Aşağıdaki koda bakıldığında, sadece 1 ve 2 çıktı olarak görülür, ancak 3 değildir; bu da iteratorun yield break ile durdurulduğunu gösterir, bu yüzden yield break iterasyonu sonlandırmak için kullanılır.
2. Yalnızca <T><T>IEnumerable, IEnumerable, IEnumerator veya IEnumerator döndürmesi gereken erişim kullanıcıları için yöntemlerde, operatörlerde kullanılabilir.
3. Yield anahtar kelimesinin uygulama prensibi
Foreach döngüsünü while döngüsü ile değiştirdik ve GetEnumerator(), ayrıca ilgili IEnumerator'un MoveNext() ve Current özelliklerini uygulamamış olsak da, bu fonksiyonlarla hâlâ çalıştığımızı fark ettik.
Bunun nedenini bulmak için oluşturulan exe'yi ILSpy kullanarak decompile yapabiliriz.
Çünkü doğrudan C#'a decompilasyon olduğu gibi olacak
Bu nedenle, okunabilirliği zayıf olsa da, prensipleri ayrıntılı olarak anlayabildiğimiz için C# annotasyonlarıyla IL koduna decompile yapmayı tercih ettik. Önce programın çevirisine bakalım, derleme sırasında otomatik olarak yeni bir sınıf oluşturuluyor.
Kodu daha yakından inceleyelim ve EnumerableFuc() bu yeni sınıfı döndürüyor.
Bu kodun otomatik olarak oluşturduğu sınıfın uygulamasına baktığımızda, <T>IEnumerable, IEnumerable, IEnumerator veya IEnumerator'u devraldığını görebiliriz ve <T>bu yeni sınıfın ilgili IEnumerator'un MoveNext() ve Current özelliklerini uygulamamamızın sebebi olduğunu tahmin edebiliriz, ancak bu fonksiyonları normal şekilde kullanabiliyoruz.
Bu sınıfın nasıl yinelediğine bakalım, esas olarak MoveNext() fonksiyonuna bakalım
MoveNext() fonksiyonuna yapılan her çağrı duruma 1 ekler ve toplamda 4 yineleme yapılır; ilk üçü doğru, son yanlış döner, bu da yinelemenin sonunu gösterir. Bu dört yineleme, enumberableFuc() içindeki ifadelerle karşılık gelir; bunlar 4 parçaya bölünmüş ve 3 yield return ifadesi içerir.
enumberableFuc() ile yineleme süreci şudur:
1. Kod tarafından otomatik olarak oluşturulan sınıfın bir örneğini almak için enumberableFuc() fonksiyonunu çalıştırın. 2. Sonra GetEnumberator() fonksiyonunu çağırarak edinilen sınıfın kendisini yinelemeye başlatın. 3. Her MoveNext() çalıştırdığınızda, durum 1 artar ve switch ifadesi, MoveNext() çağırdığınızda kodun farklı bölümlerini çalıştırmanıza izin verir. 4。 MoveNext() yanlış, son döndürüyor. Bu aynı zamanda yield anahtar kelimesinin aslında bir sözdizimi şekeri olduğunu ve nihayetinde <T>IEnumberable, IEnumberable, <T>IEnumberator ve IEnumberator arayüzlerinin uygulanmasıyla uygulanan yinelemeli bir fonksiyon olduğunu gösterir.
|