C#’ta Iterator Kavramı ve yield Anahtar Sözcüğü
Merhaba,
C#’ta türlü türlü komutlar mevcuttur. Bazıları doğal olarak ilk etaplarda fazla kullanım alanını sezdirmeselerde, dile olan aşinalık ilerledikçe mantığını ve varlığını daha net anladığımız keywordlerin değeri artmaktadır. Dilin gramer mantığını aşabilen yahut tam çizgisinde seyreden bu komutlar aracılığıyla şahsen yaptığımızın işin daha çok lezzetine vardığımızı düşünüyorum.
Bu içeriğimizde programlamada Iterator kavramını ele alacağız ve bu kavram kapsamında yield keywordünü irdelemeye çalışacağız.
İterasyon(Iterator) Kavramı
Mantıksal açıdan her tahminin altında iterasyon mantığı devrededir. Örneğin, “1, 3, 5” dedikten sonra “7” diyorsak bu bir iterasyondur. Başka bir örnek vermek gerekirse, f(5) = 10, f(10) = 20 ise f(20) = ? sorusuna 40 cevabını veriyorsanız bu tarz düşünmekte bir iterasyondur.
Dil bilimine göre ise, bir hecenin tekrarlanması(mermer gibi), bir cümlenin içinde bir kelimenin tekrarlanması(“Ağla çoban ağla, ovan kalmadı” gibi) durumları iterasyon çerçevesinde düşünülebilir.
Ee haliyle bilgisayar biliminde ise bir döngüdeki her geçiş, döngü, adım vs. iterasyon kavramıyla açıklanabilir. Yani kısaca çözüme giden her bir adımda iterasyon mevzu bahistir.
Peki C#’ta İterasyon Ne İşe Yarıyor?
Iterator dediğimiz yapılar, diziler yahut koleksiyonlar üzerinde yield anahtar sözcüğü aracılığıyla iterasyon yapmamızı sağlayan yani çözüme gidecek olan adımları oluşturmamızı sağlayan yapılardır.
C#’ta iterator dendiğinde akla foreach döngüsü gelmektedir. Çünkü foreach döngüsü arka planda bir iterator yapısını kullanmaktadır. foreach döngüsü verilen koleksiyon veya dizi içerisindeki elemanları iterator sayesinde tek tek elde etmektedir.
foreach döngüsü, yapısı gereği IEnumerable, IEnumerator, IEnumerable<T> veya IEnumerator<T> arayüzlerinden türemiş elemanlar üzerinde çalıştığını bilmekteyiz. Haliyle iterasyon yaratmak için bu interfaceleri dönüş tipi olarak kullanmalıyız.
yield Anahtar Sözcüğü Nedir? Ne İş Yapar? Nasıl Çalışır?
yield anahtar sözcüğü, foreach bloğuna subroutine yani altyordam muamelesi yapan, güzel bir keyworddür. yield keywordü, aşağıda verilen üç fonksiyonu eğer foreach döngüsünde kullanılacaklarsa özdeş hale getirmiştir.
1. Fonksiyon
static public IEnumerable<string> VerileriGetir()
{
string[] Gunler = { "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar" };
List<string> gunler = new List<string>();
foreach (var Gun in Gunler)
gunler.Add(Gun);
return gunler;
}
2. Fonksiyon
static public IEnumerable<string> VerileriGetir2()
{
string[] Gunler = { "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar" };
foreach (var Gun in Gunler)
yield return Gun;
}
3. Fonksiyon
static public IEnumerable<string> VerileriGetir3()
{
yield return "Pazartesi";
yield return "Salı";
yield return "Çarşamba";
yield return "Perşembe";
yield return "Cuma";
yield return "Cumartesi";
yield return "Pazar";
}
Yukarıda tanımlanmış üç adet fonksiyonun kullanımı,
static void Main(string[] args)
{
foreach (var Gun in VerileriGetir())
Console.WriteLine(Gun);
Console.WriteLine("*************");
foreach (var Gun in VerileriGetir2())
Console.WriteLine(Gun);
Console.WriteLine("*************");
foreach (var Gun in VerileriGetir3())
Console.WriteLine(Gun);
Console.Read();
}

