8 Nisan 2014 Salı

Delegate ve Event Kullanımı

Delegate(Temsilci) Nedir?

Temsilciler bir veya birden çok metodu gösteren referans türünden nesnelerdir. 

Delegate kullanımı 3 aşamada gerçekleşir
1.Tanımlama
2.Örnekleme (Instance)
3.Çağırma

Örnek
class Program
    {
       public delegate void islemler(int x, int y);

        static void Main(string[] args)
        {
            islemler operation = new islemler(Carp);
            operation += new islemler(Topla);
            operation(5, 3);
            Console.ReadLine();  
        }


        static void Carp(int x, int y)
        {
            Console.WriteLine("Çarpma sonucu : {0} ", x * y);
        }

        static void Topla(int x, int y)
        {
            Console.WriteLine("Toplama sonucu : {0} ", x + y);
        }

    }


1.Tanımlama


<Erişim Belirleyicisi> delegate <Dönüş Tipi> Delege_İsmi(parametreler);

public delegate void islemler(int x,int y);

2. Örnekleme


islemler operation = new islemler(Carp);
operation += new islemler(Topla);


buradaki Carp ve Topla birer metoddur ve oluşturduğumuz temsilcimizin imzasına uygundur. Yani int tipinde 2 tane parametre alır ve geriye hiç bir değer döndürmezler.

bir temsilciye birden fazla delegate tanımlarsak işleniş sırası FIFO (İlk giren ilk çıkar) mantığında olur. Yani burda ilk olarak Carp metodu ve ardından Topla metodu çalışacaktır.

bir temsilciye  += operatörü ile metod atayabileceğimiz gibi -= operatörü ile de atadığımız metodu çıkarabiliriz.

3.Çağırma


operation(5, 3);

Delegate üzerinden fonksiyonları çağırdığımız zaman delaget ’in Invoke() metodunu çağırmış oluruz.
Yani “operation(5,3)” ifadesi, “operation.Invoke(5,3)” metodunu çalıştırır.

Invoke ; çalışma sırasında nesnelere erişimi sağlamak ve değişiklik yapmak için nesnenin hafızada bir kopyası oluşturulur, değişiklik yapılır ve eskisi ile değiştirilir.


Event(Olay) Nedir?

Olayları görsel programlamada farkında olmadan kullanırız. Örneğin Butona tıklanması, Klavyeden bir tuşa basılması, Mouse'u hareket ettirmek vs. bunların hepsi birer olaydır.

Temsilciye tanımladığımız metodları çalıştırmak için temsilciyi açık bir şekilde başlatmamız gerekir. Yukarıdaki örnekteki operation(5, 3) de olduğu gibi. Ancak bazı durumlarda biz başlatmasak da metodun kendiliğinden çalışmasını isteyebiliriz. Mesela stok takip programında bir ürünün miktarının belli bir limitin altına düştüğünde. İşte bu gibi durumlarda Event kullanmamız gerekir. Şimdi bir örnek üzerinden açıklayalım. Örneğimizde 1000 lt su kapasitesi olan bir su deposu taştığında Ekrana "Depo Taştı" yazısını yazmak istiyoruz.

class Program
    {
        public delegate void depoEventHandler();
        public static event depoEventHandler depoEvent;

        public class Depo
        {

            private int suseviyesi = 0;

            public int SuSeviyesi
            {
                get { return suseviyesi; }
                set
                {
                    suseviyesi = value;
                    if (suseviyesi > 1000 && depoEvent != null)
                        depoEvent();
                }
            }
        }

        static void Main(string[] args)
        {
            depoEvent += new depoEventHandler(Doldu);

            for (int i = 0; i < 1250; i += 200)
            {
                Depo t = new Depo();
                t.SuSeviyesi = i;
                Console.WriteLine("{0}", i);
                Thread.Sleep(1000);
            }

        }

        static void Doldu()
        {
            Console.WriteLine("Depo Taştı");
        }

    }

1. Adım=> Temsilcimizi tanımlıyoruz.

public delegate void depoEventHandler();

Olayla bağlantıda bulunacak delegatetin ismine dikkat ederseniz EventHandler yazdık. Bu kural olmamakla beraber programcılıkta standart bir yazım şeklidir. Bu yazıma uymasanız hata almazsınız ama programlamada belirli bir standartı yakalamak istiyorsanız bu şekilde kullanmanızı tavsiye ederim.

2.Adım=> Olayımızı tanımlıyoruz

 public static event depoEventHandler depoEvent;

Olay tanımlarken olay isminden önce temsilcimizi yazıyoruz. Böylece olay gerçekleştiğinde çalıştırılması gereken metod yapısını oluşturduğumuz depoEventHandler isimli temsilcimizin belirleyecektir.

3.Adım=>Olayımızı tetikliyoruz.

        public class Depo
        {

            private int suseviyesi = 0;

            public int SuSeviyesi
            {
                get { return suseviyesi; }
                set
                {
                    suseviyesi = value;
                    if (suseviyesi > 1000 && depoEvent != null)
                        depoEvent();
                }
            }
        }
Depodaki su seviyesini belirten bir propertimiz var ve bu propertimizin (SuSeviyesi) her değiştiğinde değerin 1000 i geçip geçmediğini kontrol ediyoruz. burdaki if in içeriğindeki depoEvent != null ifadesi olayımıza bir metod atanıp atanmadığını kontrol ediyor. Eğer su seviyesi 1000 lt den büyükse işte o zaman olayımız gerçekleşmiş demektir ve olayın belirttiği metod çalışacaktır.

4.Adım => Olayın yüklenmesi

 depoEvent += new depoEventHandler(Doldu);

Sonuc:


Hiç yorum yok:

Yorum Gönder