Yield'e C# ile Giriş - Nedir, nasıl kullanılır ve ne zaman faydalıdır
C# dilinde yield anahtar kelimesiyle ilk karşılaştığınızda, kafa karıştırıcı gelebilir. Tam olarak nasıl çalışır? Geleneksel bir dönüş ifadesi yerine ne zaman yield return kullanmalısınız? Tam bir anlayış elde etmek için, Tim Corey'nin mükemmel YouTube eğitimi temel alınarak hazırlanmış detaylı bir açıklamadan geçeceğiz: "C# Dilinde Yield'a Giriş - Nedir, nasıl kullanılır ve ne zaman faydalıdır."
Bu kılavuzda, Tim'in videosunda daha kolay gezinmek için saat damgasıyla belirlenmiş noktalara referans vereceğiz ve veri akışları, büyük koleksiyonlar ve tembel değerlendirme işlemleriyle çalışmanın nasıl dönüştüğünü göstermek için pratik örnekler içereceğiz.
C# Dilinde Yield Anahtar Sözcüğüne Giriş
Tim, yield anahtar sözcüğünü tanıtarak başlar ve bununla ilk kez karşılaşan geliştiriciler için sık sık kafa karıştırıcı olabileceğini vurgular. Yield ifadesinin, yürütmeyi durdurmasına, durumunu korumasına ve bir sonraki çağrıda bıraktığı yerden devam etmesine izin veren bir yöntem olduğunu açıklar. Tim, veri işlemenin verimli olması için yield'ı anlamanın kritik önem taşıdığını, özellikle büyük veri kümeleriyle çalışırken veya özel yineleme mantığı uygularken vurgular.
Basit Bir Örnek Ayarlama: Program Sınıfı ve Statik Boş Main
Dikkat dağıtıcı unsurları ortadan kaldırmak için Tim, Visual Studio'da "YieldDemoApp" adlı basit bir Konsol Uygulaması oluşturur.

Yield'ın C# Dilindeki Gerçek Yapısı
Tim sonra teorinin derinlerine dalar. 2:04'te yield'ın davranışını açıklar: Tüm koleksiyonu bir kerede işlemek yerine, yield ifadesi bir nokta tutar — bir kitapta başparmağınızı içeri koymak gibi — böylece yürütme daha sonra duraklatılabilir ve devam edebilir.
Bu davranış, gerektiğinde yalnızca değerlerin üretildiği ertelenmiş yürütme için kritiktir, her şeyi önceden hesaplamaktan ziyade. Tim'in betimlemesi, yield return'un nasıl çalıştığını anlamak için açık bir temel oluşturur.
Demonstration Kodunu Yazma
Program Sınıfının statik void Main metodunda, foreach döngüsüyle çalışırken akışı net bir şekilde görselleştirmeye yardımcı olmak için Console.WriteLine kullanarak "uygulamanın başlangıcı" ve "uygulamanın sonu" gibi temel mesajları ayarlar.
Bu başlangıçtaki kod örneği, herhangi bir UI karmaşıklığına girmeden yalnızca yield uygulamasına odaklanır.
PersonModel Sınıfını Oluşturma
Gösterim amacıyla, Tim bir PersonModel sınıfı oluşturur, FirstName ve LastName özellikleri ve bir yapıcı içerir. Bir PersonModel nesnesi oluşturulduğunda, hangi kullanıcının başlatıldığını belirten bir mesaj yazdırılır. Bu, nesnelerin ne zaman oluşturulduğunu ne zaman tüketildiğini görselleştirmeye yardımcı olur.

Bu basit kod oluşturma adımı, özel yineleyicilerle çalışmaya zemin hazırlar.
Geleneksel Liste Dönüşü ile DataAccess Sınıfı Oluşturma
5:06'da Tim, IEnumerable

Bu yineleyici yöntem, yineleme başlamadan önce tüm nesneleri hemen belleğe yükler — Tim'in daha sonra yield kullanımıyla karşılaştırarak önemli bir nokta belirttiği bir durumdur.

Liste ile Bellek Kullanımını Gösterme
Foreach döngüsünü çalıştırdıktan sonra Tim, ilk öğe okunmadan önce üç kullanıcının da oluşturulduğunu gösterir. Bu durum, büyük koleksiyonlarla veya büyük veri kümeleriyle uğraşırken potansiyel bir sorunu — yüksek bellek kullanımı — vurguluyor.

Tim, diyelim ki, bin kullanıcımız olsaydı, yalnızca birkaçına ihtiyaç duysak bile bin nesne oluşturmuş olacaktık, bu da verimsiz bellek tahsisine neden olurdu, diye açıklıyor.
Ertelenmiş Yürütme için Yield Return'a Geçiş
10:01'de Tim, bir geçici koleksiyon (bir Liste) oluşturmaktan ziyade yield return kullanacak şekilde GetPeople'ı değiştirir. Her yield return ifadesi, doğrudan bire bir PersonModel nesnesi üretir.
Bu yöntemin içinde yer alan kritik kod, tembel değerlendirmeye izin verir ve sonraki öğe yalnızca foreach tarafından ihtiyaç duyulduğunda üretilir.
Tim ayrıca, methodun dönüş türünün IEnumerable
Hata Ayıklama: Derleyici Yield için Nasıl Kod Üretir
Tim, süreci adım adım incelemek için kesme noktaları kullanır. İlk MoveNext çağrısından önce dizinin boş olduğunu gösterir. Sadece foreach'in yeni bir değere ihtiyaçı olduğunda derleyici yineleyici bloğunu tetikler ve yield return num satırını yürütür, bu da PersonModel'i başlatır ve döndürür.

