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.
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.
Yani “operation(5,3)” ifadesi, “operation.Invoke(5,3)” metodunu çalıştırır.
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.
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