Delege, 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.
Delege 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
Delege tanımı,
<Erişim Belirleyicisi> delegate <Geri dönüş tipi> <Temsilci ismi>(Varsa parametre);
public delegate void BildigimDilDelegate();
public delegate 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.
public partial 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(“SALİH DEVECİ“);
}
//Görev 1
void WebSite()
{
MessageBox.Show(“https://www.salihdeveci.wordpress.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’larini 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.)