C# Delegate & Event Olusturma - SOFTSAM

Breaking

About Software

28.08.2014

C# Delegate & Event Olusturma

Delegate

Delegate bir işlem yapıldığında yada bir olay olduğunda birden fazla metodun çağırılmasında görev alır.
Örneğin bir kullanıcı düğmeye bastığında yada klavyeden bir tuşa dokunduğunda birden fazla metodun çalışmasını isteriz Delegate bu metodların temsilcisidir.
public delegate void DlgtOrnek();
Delegate in tanımı bu şekildedir.Ve bu metodun diğer metodlar gibi içeriği yoktur.Yani  bir metod oluşturduğumuzda küme parantezlerinin içerisine işlenecek kodları yazarız fakat bu metodda bu şekilde bir şey yok.Ve classınızın içinde bir yerde bir olay olduğunda bu metodu çağırabilirsiniz


public void Msj(){ DlgtOrnek(); }
Bir olay oludğunda sanki normal bir metod çağırıyormuş gibi Delegate metodlarıda çağırılabilir.Fakat bir Gövdeye yani kod bloklarına sahip olmadığı için her hangi bir şey yapmaz.eğer içine bir metod konulmuşsa o metodu çalıştırır.

.....
DlgtOrnek dlg=new DlgtOrnek(Msj);
.....
public void Msj(){Console.WriteLine("Merhaba Dünya");}

Birden fazla metodu da tek bir delegate e ekleyebilirsiniz:
......
DlgtOrnek dlgt=new DlgtOrnek(Msj);
dlgt+=new DlgtOrnek(Msj2);
Şu ana kadar Delegate te öğrendiklerimizi bir örnekle pekiştirelim..
namespace Olaylar
{
    class Program
    {
        public Program()
        {
            DlgOrnek dl = new DlgOrnek(Msj);
            dl += new DlgOrnek(Msj1);
            Console.WriteLine("Adını Gir:");
            string msj = Console.ReadLine();
            dl(msj);
        }
        public delegate void DlgOrnek(string msj);
        static void Main(string[] args)
        {
            new Program();
        }
        static void Msj(string mesj)
        {
            Console.WriteLine(mesj+" Bu msj bir :)");
        }
        static public void Msj1(string st)
        {
            Console.WriteLine(st+" Buda herhangi bi metin");
        }
    }

Event

Event'ler dalegate'lere benzer. Ancak daha iyi özelliklere sahiptir. Event'ler genellikle GUI komponentleri için kullanılan bir kavram. Örneğin bir düğmenin tıklanması bir event oluşturur. Veya farenin hareket etmesi, tıklama bu tür "olay"lar bir Event oluştururlar. Aynı şekilde herhangi bir özellikleki değişme için siz bir event oluşturabilirsiniz. Bu event'i dinleyenler event'in oluşundan haberdar olur. Yukarıdaki örneğe göre düşünürsek. Kullanıcının bir sayı girmesi bir event oluşturabilir. Oluşan event dinleyicilere bildirilir.


    class Program
    {
        public Program()
        {
            EventOrnek += Program_EventOrnek;
            EventOrnek += new DlgOrnek(Msj1);
            Console.WriteLine("İsim Gir:");
            string ad = Console.ReadLine();
            EventOrnek(ad);
        }

        void Program_EventOrnek(string msj)
        {
           Console.WriteLine(msj+" Bu msj bir :)");
        }
        public delegate void DlgOrnek(string msj);
        public event DlgOrnek EventOrnek;
        static void Main(string[] args)
        {
            new Program();
        }
        static void Msj(string mesj)
        {
           
        }
        static public void Msj1(string st)
        {
            Console.WriteLine(st+" Buda herhangi bi metin");
        }
    }


Burada iki şekilde event oluşturdum aslında.Event oluştururken farkedeceksiniz ki Eventİsmi+= yazdığınız zaman iki kere tab tuşuna basarsanız sizin için bir tane metod oluşturur ve kullandığınız Class ın ve Olayın ismini verir. Bir diğeri ise Delegate kullanarak tanımladım ve varolan metodları çağırdım...

Bu örnek ile daha önceki örnek arasında fazla bir fark yok.
public event testDelegate testEvent;
şeklinde bir event yaratıyoruz.
testEvent+=new testDelegate(ok);
testEvent+=new testDelegate(ok2);
testEvent+=new testDelegate(ok3);
şeklinde ok,ok2 ve ok3 method'larını kaydediyoruz.
testEvent(Convert.ToInt32(i));
şeklinde çağırdığımız an ok,ok2 ve ok3 method'ları çağrılmış olur.
Genellikle event dalegate method'larının
(object sender,System.EventArgs e)
şeklinde olduğunu görürsünüz. Bu standart bir işlemdir. sender olayın hangi nesne tarafından üretildiği bilgisini verir. Örneğin iki düğmeyi birden dinlediğinizi düşünün. Bir düğmeye tıklanma olayı olduğunda sizin bir method'unuz çağrılsın. Sizin method'unuz hangi düğme tarafından çağrıldığınızı nerden bilebilir. Bunun için object sender paramtresi gösderilir. Diğer bir soru düğmenin üstündeki yazıya ihtiyacınız olduğunda nasıl alabilirsiniz. Veya bir fareye tıklanma olayı oldu. Farenin tıklandığı x,y noktasını nasıl alabilirsiniz. Bunuda EventArgs class'ını extend eden bir class ile yapabilirsiniz. EventArgnesnesinden gerekli bilgileri alınabilir.

Yukarıdaki örnekler sadece konunun anlaşılması içindir. Aslında olayı dinleyen ile yayınlayan aynı class olmaz. Bizim örneklerimizde hep Event yaratan class aynı zamanda event'i dinliyordu. ok,ok2 ve ok3 methodları başka bir class'ta olması gerekir. Ancak bunu kolayca yapabilirsiniz. Çok bir şey değiştirmeye gerek yok.

Yazar: Reha Gönüllü
Yazara anlatımından dolayı teşekkürlerimizi sunuyoruz.

Hiç yorum yok:

Yorum Gönder