C# (yield)

Merhaba arkadaşlar,

Grup nesnelerini yönetirken ihtiyacımıza göre geliştirdiğimiz koleksiyon tabanlı nesnelerin foreach yapısında çalışabilmesi için IEnumerable arayüzünü uygulamak zorunda kalıyorduk .Bu işlem standart olsa da açıkçası bir hayli kod yazmamız gerekiyordu. İşte tam bu noktada dilin yapısına C# 2.0 ile birlikte Yeni Bir İterasyon tekniği olan (yield) eklendi. Yine bu yapı IEnumerable ve IEnumerator arayüzleri ile işbirliği yapıyor ama biz programcıların yield sayesinde bu arayüzlerle ilgilenmemiz gerekmiyor.

C# 2.0 ile birlikte yield return ve yield break anahtar sözcükleri eklendi. Bu anahtar sözcükleri geriye IEnumerator ya da IEnumerator<T> döndüren metotlar için geçerlidir.

yield return belli bir sıra ile yapılırsa yapıldığı sıraya göre koleksiyon kümesi oluşturur. Buradaki önemli nokta kümenin IEnumerator türünden olması gerekliliğidir. Buda foreach yapısı ile çalışabilmesi anlamına geliyor. Yani kısa bir örnek ile bunu açıklayalım;

return ile yield return birbirine karıştırılmamalıdır. yield return metodun sonlanması ve geriye bir şey dönmesi anlamına gelmiyor.

yield break ile koleksiyon oluşturduğumuz döngü içerisinde belirli bir koşul altında koleksiyon kümesini sonlandırmak istersek bunu kullanırız. GetMyStringList() metoduna for sayacımız 5 olduğunda koleksiyon kümesini sonlandır ile tekrar düzenlersek;

yield return anahtar sözcüğünün iterasyonu nasıl yaptığını yani arka planda neler oluyoru öğrenmek için 🙂 .Net ile birlikte gelen ILDASM (Intermadiate Language Disassembler) aracı ile inceleyelim.

ILDASM aracını açmak için uygulanacak adımlar

  • Visual Studio Command Prompt açıp ( kendi bilgisayarınızdaki visual studio) açılan ekrana ildasm yazıyoruz
  • Ildasm aracı açıldıktan sonra File menüsünden Open tıklıyoruz ve projenizin dll dosyasını (assembly) veriyoruz.

Karşımıza aşağıdaki gibi bir ekran gelecek

Yukarıdaki örneğe dikkat edersek GetMyStringList() metodunda MoveNext, Reset, Current gibi metot ve özellikleri görüyoruz. Yani compiler yield anahtar sözcüğünü gördüğü yere aslında bizim daha önce uyguladığımız iterasyon tekniği yapıyor ve yield bizim yerimize IEnumerable ve IEnumerator arayüzleri ile işbirliği yapıyor. Aslında compiler arka planda ne kadar mükemmel bir işlem yaptığını görebiliyoruz.

Bu yazımda Yeni Bir İterasyon tekniği olan (yield) hakkında edindiğim bilgileri paylaşmaya çalıştım. Umarım faydalı olmuştur 🙂

Bir sonraki yazımda görüşmek üzere 🙂

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik

https://docs.microsoft.com/tr-tr/dotnet/csharp/language-reference/keywords/yield

Leave a Comment