C# Yield Sözcüğü (Yield Keyword)

C# 2.0 ile birlikte gelmiş olup iterasyon işlemlerini daha kısa ifadelerle oluşturmayı sağlar. Foreach() metodu gibi IEnumerable türündeki bir metodun foreach yöntemiyle hangi değerleri döndüreceği, yield anahtar sözcüğüyle belirlenir. Böylece her iterasyon için farklı bir değer gönderme imkanına sahibiz. Yield sözcüğü, “return” veya “break” ifadesiyle birlikte kullanılır. “return” ifadesi, geriye değer döndürmesini, “break” ifadesi ise o adım için iterasyon yapmamasını sağlar.

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        foreach (int Sayi in Sayilar())
            Console.Write("{0} ", Sayi);

        Console.ReadLine();
    }//Main

    static IEnumerable
<code>0 1 2 3 4 5</code>
Yield anahtar sözcüğü, temelde IEnumerable arabiriminde ileri doğru iterasyon işlemi yaparken her iterasyon adımının değerini saklamak için kullanılan "Current" isimli durum property'sinin neden olduğu yükü hafifletir. Iterasyon işlemlerinde her MoveNext() metodu çalıştırıldığında bir sonraki yield ifadesine geçer. Bu örnekte MoveNext() doğrudan kullanılmak yerine onu temsil foreach kullanılsa da daha önce bahsettiğimiz gibi C# derleyicisi, MSIL tarafında bu döngü yapısını IEnumerator türünde bir class'a çevirecektir.
<img src="http://www.ahmetkaymaz.com/wp-content/uploads/yield_keyword_1.gif"/>
yield sözcüğünü kullanarak her iterasyonda farklı bir değer de döndürebiliriz.
using System;
using System.Collections;

class Program
{
    static void Main()
    {
        foreach (string Kisi in Kisiler())
        {
            Console.WriteLine(Kisi);
        }

        Console.ReadLine();
    }//Main

    static IEnumerable Kisiler()
    {
        yield return "Ahmet";
        yield return "Zeynep";
    }//Kisiler

}//Program

Ahmet
Zeynep

Aynı şekilde yield sözcüğünü IEnumerable arabiriminden gelen GetEnumerator() metodunu implement etmiş bir class için de kullanabiliriz.
using System;
using System.Collections;

class Program
{
static void Main()
{
Kisiler oKisiler = new Kisiler();
foreach (string Kisi in oKisiler)
{
Console.Write(“{0} “, Kisi);
}

Console.ReadLine();
}//Main

}//Program

public class Kisiler : IEnumerable
{
string[] ArrKisi = { “Ahmet”, “Zeynep”, “Mehmet” };

public IEnumerator GetEnumerator()
{
for (int x=0; x
Ahmet Zeynep Mehmet
Yield sözcüğü ile iterasyon işlemi yaparken bazı adımlarda döngüden çıkması için “yield break” ifadesi kullanılır. Aşağıdaki metod geriye “0 1 2 3” değerlerini döndürecektir.
static IEnumerable

C# Yield Sözcüğü (Yield Keyword)” üzerine bir düşünce

  1. Murat Başeren

    Merhaba Ahmet Bey;\”yield\” keyword\’ünü anlamak gerçekten benim için zor oldu. Ne işe yaradığını tam olarak kafamda canlandıramadım.Makaleniz bu konuda gerçekten yardımcı oldu. Kafama takılan birkaç soru var.IEnumerable interface\’ini ne amaçla kullanabiliriz? Yani bir dizi yada list nesnesi içinde zaten foreach ile ya da for ile dönebiliyoruz. Burada IEnumerable döndüren bir metod ile list\’e ya da array\’e müdahale etmek istedik diyelim. Sizin yukarıdaki son örnekte yaptığınız gibi. Bunu IEnumerable döndüren bir metod içinde değil de main metodunuzdaki for içinde de kısıtlayabiliriz. Bu sebeple neden bir daha IEnumerable döndüren bir metod oluşturalım.Tam olarak nerede kullanabileceğimizi sanırım pek anlayamadım. :) Diziler ve list nesneleri içinde kullanılmış aslında bu yeterli bir cevap gibi ama bizim projelerimizde kullanabileceğimiz bir yapı kafamda kuramadım.

    Cevapla
  2. Ahmet Kaymaz Yazar

    Konunun cevabını C# kitabımın 1.cildinden olduğu gibi aktarıyorum. Numaratör olarak tanımlanabilecek IEnumerable, koleksiyon sınıflarında ileri iterasyon kurma yöntemiyle elemanlar arasında gezmemizi sağlayan arabirimdir. for-each yöntemiyle döngülemeye izin verecek liste sınıfları, bu arabirimi miras (inherit) almalıdır. Nitekim bu yönüyle tüm koleksiyon sınıfları bu arabirimi gerçek-lemiştir. Bu arabirimin GetEnumerator() isimli tek yordamı bulunur. GetEnumerator() yordamı, geriye IEnumerator arabirimi türünde bir numaralan-dırma nesnesi döndürür. Bu nesne aracılığıyla liste elemanları döngüye sokulabil-mektedir. IEnumerator arabirimi Reset(), MoveNext() isminde iki adet soyut yordam ve Current isminde bir özellik içerir.

    Cevapla
  3. veli

    yield break örneği yeterince açıklayıcı olmamış. Yield key word’ünü kullansak da kullanmaksak da aynı çıktı oluşuyor.

    Cevapla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.