Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 26370|Yanıt: 0

[Kaynak] C# Verim anahtar kelimelerinin kullanımı

[Bağlantıyı kopyala]
Yayınlandı 29.05.2019 09:55:11 | | | |
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.





Önceki:. .NET dayanıklılık ve geçici arıza yönetimi Polly yeniden deneme stratejisi
Önümüzdeki:HttpResult, çerez yerine set-cookie alır
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com