Tim, duraklatılmış ve devam ettirilmiş yürütmeyi yönetmek için derleyicinin başlık altındaki özel durum makineleri oluşturduğunu vurgular.
Yield Return Kullanmanın Faydaları ve Verimliliği
Tim, yield'in neden bu kadar verimli olduğunu açıklar:
Bir kaydı bir kerede alabilirsiniz.
İhtiyacınız olan int sayısını sınırlayabilirsiniz.
Tüm koleksiyonu belleğe yüklemekten kaçınırsınız.
- Özellikle büyük dosya işlemleri veya veri akışları ile çalışırken ölçeklenebilirliği artırırsınız.
LINQ'nun .Take(2)'sini kullanarak Tim, üç yield return ifadesi var olmasına rağmen yalnızca iki nesnenin başlatıldığını gösterir — bu da devreye girmeyen yürütmeyi vurgular.
Pratik Örnek: Yield Kullanarak Asal Sayı Oluşturucu
Tim, bir Generators sınıfının içine yeni bir statik IEnumerable
Bu örnek, sonsuz dizileri güvenli bir şekilde işlemek için yield'in kritik olduğunu gösterir.
Yield olmadan, sınırsız bellek tüketimi nedeniyle kod çökerdi. Ancak yield kullanarak, ertelenmiş yürütme aracılığıyla sayılar talep üzerine üretilir.
Take() ile Asal Sayıları Çekme
Tim daha sonra yalnızca sabit bir sayıda asal sayıyı güvenli bir şekilde nasıl çekeceğini gösterir:
var primeNumbers = Generators.GetPrimeNumbers().Take(10000);var primeNumbers = Generators.GetPrimeNumbers().Take(10000);Statik void Main içine yazılan bu kod, sadece 10.000 asal sayıyı verimli bir şekilde çeker.
Yield return numaraları tek tek ürettiğinden, bellek kullanımı düşük kalır.
Özel yineleme: GetEnumerator ve MoveNext Kullanarak
Tim, yinelemeyi manuel olarak kontrol etmeyi açıklayarak işleri daha da ileri götürür.
Bir var iterator = primeNumbers.GetEnumerator() oluşturur, ardından bir for döngüsüyle int i kullanır ve elementleri manuel olarak almak için iterator.MoveNext() çağırır.
Bu manuel yaklaşım, özel yinelemeye olanak tanır — yalnızca ihtiyaç duyulduğunda sonraki değeri ister ve yöntemin tam olarak durakladığı yerden devam ettiğini gösterir.
Yayılmış Koleksiyonlar Üzerine ToList() kullanma Hatası
36:45'te Tim, bir yield dizisini .ToList() ile Liste'ye dönüştürmenin hemen tam değerleme neden olduğunu uyarır.
.ToList()'u sonsuz bir diziye çağırırsanız, uygulamanızın çökme riski vardır.
Tim, yield return'un tembel değerleme için tasarlandığını, ancak .ToList() çağırmanın bu deseni kırarak tam bellek materyalizasyonuna zorladığını vurgular.
LINQ yöntemleriyle çalışırken Tim, .ToList()'u nereye soktuğunuz konusunda dikkatli olmanızı önerir.
Özet: Yield Neden Güçlü Bir Araçtır
Tim, yield anahtar sözcüğünün biraz yük eklediğini (bir durum makinesi tuttuğu için) ancak daha az bellek kullanımı ve tembel değerlendirme faydalarının onu pratikte güçlü bir araç haline getirdiğini pekiştirerek tamamlar:
Büyük veri kümeleri
Büyük dosyalar
Özel yineleyiciler
Sonsuz diziler
Veri akışları
- Ertelenmiş işlemler
Yield return'u ve yaygın tuzaklardan kaçınmayı daha iyi anlamak için farklı projelerde yield ile pratik yapmanızı önerir.
Tim, izleyicileri, yield'ı üretim kodunda nasıl kullandıklarını paylaşmaya davet ederek sonlandırır.
Sonuç
Tim Corey'nin videosunu inceleyerek Yield anahtar sözcüğünün C# diline getirdiği büyük avantajları gördük. Özel yineleyiciler oluşturmaktan büyük koleksiyonları verimli bir şekilde yönetmeye kadar, yield return fonksiyon dönüşlerini daha akıllı ve daha bellek dostu hale getirir. Var number, var point, var reader, var connection veya büyük veri kümeleriyle çalışsanız da, yield'ı ustalaşmak C# kodlama becerilerinizi önemli ölçüde geliştirebilir.
Yield'ı daha önce keşfetmediyseniz, şimdi basit örneklerle pratik yaparak ve yield return'un C# derleyicisi içinde nasıl çalıştığını daha iyi anlayarak uygulama yapmanın tam zamanıdır. Tim'in resmi YouTube Kanalından daha fazla açıklayıcı video kontrol etmeyi unutmayın.

