Temsilci(Delegate) Kavramı 1

Yazar: Sinan BARAN
Kategori: .NET Framework
Eklenme Tarihi: 19.8.2009 11:15:23



   Delegate, nesneler arası haberleşmeyi sağlamak, haberleşmeyi sağlayan yapının daha üst seviyede  olmasını ve daha az kod yazmamızı mümkün kılar. Akla gelen soru, Peki Delege olmadan olmaz mı? Tabi ki olur daha fazla kod yazarak bu işi halledebilirsiniz.

Delegate, nesneler arası haberleşmeyi sağlamak, haberleşmeyi sağlayan yapının daha üst seviyede  olmasını ve daha az kod yazmamızı mümkün kılar. Akla gelen soru, Peki Delege olmadan olmaz mı? Tabi ki olur daha fazla kod yazarak bu işi halledebilirsiniz.

Delegate .NET içerisinde önemli bir yere sahiptir.Kuşkusuz ilerliyen kısımlarda göreceğiz.

Delegate hakkında biraz daha açılım yapacak olursak  tetikçidir. Kendisine  hedef veya hedefler eklenebilir  ayni zamanda kendisine verilen  hedef veya hedefler çıkartılabilir, alınacak kararlar için önceden hazırlıklı olmak gerekmez.

Not: Delegate tanımlamaları işlem görülecek method ile ayni türden olmalıdır. Aldığı parametreler ve geriye dönüşdeğeri

Delegate tanımı,

<Erişim Belirleyicisi>  delegate  <Geri dönüş tipi> <Temsilci ismi>(Varsa parametre);                                                                                      

publicdelegate void BildigimDilDelegate();

publicdelegate int ToplamaDelegate(int sayi1,int sayi2);

 

2 farkli delege tanimi yaptik.Geriye deger dönderen ve dondermeyen.Parametre alan ve almayan.

 

 

Ornek  bir uygulama ile basliyacak olursak.

 

publicpartial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        //Olusturmus oldugum delege kullanmak istedigim methodla ile ayni ozelliklere sahiptir.

        //Tetikci

        public delegate void BilgiDelegate();

        public BilgiDelegate BilgiHavuzu;

        //Görev 1

        void Adi()

        {

            MessageBox.Show("Sinan");

        }

        //Görev 1

        void WebSite()

        {

            MessageBox.Show("https://www.sinanbaran.com");

        }

        private void button1_Click(object sender, EventArgs e)

        {

            BilgiHavuzu += new BilgiDelegate (Adi);

            BilgiHavuzu += new BilgiDelegate (WebSite);

            //Buraya kadar olan kisimda +=  ile tetiklenmesi gereken methodlar Eklendi.Artik 2 Method sirasi ile calisacaktir.

            BilgiHavuzu -= Adi; 

            //-= ile icerisindeki method cikartildi.

            //Burada Adi Methodu ,gorevler arasindan cikartilmistir.

            BilgiHavuzu.Invoke(); 

            //Invode Methodu ile tetikciye verilen gorevleri harekete gecirdik.

        }

    }

 

Aslinda yukaridaki örnekte delegeler neden kullaniliyor amaci tam olarak verilmedi.Sadece bir delege nasil olusturuluyor ve bir delegeye yapilmasi gereken işler nasil veriliyor yada nasil cikartiliyor bunu gostermekteti amac.Simidi delege’yi neden kullaniyoruz sorusuna cevap veren ornegimizi yapalim.

 

 

Örnek uygulama , Bildigimiz yazilim dillerini soran coklu secim yapilabilecek bir aneket yapalim.C#,Java,Pascal,Delphi  her bir dil kendi methodu ile  cevap versin.Peki Secmis Oldugum diller arka tarafta nasil dinamik olarak tetiklenicek? Sorusu devaminda….

 


Tasarim sekildeki gibidir.

 

 

 

  public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        public delegate void BilgiDelegate ();

        private BilgiDelegate Diller;

        private void button1_Click(object sender, EventArgs e)

        {

            if (Diller != null)

            {

                Diller.Invoke();

            }

        }

        public void Csharp()

        {

            MessageBox.Show("C#");

        }

        public void Delphi()

        {

            MessageBox.Show("Delphi");

        }

       

        public void Pascal()

        {

            MessageBox.Show("Pascal");

        }

        public void Java()

        {

            MessageBox.Show("Java");

        }

        private void cCsharp_CheckedChanged(object sender, EventArgs e)

        {

            if (cCsharp.Checked)

            {

                Diller += new BilgiDelegate (Csharp);

            }

            else

            {

                Diller -= Csharp;

            }

        }

 

        private void cJava_CheckedChanged(object sender, EventArgs e)

        {

            if (cJava.Checked)

            {

                Diller += new BilgiDelegate (Java);

            }

            else

            {

                Diller -= Java;

            }

        }

 

        private void cPascal_CheckedChanged(object sender, EventArgs e)

        {

            if (cPascal.Checked)

            {

                Diller += new BilgiDelegate (Pascal);

            }

            else

            {

                Diller -= Pascal;

            }

        }

 

        private void cDelphi_CheckedChanged(object sender, EventArgs e)

        {

            if (cDelphi.Checked)

            {

                Diller += new BilgiDelegate (Delphi);

            }

            else

            {

                Diller -= Delphi;

            }

        }

    }

Diller delegesini bir havuz gibi düşünebilirsiniz . CheckBox'larin Checked’larını kontrol ederek diller havuzuna secili methodlari  ekleyip cikartabiliyorum,yani uygulamada dinamik bir sekilde methodlari tetikletebildim.Gereksiz gere kod yazmamin önüne gectim.Karar yapilarindan kurtardı.Uygulamayi daha iyi anliyabilmek icin birde delege kullanilmadan yapmaya calisin.(Tabi Butun olasılıkları düşünerek gereğinden fazla method olusturmakla basliyabilirsiniz.)

 

Evet Delegate hakkında  ufak bir girişyaptik.Devami geliyor.(Bir Sonraki makalede Delegate içerisindeki method kullanimlari ve Asenkron delegelere değineceğim)

 

sinan.baran@bilgeadam.com

www.sinanbaran.com


Sinan BARAN

Sinan BARAN 2007 yılından itibaren .Net teknolojisi ile çalışmalarda bulunmaktadır.Birçok  orta ve ileri düzey projelerde yeralmıştır.Sinan BARAN şu anda BilgeAdam Bilgi Teknolojileri Akademisinde Yazilim Eğitmeni olarak çalişmaktadır.

ahmet canik - 4.2.2011 1
void btnKontrol_Click(object sender, EventArgs e) { if (chkJava.Checked) MessageBox.Show("java"); if (chkDelphi.Checked) MessageBox.Show("delphi"); } bu da bütün işi görüyor bu kadar koda ne gerek var. hem fazla kod yazmaya gerek yok demişsiniz hemde bir sürü gereksiz kod var delege v.s. çokta amacına ulaşan bir örnek olmamaış bence

Yusuf KARAOĞLAN - 29.7.2010
konu hakkında bilgi verdiğin için çok teşekkür ederim.

sinan - 21.8.2009
Ellerine sağlık çok güzel anlatmışsın. Devamını bekliyoruz.

Yorumunuz