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

C#, VB.NET, ASP.NET Add comments

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 Sayilar()
    {
        for (int x = 0; x <= 5; x++)
            yield return x;
    }//Sayilar

}//Program

0 1 2 3 4 5

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.

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< ArrKisi.Length; x++)
            yield return ArrKisi[x];
    }//GetEnumerator

}//Kisiler

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 Sayilar()
{
    for (int x = 0; x <= 5; x++)
    {
        if (x > 3)
            yield break;
        yield return x;
    }
}//Sayilar

2 Responses to “C# Yield Sözcüğü (Yield Keyword)”

  1. Murat BaÅŸeren Says:

    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.

  2. Ahmet Kaymaz Says:

    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.

Leave a Reply


− 8 = 0

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS GiriÅŸ