C#'ta Yield'e Giriş - Nedir, Nasıl Kullanılır ve Ne Zaman Faydalı
[[academy-video-youtube({"vid": "AAz8q6dOCYk", "start_time": "0", "title": "C#'ta Yield'e Giriş", "creator": "Tim Corey", "length": "43m 58s"})]]
C#'ta yield anahtar kelimesi ile ilk kez karşılaştığınızda kafa karıştırıcı görünebilir. Tam olarak nasıl çalışır? Geleneksel bir return ifadesi yerine yield return ne zaman kullanmalısınız? Tam bir anlayış kazanmak için, Tim Corey'nin mükemmel YouTube öğreticisine dayalı ayrıntılı bir açıklama yapacağız: 'C#'ta Yield'e Giriş - Nedir, nasıl kullanılır ve ne zaman kullanışlıdır'.
Bu kılavuzda, Tim'in videosundaki belirli noktaları daha kolay navigasyon için zaman damgasıyla referans alacağız ve yield'in veri akışlarını, büyük koleksiyonları ve tembel değerlendirmeyi nasıl dönüştürdüğünü göstermek için pratik örnekler ekleyeceğiz.
C# içindeki Yield Anahtar Kelimesine Giriş
Tim, yield anahtar kelimesini tanıtarak başlar ve ilk kez karşılaşan geliştiriciler için genellikle kafa karıştırıcı olabileceğine vurgu yapar. Yield ifadesi, bir methodun yürütme işlemini durdurmasına, durumunu sürdürmesine, ve bir sonraki çağırıldığında kaldığı yerden devam etmesine olanak tanır. Tim, özellikle büyük veri kümeleriyle uğraşırken ya da özel yineleme mantığını uygularken yield'i anlamanın verileri verimli bir şekilde işleme açısından kritik olduğunu vurgular.
Basit Bir Örnek Kurulumu: Program Sınıfı ve Statik Void Main
Dikkat dağıtıcı unsurlardan kaçınmak için, Tim Visual Studio'da 'YieldDemoApp' adında basit bir Konsol Uygulaması oluşturur.

C## Yield Aslında Ne Yapar
Daha sonra Tim, teorinin daha derinlerine dalar. 2:04'te, yield'in davranışını tarif eder: Bir bütün koleksiyonu bir kerede işlemek yerine, yield ifadesi bir boşluk tutar - bir kitabın içine baş parmak koymak gibi - böylece yürütme durdurulup sonra devam edebilir.
Bu davranış, ertelenmiş yürütme için çok önemlidir, yani değerler yalnızca gerektiğinde üretilir, önceden her şeyi önceden hesaplamaya gerek kalmaz. Tim'in açıklaması, yield return'un nasıl çalıştığına dair temelleri açık bir şekilde atar.
Demolar Kod Yazma
Program Sınıfının static void Main methodunda, foreach döngüsü ile çalışırken akışı net bir şekilde görselleştirmeyi sağlamak için Console.WriteLine kullanarak 'Başlamadan önce uygulama' ve 'Uygulamanın sonu' gibi temel kitap sonları mesajları ayarlar.
Bu ilk kod örneği, herhangi bir UI karmaşıklığına girmeden yield uygulamasına odaklanır.
PersonModel Sınıfını Oluşturma
Göstermek için, Tim, Ad ve Soyad özelliklerine ve bir yapıcıya sahip bir PersonModel sınıfı oluşturur. 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şturulduklarına karşı ne zaman kullanıldıklarını görselleştirmeye yardımcı olur.

Bu basit kod oluşturma adımı, özel yineleyicilerle çalışma aşamasını hazırlar.
Geleneksel Liste Dönüşü ile DataAccess Sınıfını Kurma
5:06'da Tim, IEnumerable<PersonModel> döndüren GetPeople methoduna sahip bir DataAccess sınıfına geçer. Başlangıçta, dönen değer Tim Corey, Sue Storm ve Jane Smith adında üç PersonModel örneği ile doldurulmuş bir Listedır.

Bu yineleyici method tüm nesneleri hemen belleğe yükler, bu da Tim'in daha sonra yield kullanarak karşılaştırdığı önemli bir noktadır.

Liste ile Bellek Kullanımını Gösterme
Foreach döngüsü çalıştırıldıktan sonra, Tim ilk eleman okunmadan önce üç kullanıcının tamamının oluşturulduğunu gösterir. Bu, büyük koleksiyonlarla veya büyük veri kümeleriyle uğraşırken karşılaşılan potansiyel bir sorunu – yüksek bellek kullanımını – vurgular.

Tim, diyelim ki, eğer bin kullanıcımız olsaydı, yalnızca birkaçına ihtiyaç duyuyor olsak bile bin nesne oluşturmuş olacağımızı ve bunun verimsiz bir bellek tahsisiyle sonuçlandığını açıklar.
Ertelenmiş Yürütme için Yield Return'a Geçiş
10:01'de Tim, GetPeople methodunu bir geçici koleksiyon (bir Liste) oluşturmaktan ziyade yield return kullanacak şekilde değiştirir. Her yield return ifadesi, doğrudan bir PersonModel'i bir defada yayar.
Bu yöntemin içinde yer alan kritik kod
Tim ayrıca methodun dönüş türünün IEnumerable<PersonModel> olması gerektiğini ve bir Liste kullanmanın ertelenmiş yürütmenin amacını boşa çıkaracağını belirtiyor.
Hata Ayıklama: Yield İçin Derleyicinin Kod Üretme Şekli
Tim, süreci adım adım takip etmek için kırılma noktaları kullanır. İlk MoveNext çağrısından önce dizinin boş olduğunu gösterir. Foreach bir sonraki değere ihtiyaç duyduğunda derleyici iterator bloğunu tetikler ve yield return num satırını yürütür, ki bu da PersonModel'i başlatır ve döndürür.

