Event Kavrami
Not : Bu yazıyı okumadan önce mutlaka delege kavramını ve anonim metot kavramını öğrenmemiz gerekmektedir.
Event kullanımı ile delegeleri biraz daha fonksiyonel kullandığımızı söyleyebiliriz,bu bakış açımız ile birlikte bir kazanç olarak
görülebildiği gibi , gereksiz bile görülebilir.
Olay güdümlü programlamada , dikkatimizi çeken en iyi nokta işletim sisteminin tepkileridir,ve bu noktada eğer ki kendi programımızı geliştirme
uğraşlarımızı var ise ,daha bir dikkat çekici de olabiliyor.
Örneğin ;
Windows Forms üzerinde , boş bir tasarımda 1 tane Button kontrolünü form üzerine koyalım ve bu butonun arka planında Click Event’ına kodlarımızı yazarız
genellikle bu kod bölümünün yoğun kullanımına şahit olmakla birlikte,biz örnek olarak basit bir kod parçasından bahsedeceğiz
MessageBox.Show(“Merhaba Kenan”);
bu kod parçası çalıştığında bize ekran içerisinde bir mesaj kutusu gösterecektir,tıklama olayı gerçekleştiğinde,fakat dikkat etmemiz bizim için asıl noktada
bu kodun çalışmasından hemen önce gerçekleşiyor,Event’lar delegeler ile çalışıyor ise, ve delegelerde metotları çalıştırmakla görevli birer işaretçi olarak
değerlendirildiğinde tıklanma olayı , arka planda gizli duran EventHandler delegesini tetiklemiş demektir,bu tetikleme sonucu butonun Click metodu çalışır ve kodlar
icra edilir ,aynı anda sistemde basılı butonu fark edecek butonun görünümü üzerinde sanki resim1 deki buton gidip resim2 deki buton gelmişcesine
bir etkiyi meydana getirecektir.
Şimdi son olarak yoğunlaşalım ki biz butona tıkladığımızda,click metodunda yazılan mesaj kutusu işlemi gerçekleştiği gibi , aynı zamandan biraz öncede,
butonun basılı olmayan şekilde basılı olan şekile geçişi de bir işlemdir ve sistem ele alamadığımız sürecleri başlatmış demektir,
tüm bu sürecler içerisinde temelde kullanılan şey Event’tır.
Event’lara kavram olarak tam olmasada Delegelerin kapsüllenmiş hali diyebiliriz. Bu yazıda event örneklerini basit EventHandler kullanımı ile birlikte göreceğiz
çünki uygulamalarda Event’lar delegelerle çalışmaktadır ve event’lar için en yoğun kullanılan delege EventHandler ve bu delegenin generic modelidir.
EventHandler Delegesini Tanıyalım
-
class Program
-
{
-
static void Main(string[] args)
-
{
-
Console.Title = "EventHandler Delegesi Kullanımı";
-
// Program sınıfının nesne örneğini alıyoruz
-
// EventHandler delegesini örnekliyoruz , ve yapıcı metodunda
-
// bizden object ve EventArgs tipindne değerler alan ve geriye değer döndürmeyen
-
// bir metot tasarımı işaret edebileceğini söylemekte
-
// biz de daha önceden hazırladığımız
-
// EventHandlerMetodu1 isimli metodumuzu bu kapsamda delegenin metotlar listesine
-
// veriyoruz
-
-
// sonuc olarak EventHandler ‘da bir delege olduğu için
-
// listesine alabileceği bir başka metot olan fakat non-static olarak
-
// işaretlenmiş , sadece ilgili sınıfın nesne örneği üzerinden erişebileceğimiz
-
// bir metodu tasarlamıştık ve ismi => EventHandlerMetodu2 idi
-
// bu metoduda delegemizin metotlar listesine ekliyoruz
-
temsilci += p.EventHandlerMetodu2;
-
-
// Eklediğimiz metotların başarılı olup olmadığını
-
// delegenin metotlar listesinin uzunluğundan ögrenebiliriz
-
-
Console.WriteLine("Temsilci Metot Sayısı : {0}",temsilci.GetInvocationList().Length);
-
-
// delegeyi çalıştıralım
-
-
// delege çalıştırılmak istendiğinde , parametre olarak metotlarına göndereceği
-
// değerleri istemektedir,bizde bu değerleri object olarak bekleyen kısmında istediğimiz her türden
-
// verebiliriz,mesela object tipine karşılık bir anonim tip gönderebiliriz
-
// EventArgs kısmını ise daha sonra irdeleyeceğiz.
-
-
Console.WriteLine("Metotlar Tetiklenecek …\n");
-
Console.WriteLine("\nMetotlar Bitti …");
-
}
-
static void EventHandlerMetodu1(object s, EventArgs k)
-
{
-
Console.WriteLine("Metot 1 Çalıştı");
-
Console.WriteLine("object parametrenin tipi : {0}",s.GetType().Name);
-
Console.WriteLine("Metot 1 Bitti");
-
}
-
void EventHandlerMetodu2(object s, EventArgs k)
-
{
-
Console.WriteLine("Metot 2 Çalıştı");
-
Type tip = s.GetType();
-
-
foreach (PropertyInfo item in tip.GetProperties())
-
{
-
Console.WriteLine("\tTip Property Adı : {0,-5},Degeri : {1}",item.Name,item.GetValue(s,null));
-
}
-
Console.WriteLine("Metot 2 Bitti");
-
}
-
}
Bu delegenin kullanımı kavrayabilmek için aşağıdaki C# kodlarımızı bir Console uygulamasında yazalım ve derleyip çalıştıralım

EventHandler Delegesi Kullanarak Event Kullanımı Örneği
Delegenin kullanımı hakkında biraz bilgi sahibi olduktan sonra aynı delegeyi bu sefer Event örneğimiz için kullanalım
Bunun nedeni ise Event’lar delegelerin fonksiyonel halinden başka birşey olmayışlarıdır
-
class Program
-
{
-
static void Main(string[] args)
-
{
-
Console.Title = "EventHandler ile Event Kullanımı";
-
// Araba sınıfından bir nesne örneği yaratalım
-
// sürec için kendimiz gelişebilecek olaylara karşı ,
-
// public event üzerinden metot ekleyebiliriz
-
-
a.ArabaEvent += delegate(object s, EventArgs k)
-
{
-
// event’lara anonim metotlarda ekleyebiliriz
-
Console.ForegroundColor = ConsoleColor.Red;
-
Console.WriteLine("Anonim Metot Çalıştı,Muhtemelen Arabayı Yaktın (:");
-
};
-
-
// süreci başlatıcak metodu çalıştıralım
-
a.GazaBas(10, 100);
-
// sürec sonunda , önce a_ArabaEvent metodu çalışacaktır,sonrasında
-
// anonim metot çalışacaktır,fakat hepsinden önce , tip içerisinde
-
// eklenme işlemi yapılan metot çalışacaktır
-
}
-
-
static void a_ArabaEvent(object sender, EventArgs e)
-
{
-
Console.ForegroundColor = ConsoleColor.White;
-
Console.WriteLine("a_ArabaEvent Metodu Çalıştı");
-
Console.WriteLine("sender Parametresinin Tipi => {0}",sender.GetType().Name);
-
// sender parametresinde , bizim araba tipimi göndermiştik ,
-
// unboxing yaparak geri alabiliriz
-
-
Araba yeniAraba = (Araba)sender;
-
Console.WriteLine("Marka : {0},Hiz : {1},MaxHiz : {2}",yeniAraba.Marka,yeniAraba.Hiz,yeniAraba.MaxHiz);
-
}
-
}
-
class Araba
-
{
-
public string Marka { get; set; }
-
public int Hiz { get; set; }
-
public int MaxHiz { get; set; }
-
-
// event tanımlaması yapalım ve bu event’a
-
// dışarıdan da metot eklenmesi için
-
// erişim belirleyicisini public işaretleyelim
-
// ve aynı zamanda sınıfımızın yapıcı metodunda da , event’a
-
// metot ekleyelim
-
-
public event EventHandler ArabaEvent;
-
-
public Araba()
-
{
-
}
-
-
void Araba_ArabaEvent(object sender, EventArgs e)
-
{
-
Console.ForegroundColor = ConsoleColor.Yellow;
-
Console.WriteLine("Araba Sınıfı içerisindeki Metot Çalıştı"); ;
-
}
-
-
// süreci başlatacak bir metot yazalım
-
-
public void GazaBas(int miktar,int sure)
-
{
-
// sure kadar,miktar parametresi değerince , Hizi artıralım
-
for (int i = 0; i < sure; i++) { // Hizlanma işlemini daha rahat görebilmek için araya // sistemi bekleten bekletmeler koyabiliriz System.Threading.Thread.Sleep(250); Console.WriteLine("{0} , {1} Km Hızında Gidiyor …",Marka,Hiz); // süre boyunca , miktar miktarinca , hiz değerini artıralım Hiz += miktar; // hiz miktarı , max hız miktarını geçmişse , kontrol etmemiz gerekir if (Hiz >= MaxHiz)
-
{
-
// eger ki hız max hızı geçtiyse event’ın delegesinin
-
// metotları artık çalışmalıdır , çünki süreçte beklenen sonuc yada
-
// istenmeyen sonuca gelinmiştir
-
-
// ArabaEvent , arka plandaki delegesi null değilse yani
-
// listesinde metotları var ise, bu delegeyi tetikleyebiliriz
-
if (ArabaEvent != null)
-
// delegeyi , o an ki nesne örneği ve göstermelik bir Args tipi ile parametre
-
// geçtik
-
-
break;
-
}
-
}
-
}
-
}


