yield break ve Erken Sonlandırma
Yinelemeyi koşullu olarak durdurun.
yield break ve Erken Sonlandırma, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Yineleyiciyi Erken Durdurma
Bazen bir yineleyicinin doğal sona ulaşmadan değer üretmeyi bırakmasını istersiniz. yield break ifadesi, yineleyiciler için return gibi diziyi hemen sonlandırır.
Temel yield break Kullanımı
yield break yineleyiciyi sonlandırır. Başka değer üretilmez ve onu tüketen foreach döngüsü sona erer.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> UpToFive()
{
for (int i = 1; i <= 100; i++)
{
if (i > 5) yield break;
yield return i;
}
}
public static void Main()
{
foreach (var n in UpToFive())
Console.WriteLine(n);
}
}Koşul Sağlandığı Sürece Alma
Yaygın bir yaklaşım, koşul doğru olduğu sürece öğeleri üretmek ve ardından durmaktır. yield break bunu temiz bir şekilde yapar.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> WhileSmall(IEnumerable<int> nums)
{
foreach (var n in nums)
{
if (n >= 10) yield break;
yield return n;
}
}
public static void Main()
{
foreach (var n in WhileSmall(new[] { 2, 4, 8, 12, 3 }))
Console.WriteLine(n);
}
}yield break ile Koruma Koşulları
Bir yineleyicinin başında yield break ifadesini bir koruma olarak kullanabilirsiniz. Girdi boş veya geçersizse hiçbir öğe döndürmeyin.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
static IEnumerable<string> Lines(string text)
{
if (string.IsNullOrEmpty(text)) yield break;
foreach (var line in text.Split('\n'))
yield return line;
}
public static void Main()
{
foreach (var l in Lines("a\nb\nc"))
Console.WriteLine(l);
Console.WriteLine("empty count: " + Lines("").Count());
}
}Çıktı Sayısını Sınırlama
Uzun bir kaynaktan okurken bile yineleyicinin ürettiği öğe sayısını sınırlamak için bir sayaç ile yield break kullanın.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Take(IEnumerable<int> source, int max)
{
int count = 0;
foreach (var item in source)
{
if (count++ >= max) yield break;
yield return item;
}
}
public static void Main()
{
foreach (var n in Take(new[] { 1, 2, 3, 4, 5 }, 3))
Console.WriteLine(n);
}
}Çağıranın break Kullanması ve yield break
Bir dizinin sona ermesinin iki yolu vardır. Çağıran, break ile değer istemeyi bırakabilir veya yineleyici, yield break ile üretmeyi durdurabilir. Her ikisi de döngüyü sona erdirir, ancak farklı nedenlerle.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Counting()
{
int i = 1;
while (true) yield return i++;
}
public static void Main()
{
// Caller decides to stop with break
foreach (var n in Counting())
{
if (n > 3) break;
Console.WriteLine(n);
}
}
}yield break Yalnızca Geçerli Yineleyiciyi Sonlandırır
yield break, çağırandaki dış döngüden değil, bulunduğu yineleyici yönteminden çıkar. Denetim, numaralandırmayı yapan koda geri döner.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Bounded(IEnumerable<int> nums, int limit)
{
foreach (var n in nums)
{
if (n > limit) yield break; // ends Bounded only
yield return n;
}
}
public static void Main()
{
var result = Bounded(new[] { 1, 2, 9, 3 }, 5);
Console.WriteLine("iterator created, still running");
foreach (var n in result) Console.WriteLine(n);
}
}yield break Sonrasında yield return Yoktur
yield break yürütüldüğünde yineleyici tamamlanır. Aynı yoldaki fiziksel olarak sonrasında bulunan hiçbir kod değer üretemez.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Demo(bool stopEarly)
{
yield return 1;
if (stopEarly) yield break;
yield return 2;
yield return 3;
}
public static void Main()
{
Console.WriteLine("stopEarly = true:");
foreach (var n in Demo(true)) Console.WriteLine(n);
Console.WriteLine("stopEarly = false:");
foreach (var n in Demo(false)) Console.WriteLine(n);
}
}Filtreleme ve Erken Durdurmayı Birleştirme
Aynı yineleyicide filtreleme yapıp sonlandırabilirsiniz: bazı değerleri atlayın, diğerlerini üretin ve bir sonlandırıcı değerle karşılaştığınızda tamamen durun.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> UntilZero(IEnumerable<int> nums)
{
foreach (var n in nums)
{
if (n == 0) yield break; // stop at sentinel
if (n < 0) continue; // skip negatives
yield return n;
}
}
public static void Main()
{
foreach (var n in UntilZero(new[] { 3, -1, 5, 0, 9 }))
Console.WriteLine(n);
}
}yield break ve finally Blokları
Yineleyicinizde bir try/finally varsa yield break diziyi sonlandırdığında finally yine çalışır. Bu, kaynakları kapatmak gibi temizlik işlemlerinin yapılmasını garanti eder.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> WithCleanup()
{
try
{
yield return 1;
yield break;
}
finally
{
Console.WriteLine("cleanup ran");
}
}
public static void Main()
{
foreach (var n in WithCleanup())
Console.WriteLine(n);
}
}Kendiniz Deneyiniz
Süzme ve erken sonlandırmayı birleştiriniz: pozitif sayıları üretiniz, ancak bunların birikimli toplamı bir bütçeyi aştığında tamamen durunuz.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> WithinBudget(IEnumerable<int> nums, int budget)
{
int spent = 0;
foreach (var n in nums)
{
if (n <= 0) continue;
if (spent + n > budget) yield break;
spent += n;
yield return n;
}
}
public static void Main()
{
foreach (var n in WithinBudget(new[] { 3, -2, 4, 5, 1 }, 10))
Console.WriteLine(n);
}
}Hızlı Kontrol
yield break'in rolünü hatırlayınız.
Özet
yield break bir yineleyiciyi erken sonlandırır.
- Yineleyiciler için değer döndürmeyen bir
returngibi çalışır. - While-al mantığı, korumalar ve sayı sınırları için kullanınız.
- Yalnızca yineleyiciyi sonlandırır, çağıran döngüyü sonlandırmaz.
finallyblokları yine çalışır ve temizlik işlemlerini garanti eder.
Sıkça Sorulan Sorular
“yield break ve Erken Sonlandırma” dersi ücretsiz mi?
Evet — “yield break ve Erken Sonlandırma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“yield break ve Erken Sonlandırma” dersinde ne öğreneceğim?
Yinelemeyi koşullu olarak durdurun. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“yield break ve Erken Sonlandırma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- yield return ile Yineleyici Yöntemleri
- yield break ve Erken Sonlandırma
- Tembel Değerlendirme Anlambilimi
- Özel Enumerable'lar