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).

508 Words

Observer Pattern

Observer tasarım örüntüsü bir objenin durumunun değişmesi halinde , onu dinleyen gözlemcilere bu durumun bildirilmesini ele alan bir tasarım örüntüsüdür. Burada objeler ve gözlemciler arasında one-to-many ilişki söz konusudur. Bu örüntünün kafamızda daha netleşebilmesi için birkaç örnek vermek gerekirse:

 

– Event handling işlemlerinde. Örneğin bir buttona bastığınızda bir methodun çağırılması işlemi arkaplanda bu tasarım örüntüsüyle kodlanmış bir kod tarafından sağlanmaktadır.

– MVC(Model – View – Controller) mimarisinde View kısmında herhangi bir değişikliğin otomatik olarak kod kısmına yansıtılması.
[![](http://www.onurbaysan.com/blog/wp-content/uploads/2011/09/800px-Observer-300×124.png “800px-Observer”)](http://www.onurbaysan.com/blog/wp-content/uploads/2011/09/800px-Observer.png)

public interface Subject { void subscribe(Observer observer); void unsubscribe(Observer observer); void notifySubscribers(Notification notification); }

public class Center : Subject { List observers = new List(); List notifications = new List(); public void subscribe(Observer observer) { observers.Add(observer); } public void unsubscribe(Observer observer) { observers.Remove(observer); } public void notifySubscribers(Notification notification) { foreach (Observer observer in observers) observer.update(notification); } public void insertNotification(Notification notification) { notifications.Add(notification); notifySubscribers(notification); } }

public interface Observer { void update(Notification notification); }

public class Subscriber : Observer { private string name; public Subscriber(string name) { this.name = name; } public string getSubscriberName() { return name; } public void update(Notification notification) { Console.WriteLine(name + ” : New message from ” + notification.getFrom() + ” : ” + notification.getBody()); } }

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

261 Words