Delegeler
Delegeler, .Net içerisinde önemli bir yere sahip olan, herhangi bir Class içerisinde yazilmis olan methodlari kolayca çagirabilmek için kullanilan bir yöntemdir. Delegeler konusunu yeni ögrenen birinin aklinda genel olarak su soru vardir? Neden delege? Delegesiz olmaz mi? Tabii ki olur. AMA…
Yemek yapilacak! ve herhangi bir yemegi yapma sürecinde 20 farkli is olabilecegini düsünün. Kimi yemek 1, 3, 5, 7, 17 . adimlarla piser, kimi yemek 11,15,13,10,20,19. Adimlarla piser(Bu adimlarin sizin projenizdeki methodlar oldugunu düsünün). Iste Delegelerin en fazla kullanim alanlarindan birisi budur. Methodlarinizi ayni anda istege bagli çalistirmaktir. Istenildigi zaman yeni methodlar eklemek ve bir YAPILACAKLAR LISTESI olusturmak, istenildigi zaman mevcut methodlari YAPILACAKLAR LISTESInden çikarmak.
Peki bu islem Delegesiz olmaz miydi? Tabii ki olurdu ama her islemde yapilacak islemleri ayri ayri, alt alta yazmaniz gerekirdi. Yani Delegeler Kullanim kolayligi da olusturur.
Delegeleri anlama konusunda sikinti çektiginiz anda yukaridaki açiklamalari tekrar okuyunuz.
Basit Delege Tanimlamalari (Delegelerle Method Çagirmak)
Bir adet Windows Form Projesi olusturunuz ve projenize bir adet KullaniciBilgileri.cs isimli bir Class ekleyiniz. Asagidaki Kodlari ekleyiniz.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; //Sizde Ekleyiniz… namespace WindowsFormsApplication15 { class KullaniciBilgileri { //Degiskenler tanimlandi… public string adi = “Mehmet Salih Deveci”; public string email = “[email protected]”; public string sehir = “Şanlıurfa”; //3 Adet Parametresiz Method tanimlandi… public void AdGetir() { MessageBox.Show(adi); } public void EmailGetir() { MessageBox.Show(email); } public void SehirGetir() { MessageBox.Show(sehir); } public delegate void KullaniciBilgileriGetir(); public KullaniciBilgileriGetir YavruDegisken; } } |
Burada;
public delegate void KullaniciBilgileriGetir(); ile delege olusturmaya dair imza olusturuldu. Imzayi anlamak önemli…
Public – Diger Classlardan ulasilabilmeyi saglar.
Delegate – Delege olusturuldu.
void KullaniciBilgileriGetir(); – Class içerisinde parametresiz ve Prosedür olan methodlar için delege olusturulacagi anlamina gelir. Eger parametremiz olsa idi parantezler() içerisine veri türünü de yazmamiz gerekirdi.
public KullaniciBilgileriGetir YavruDegisken; ile Delegemize yavru degiskenle ulasabilmeyi amaçliyoruz.
Formunuza bir adet buton ekleyiniz ve butonun Click eventine geliniz. Delegemizi kullanalim.
KullaniciBilgileri yeni = new KullaniciBilgileri(); private void button1_Click(object sender, EventArgs e) { yeni.YavruDegisken = yeni.AdGetir; yeni.YavruDegisken(); } |
Burada;
KullaniciBilgileri yeni = new KullaniciBilgileri(); ile Classimiza ulasabilmek için yavru degisken türettik.
yeni.YavruDegisken = yeni.AdGetir; ile delegemizin kullanacagi methodu belirledik. Kullanimina dikkat ediniz.
yeni.YavruDegisken(); ile delegeyi, daha dogrusu delegenin temsil ettigi methodu çalistiriyoruz.
Delegeler ile Methodlarimizi Toplamak – Çikarmak
Delegeler ile methodlarinizi toplayip çikararak konunun en basinda anlattigim yemek tarifine benzer yapilar olusturabilirsiniz. Çok daha güzel,kolay ve nesnel olmaz mi?
Simdi Formunuza 3 adet daha buton ekleyip 3 butondan herhangi birinin Click eventine ve daha sonra digerlerine asagidaki kodlari yaziniz. Sirasiyla butonlara tiklayiniz.
//Sadece AdGetir isimli method çalisir. private void button2_Click(object sender, EventArgs e) { yeni.YavruDegisken += yeni.AdGetir; yeni.YavruDegisken(); } //Hem AdGetir hem de EmailGetir methodlari çalisir. Çünkü methodlar toplandi. { yeni.YavruDegisken += yeni.EmailGetir; yeni.YavruDegisken(); } //Sadece EmailGetir methodu çalisir. Çünkü AdGetir Methodu çikarildi. private void button4_Click(object sender, EventArgs e) { yeni.YavruDegisken -= yeni.AdGetir; yeni.YavruDegisken(); } |
Delegeler ile Kontrollere Ait Eventlere Eklemeler Yapmak
KullaniciBilgileri.Cs Classiniza asagidaki kodu ekleyiniz
public void EklemeYap(object Gonderen,EventArgs deger) { MessageBox.Show(“Bu kisim sonradan eklendi…”); } |
Formunuza Load eventine asagidaki kodu ekleyiniz.
private void Form1_Load(object sender, EventArgs e) { button2.Click += yeni.EklemeYap; } |
Bu sekilde Buton1’in Click eventi ne yaparsa ardindan EklemeYap isimli method çalisir.
Diger yazilarimda görüsmek üzere.
Mehmet Salih Deveci