Tim, derleyicinin, duraklatılmış ve devam eden yürütmeyi yönetmek için kaputun altında özel durum makineleri oluşturduğunu vurguluyor.
Yield Return Kullanımının Faydaları ve Verimliliği
Tim, yield'in neden bu kadar verimli olduğunu açıklar:
Tek seferde bir kayıt alabilirsiniz.
İhtiyacınız olan int sayısı sınırlayabilirsiniz.
Tüm koleksiyonu belleğe yüklemekten kaçınabilirsiniz.
- Büyük dosya işleme veya veri akışları ile çalışırken ölçeklenebilirliği artırırsınız.
üç yield return ifadesi var olmasına rağmen
Pratik Örnek: Yield ile Asal Sayı Üretici
Tim, bir Generators sınıfı içinde IEnumerator<int> GetPrimeNumbers() methodu yeni bir statik yöntem oluşturur. Bu sonsuz döngüde, Tim asal olduğunukontrol wordseçmek için yardımcı bir IsPrimeNumber (int number) işlevi kullanır. Sayı asal ise yield return number ifadesini kullanarak yayar.
Bu örnek, yield'in sonsuz dizileri güvenle yönetmenin anahtarı olduğunu gösteriyor.
Yield olmadan, kod sınırsız bellek tüketimi nedeniyle çökerdi. Ancak yield kullanarak, ertelenmiş yürütme, sayıların talep üzerine üretilmesini sağlar.
Prime Sayıları Take() ile Almak
Tim, yalnızca belirli bir miktarda asal sayı almayı nasıl güvenli bir şekilde yapacağınızı gösteriyor:
var primeNumbers = Generators.GetPrimeNumbers().Take(10000);var primeNumbers = Generators.GetPrimeNumbers().Take(10000);Static void Main içinde yazılmış bu kod, sadece 10.000 asal sayıyı verimli bir şekilde alır.
Çünkü yield return sayıları bire bir üretir, bellek kullanımı düşük kalır.
Özel Yineleme: GetEnumerator ve MoveNext Kullanma
Tim, yinelemeyi manuel olarak kontrol etme konusuna daha da devam eder.
Bir var iterator = primeNumbers.GetEnumerator() oluşturur, ardından int i ile bir for döngüsü ve iterator.MoveNext() çağrısı kullanarak elemanları manuel olarak çeker.
Bu manuel yaklaşım, yalnızca gerektiğinde bir sonraki değeri sorarak özel yinelemeye olanak tanır ve yöntem durakladığı yerden tam olarak yerinde devam eder.
Yayılmış Koleksiyonlar Üzerinde ToList() Kullanırken Yapılan Yaygın Bir Hata
36:45'te, Tim bir uyarıda bulunur: bir yield dizisini .ToList() ile bir Listeye dönüştürmek, hemen tam bir değerlendirmeye sebep olur.
Sonsuz bir dizi üzerinde .ToList() çağırırsanız uygulamanızı çökertme riski vardır.
Tim, yield return'un tembel değerlendirme için tasarlandığını ve .ToList() çağırmanın, kalıp dışına çıkararak tam bellek özdeşleştirme zorlayarak bu deseni bozduğunu vurguluyor.
LINQ yöntemleriyle çalışırken, Tim, .ToList()'ı nerede kullandığınıza dikkat etmenizi öneriyor.
Özet: Neden Yield Güçlü Bir Araç
Tim, yield anahtar kelimesinin hafif bir yük getirmesine rağmen (bir durum makinesi tutarak), O'nun kullanımıyla azaltılmış bellek kullanımı ve tembel değerlendirme gibi faydaların önemli olduğunu vurgulayarak bitiriyor:
Büyük veri setleri
Büyük dosyalar
Özel yineleyiciler
Sonsuz diziler
Veri akışları
- Ertelenmiş işleme
Yield return'u kullanırken sık yapılan hatalardan kaçınmak ve nasıl çalıştığını daha iyi anlamak için farklı projelerde çalışarak deneyim kazanmanızı önerir.
Tim, izleyicileri yield'u üretim kodunda nasıl kullandıklarını paylaşmaya davet ediyor.
Sonuç
Tim Corey'nin videosunu izleyerek, yield anahtar kelimesinin C#'a getirdiği büyük faydaları gördük. Özel yineleyiciler oluşturmaktan büyük koleksiyonları verimli bir şekilde yönetmeye, yield return fonksiyon dönüşlerini daha akıllı ve daha hafıza bakımından verimli kılmaktadır. Var number, var point, var reader, var connection veya büyük veri kümeleri ile çalışırken, yield'i ustalıkla kullanmak C# kodlama becerilerinizi önemli ölçüde artırabilir.
Yield'i daha önce keşfetmediyseniz, şimdi basit örneklerle onu kullanarak nasıl çalıştığını ve C# derleyicisinde yield return'un nasıl işlediğini anlamak için mükemmel bir zamandır. Tim'in resmi YouTube Kanalındaki daha fazla içgörü dolu videoları kontrol etmeyi unutmayın.

