

C# Programlama Dili: 15.Olaylar ve Delegeler
C# programlama dilinde olaylar (events) ve delegeler (delegates), nesne yönelimli programlamanın temel taşlarından biridir. Bu yapılar, bir nesnenin durumundaki değişiklikleri diğer nesnelere bildirmesini sağlayarak, gevşek bağlı (loosely coupled) sistemlerin oluşturulmasına olanak tanır. Bu makalede, C# dilindeki olaylar ve delegeleri detaylı bir şekilde inceleyeceğiz.
Delegeler (Delegates)
Delegeler, fonksiyon işaretçilerine benzer ve metotları değişkenler gibi kullanmamızı sağlayan yapılardır. Bir delege, belirli bir imza (signature) ile tanımlanır ve aynı imzaya sahip herhangi bir metodu referans edebilir. Bu, delegelerin, metotları parametre olarak geçirmemize, metotları bir koleksiyonda saklamamıza veya çalışma zamanında hangi metodun çağrılacağını belirlememize olanak tanır.
Delege Tanımlama
Bir delege tanımlamak için delegate
anahtar kelimesi kullanılır. Delege tanımı, referans edeceği metodun dönüş tipini ve parametre listesini belirtir.
// Basit bir delege tanımı
public delegate void MesajYaz(string mesaj);
Bu örnekte, MesajYaz
adında bir delege tanımlanmıştır. Bu delege, string
türünde bir parametre alan ve void
(geri dönüş değeri olmayan) bir metodu referans edebilir.
Delege Örneği
Aşağıdaki örnek, bir delegenin nasıl kullanılacağını göstermektedir:
using System;
public class Program
{
public delegate void MesajYaz(string mesaj);
public static void SelamVer(string mesaj)
{
Console.WriteLine("Selam: " + mesaj);
}
public static void GuleGule(string mesaj)
{
Console.WriteLine("Güle Güle: " + mesaj);
}
public static void Main(string[] args)
{
MesajYaz delege1 = new MesajYaz(SelamVer);
MesajYaz delege2 = new MesajYaz(GuleGule);
delege1("Dünya"); // Output: Selam: Dünya
delege2("Yine Bekleriz"); // Output: Güle Güle: Yine Bekleriz
// Çoklu delege (Multicast Delegate)
MesajYaz cokluDelege = delege1 + delege2;
cokluDelege("Herkese");
// Output:
// Selam: Herkese
// Güle Güle: Herkese
}
}
Bu örnekte, SelamVer
ve GuleGule
adlı iki metot tanımlanmıştır. Her iki metot da MesajYaz
delege türüyle uyumludur. Main
metodunda, bu metotlar delegelere atanır ve delegeler aracılığıyla çağrılır. Ayrıca, iki delege birleştirilerek çoklu bir delege (multicast delegate) oluşturulur ve bu delege çağrıldığında her iki metot da çalıştırılır.
Olaylar (Events)
Olaylar, bir sınıfın veya nesnenin, durumundaki bir değişiklik hakkında diğer sınıfları veya nesneleri bilgilendirmesini sağlayan mekanizmalardır. Olaylar, delegeleri temel alır ve yayıncı (publisher) ile abone (subscriber) arasında bir iletişim kurar. Yayıncı, olayı tetiklerken, aboneler bu olayı dinler ve olay gerçekleştiğinde belirlenen metotları çalıştırır.
Olay Tanımlama
Bir olay tanımlamak için event
anahtar kelimesi kullanılır. Olay tanımı, bir delege türü belirtir ve bu delege türü, olayın tetiklendiğinde çağrılacak metotların imzasını tanımlar.
public delegate void VeriDegistiEventHandler(object sender, EventArgs e);
public class VeriKaynagi
{
public event VeriDegistiEventHandler VeriDegisti;
protected virtual void OnVeriDegisti(EventArgs e)
{
VeriDegisti?.Invoke(this, e);
}
public void VeriyiDegistir()
{
// Veriyi değiştir
OnVeriDegisti(EventArgs.Empty);
}
}
Bu örnekte, VeriDegistiEventHandler
adında bir delege tanımlanmıştır. Bu delege, object
türünde bir sender
(olayı başlatan nesne) ve EventArgs
türünde bir e
(olay argümanları) parametresi alır. VeriKaynagi
sınıfında, VeriDegisti
adında bir olay tanımlanmıştır ve bu olay, VeriDegistiEventHandler
delege türünü kullanır. OnVeriDegisti
metodu, olayı tetiklemek için kullanılır. VeriDegistir
metodu, veriyi değiştirdikten sonra OnVeriDegisti
metodunu çağırarak olayı tetikler.
Olay Aboneliği
Bir olaya abone olmak için, +=
operatörü kullanılır. Bu operatör, bir metodu olayın olay işleyicisine ekler. Olay tetiklendiğinde, bu metot otomatik olarak çağrılır.
using System;
public class Program
{
public delegate void VeriDegistiEventHandler(object sender, EventArgs e);
public class VeriKaynagi
{
public event VeriDegistiEventHandler VeriDegisti;
protected virtual void OnVeriDegisti(EventArgs e)
{
VeriDegisti?.Invoke(this, e);
}
public void VeriyiDegistir()
{
// Veriyi değiştir
OnVeriDegisti(EventArgs.Empty);
}
}
public class VeriDinleyici
{
public void VeriDegistiHandler(object sender, EventArgs e)
{
Console.WriteLine("Veri değişti!");
}
}
public static void Main(string[] args)
{
VeriKaynagi kaynak = new VeriKaynagi();
VeriDinleyici dinleyici = new VeriDinleyici();
kaynak.VeriDegisti += dinleyici.VeriDegistiHandler;
kaynak.VeriyiDegistir(); // Output: Veri değişti!
}
}
Bu örnekte, VeriDinleyici
sınıfında VeriDegistiHandler
adında bir metot tanımlanmıştır. Bu metot, VeriDegistiEventHandler
delege türüyle uyumludur. Main
metodunda, VeriKaynagi
ve VeriDinleyici
nesneleri oluşturulur. VeriDegistiHandler
metodu, VeriKaynagi
nesnesinin VeriDegisti
olayına abone olur. VeriKaynagi.VeriyiDegistir()
çağrıldığında, VeriDegisti
olayı tetiklenir ve VeriDinleyici.VeriDegistiHandler()
metodu otomatik olarak çalışır.
Neden Olaylar?
Olaylar, delegelerin daha kontrollü bir şekilde kullanılmasını sağlar. Olaylar, dış sınıfların bir delegenin içeriğini değiştirmesini engeller. Bir olay sadece tanımlandığı sınıf içinde tetiklenebilir. Bu, olayların daha güvenli ve öngörülebilir olmasını sağlar.
Delegeler ve Olayların Kullanım Alanları
- GUI Uygulamaları: Buton tıklamaları, menü seçimleri gibi kullanıcı etkileşimlerini yönetmek için kullanılır.
- Asenkron Programlama: Bir işlemin tamamlandığını bildirmek için kullanılır.
- Observer Pattern: Bir nesnenin durumundaki değişiklikleri diğer nesnelere bildirmek için kullanılır.
- Middleware: Uygulama bileşenleri arasında iletişim kurmak için kullanılır.
Sonuç
Olaylar ve delegeler, C# programlama dilinin güçlü ve esnek özelliklerindendir. Bu yapılar, gevşek bağlı sistemlerin oluşturulmasına, kodun yeniden kullanılabilirliğinin artırılmasına ve uygulamanın genel tasarımının iyileştirilmesine yardımcı olur. Olaylar ve delegeleri doğru bir şekilde kullanarak, daha modüler, test edilebilir ve sürdürülebilir uygulamalar geliştirebilirsiniz.
Bir yanıt bırakın