6 Eylül 2011 Salı

C# yield Operatörü

Bir önceki makalemizde foreach iterasyonu sırasında arka planda ne gibi işlemlerin yapıldığını ayrıntısı ile incelemiştik. foreach iterasyonunun yapılmasına olanak sağlayan interface IEnumerable'dır. Bu interface, uygulandığı sınıfa GetEnumerator adlı bir metot kazandırır ve bu metot geriye IEnumerator interface’ini implement eden bir sınıf döndürür. İşte yield operatörü burada devreye girmektedir ve bir önceki örnekte yazdığımız Numerator sınıfını yazmaktan bizi kurtarır. Örneğimiz bir önceki makalemiz ile aynı olacak. Sadece son adımdaki Numerator sınıfını yazmayacağız.

class Urun

    {

        private int _id;

        private string _ad;

        private double _fiyat;

 

        public int Id

        {

            get { return _id; }

            set { _id = value; }

        }

 

        public string Ad

        {

            get { return _ad; }

            set { _ad = value; }

        }

 

        public double Fiyat

        {

            get { return _fiyat; }

            set { _fiyat = value; }

        }

 

        public Urun(int id, string ad, double fiyat)

        {

            Id = id;

            Ad = ad;

            Fiyat = fiyat;

        }

    }

class Dukkan : IEnumerable

    {

        private Urun[] _urunSepeti;

 

        public Urun[] UrunSepeti

        {

            get { return _urunSepeti; }

            set { _urunSepeti = value; }

        }

 

        private Urun[] UrunleriGetir()

        {

            return new Urun[]

            {

                new Urun(1, "Monitor", 200),

                new Urun(2, "Klavye", 80),

                new Urun(3, "Mouse", 40)

            };

 

        }

 

        public Dukkan()

        {

            UrunSepeti = UrunleriGetir();

        }

 

        public IEnumerator GetEnumerator()

        {

            throw new NotImplementedException();

        }

    }

işte bu aşamadan sonra işimiz gayet kolay. yield operatörü sayesinde, bizim için yazması zahmetli olan Numerator sınıfını yazmamıza gerek kalmadı. Şimdi, GetEnumerator metodunun içini aşağıdaki gibi değiştirelim.

public IEnumerator GetEnumerator()

        {

            for (int i = 0; i < UrunSepeti.Length; i++)

                yield return UrunSepeti[i];

        }

Burada return edilen ifade, IEnumerator interface’i ile gelen Current property’sinde return edilen ifade ile aynıdır. Artık Dukkan tipinden bir nesne içerisinde foreach ile iterasyon yapabiliriz.

class Program

    {

        static void Main(string[] args)

        {

            Dukkan urunler = new Dukkan();

 

            foreach (Urun urn in urunler)

            {

                Console.WriteLine(urn.Ad);

            }           

        }

    }

Alacağımız ekran görüntüsü bir önceki örnek ile aynı olacaktır.

Untitled

Bu örnekte yield operatörü yardımı ile, Numerator sınıfına gerek kalmadan kolay bir şekilde iterasyon yapabildğimizi görmüş olduk. yield operatörü, bizim için  gerekli olan Numerator sınıfını otomatik olarak oluşturmaktadır.

Faydalı olması dileğiyle…



0 yorum:

Yorum Gönder