yield keywordünün burada nasıl bir rol aldığını konuşalım.
yield anahtar sözcüğü, IEnumerable, IEnumerator, IEnumerable<T> veya IEnumerator<T> interface tiplerinde değer dönülen durumlarda birden fazla geriye değer döndürebilmektedir. Normal şartlarda var olan bilgimize göre return komutunu yukarıdaki 3. örnekte olduğu gibi kullanamadığımızı biliyoruz. O halde yield keywordünün sihri burada saklı olsa gerek.
Compiler yield anahtar sözcüğünü gördüğü anda bu keywordün bulunduğu bloğun bir iterator bloğu olduğunu algılamaktadır. Bu adımdan sonra foreach döngüsü içerisinde ilgili koleksiyonu dönen metod çağrıldıktan sonra metod içerisindeki bir yield return ifadesine gelinince değer geriye dönülmekte ve bu işlem yapılmadan önce Compiler, iterator metodun kaldığı yeri saklamaktadır. Süreç esnasında foreach döngüsünde iterator metoduna gelen her istekte iterator metot baştan başlamak yerine kaldığı yerden işletilmektedir.
İşte yukarıda gördüğünüz işlem yield keywordü sayesinde bu mantıkla gerçekleşmektedir.
yield anahtar sözcüğünü aşağıdaki gibi iki farklı şekilde kullanabilmekteyiz.
- yield return [value]
- yield break
“yield return [value]” kullanımı ile yukarıdaki örneklendirmemizde olduğu gibi çalışabilmekteyiz. Lakin “yield break” ifadesi ile iterator içerisindeki iterasyonun sona erdiği bilgisi ilgili foreach döngüsüne bildirilmektedir. Aşağıdaki kod parçacığı bu durumu örneklendirmektedir.
static public IEnumerable<string> VerileriGetir()
{
yield return "Pazartesi";
yield return "Salı";
yield return "Çarşamba";
yield return "Perşembe";
yield return "Cuma";
yield return "Cumartesi";
yield break;
yield return "Pazar";
}
static void Main(string[] args)
{
foreach (var Gun in VerileriGetir())
Console.WriteLine(Gun);
Console.Read();
}
“yield break” ifadesinden dolayı ilgili foreach iterasyonun sona erdiğini bilecek ve “Pazar” değerini yazdırmayacaktır.

Son olarak, yield keywordü kullanılan iterator bir metot, foreach için evaluate edilmediği sürece yield komutu ilgili metodu çalıştırmayacaktır.
Örnek olarak tekrar aşağıdaki metodu ele alalım.
static public IEnumerable<string> VerileriGetir()
{
yield return "Pazartesi";
yield return "Salı";
yield return "Çarşamba";
yield return "Perşembe";
yield return "Cuma";
yield return "Cumartesi";
yield return "Pazar";
}
Şimdi aşağıdaki kod bloğunu detaylıca inceleyelim.
static void Main(string[] args)
{
IEnumerable<string> Veriler = VerileriGetir();
foreach (var item in Veriler)
Console.WriteLine(item);
}
Bu örnekte “Veriler” değişkeninin içinde foreach döngüsüne gelmeden önce hiçbirşey olmayacaktır. Ne zaman ki döngüye girilecek, o zaman VerileriGetir metodu çalıştırılacaktır. Yani istemci tarafından ne zaman foreach döngüsüyle çağrılırsa bir anlamda yield lazy loading yapmış olacaktır.
yield anahtar sözcüğü Lazy Loading yapar.
Bu durumu aşağıdaki videodan net bir şekilde izleyebilirsiniz.
Okuduğunuz için teşekkür ederim…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar dilerim…

dostum ‘yield Anahtar Sözcüğü Nedir? Ne İş Yapar? Nasıl Çalışır?’ bu başlıq altındakı 1.Fonksiyon yazısının yanında link var deyəsən səhvən düşüb (http://pastenow.ru/1XIE8)
Merhaba Adil,
İlgili adres makale yazım sürecinde farkında olmaksızın yanlışlıkla yazılmış olsa gerek.
Uyardığın için teşekkürler…
Teşekkürler çok güzel bir anlatım
Makaleleriniz harika. Çok teşekkür ederim harcadığınız emek için.
Ben teşekkür ederim. Faydalandıysanız ne mutlu…
Bir anahtar sözcük bu kadar güzel ve net anlatılamazdı.
Anlatım güzeldi teşekkürler..