Altbilgi içeriğine atla
Iron Academy Logo
C# Öğrenin
C# Öğrenin

Diğer Kategoriler

Yield'e C# ile Giriş - Nedir, nasıl kullanılır ve ne zaman faydalıdır

Tim Corey
43m 58s

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.

Understanding Yield In Csharp 1 related to Basit Bir Örnek Ayarlama: Program Sınıfı ve Statik Boş Main

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.

Understanding Yield In Csharp 2 related to PersonModel Sınıfını Oluşturma

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, IEnumerabledöndüren bir GetPeople yöntemi ile bir DataAccess sınıfına geçer. Başlangıçta, dönüş değeri üç PersonModel örneğiyle doldurulmuş bir Liste olarak belirlenmiştir: Tim Corey, Sue Storm ve Jane Smith.

Understanding Yield In Csharp 3 related to Geleneksel Liste Dönüşü ile DataAccess Sınıfı Oluşturma

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.

Understanding Yield In Csharp 4 related to Geleneksel Liste Dönüşü ile DataAccess Sınıfı Oluşturma

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.

Understanding Yield In Csharp 5 related to Liste ile Bellek Kullanımını Gösterme

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 IEnumerableolması gerektiğini ve List kullanmanın ertelenmiş yürütme amacını boşa çıkaracağını netleştiriyor.

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.

Understanding Yield In Csharp 6 related to Hata Ayıklama: Derleyici Yield için Nasıl Kod Üretir

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 IEnumerableGetPrimeNumbers() yöntemi oluşturur. Bu sonsuz döngüde, Tim asal sayıları kontrol etmek için bir yardımcı IsPrimeNumber(int number) fonksiyonu kullanır. Sayı asal ise, yield return number kullanarak onu yayar.

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.

Hero Worlddot related to Yield'e C# ile Giriş - Nedir, nasıl kullanılır ve ne zaman faydalıdır
Hero Affiliate related to Yield'e C# ile Giriş - Nedir, nasıl kullanılır ve ne zaman faydalıdır

Sevdiğiniz Şeyleri Paylaşarak Daha Fazla Kazanın

.NET, C#, Java, Python veya Node.js üzerinde çalışan geliştiriciler için içerik oluşturuyor musunuz? Uzmanlığınızı ek gelire dönüştürün!

Iron Destek Ekibi

Haftanın 5 günü, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara