by

C#’ta Kendi Olayımızı(Custom Event) Yazmak

Bu yazımda C# dilini kullanarak nasıl kendi olaylarımızı yazdığımızdan bahsedeceğim. Öncelikle olayın(event) ne olduğunu basit birkaç örnekle anlatacak olursak;

– GUI üzerinde button a tıklanması sonucu bir olay tetiklenir ve siz ne yapmak istiyorsanız o kod içinde onu yaparsınız.
– Timer kullanmak istediniz farzedelim tick adında bir olay mevcuttur. Diyelim ki siz her bir saat vuruşunda ekrana birşey yazdırmak istiyorsunuz. O zaman ekrana yazdırma işlemini yapacağınız kodu olayın gerçekleşmesiyle(event firing) birlikte sapılacak methodun içine yazarsınız.

Sözü fazla uzatmadan kendi olayımızı kullanacağımız senaryoyu açıklamak istiyorum. MailBox adında mesajlarımızı barındıran bir sistemimiz var. Sisteme yeni bir mesaj gelme işlemi bu senaryoda bizim olayımız olacak ve yeni mesaj geldiğinde , gelen mesajı olayını dinleyen methodumuz ekrana gelen mesajı yazdıracak.

Message adında bir sınıfımız olsun ve bu sınıfımız mesajın kimden geldiğini , mesajın içeriğini ve mesajın geldiği saati tutsun.

class Message { public string body { get; set; } public DateTime timestamp { get; set; } public string from { get; set; } public Message(string body, string from) { this.body = body; this.from = from; this.timestamp = DateTime.Now; } }

Olay tanımı yaparken delegate ten yararlanıyoruz. Delegate nedir diyenler için MSDN’deki delegate tanımı: “A delegate is a type that references a method.”

public delegate void MessageHandler(object o , MessageReceivedArgs e);

Delegate imizi tanımladıktan sonra olay tanımını şu şekilde yapıyoruz:

public event MessageHandler MessageReceived;

MailBox sınıfımızın son hali aşağıdaki gibi oluyor.

class MailBox { List messages = new List(); public delegate void MessageHandler(object o , MessageReceivedArgs e); public event MessageHandler MessageReceived; public void newMessage(Message msg) { messages.Add(msg); MessageReceived(this , new MessageReceivedArgs(msg)); } }

Yukarıdaki kod kesiminde MessageReceivedArgs tipinde nesnelerin kullanıldığı birkaç yer dikkatinizi çekmiş olmalı. Bunu da kısaca açıklayacak olursak; olayın tetiklenmesinden sonra sapılacak yordamın imzası aşağıdaki gibi olmalıdır.

sapilacakYordam(object sender, EventArgs e)

Burada kullanılan 2. parametre EventArgs tipindeki parametre yerine biz kendi yarattığımız tipimizden bir parametre geçmek istersek ; EventArgs sınıfını kalıtan yeni bir sınıf yazabiliyoruz.

class MessageReceivedArgs : EventArgs { public readonly Message message; public MessageReceivedArgs(Message message) { this.message = message; } }

En son olarak ta olayımızı test edeceğimiz ana sınıfımızın kodunu yazıyoruz.

static void Main(string[] args) { MailBox mb = new MailBox(); mb.MessageReceived += new MailBox.MessageHandler(mb_MessageReceived); mb.newMessage(new Message(“May day”, “Captain Kirk”)); mb.newMessage(new Message(“Hello world” , “Alien”)); Console.ReadKey(); } static void mb_MessageReceived(object o, MessageReceivedArgs e) { Console.WriteLine(e.message.timestamp + ” yeni mesaj geldi: ” + e.message.from + ” : ” + e.message.body); }

Kodun tamamını indirmek için [tıklayınız](http://www.onurbaysan.com/blog/wp-content/uploads/2011/09/CustomEvent.zip).