Merhaba değerli Webkolog.net takipçileri, bugünkü yazımızda C# programlama dilinin önemli bir özelliği olan Event'leri (Olayları) yakından inceleyeceğiz. Event'ler, nesnelerin meydana gelen belirli durumları veya eylemleri diğer nesnelere bildirmesini sağlayan bir mekanizmadır. Özellikle kullanıcı etkileşimi, asenkron işlemler ve sistem olayları gibi durumlarda uygulamalarımızın tepki vermesini ve dinamik davranmasını sağlar. .NET Framework 4 ile birlikte gelen bu yapı, olay güdümlü programlamanın temelini oluşturur. Gelin, event'lerin ne olduğuna, nasıl tanımlandığına ve nasıl kullanıldığına birlikte göz atalım.
Event Nedir?
Event (olay), bir nesnenin (olay yayınlayıcı veya publisher) meydana gelen bir durum veya eylem hakkında diğer nesneleri (olay dinleyicisi veya subscriber) bilgilendirmesini sağlayan bir mekanizmadır. Örneğin, bir butona tıklama, bir dosyanın indirilmesi veya bir verinin değişmesi birer olay olabilir. Olaylar, nesneler arasında gevşek bir bağlantı kurarak bir nesnenin başka bir nesnenin iç işleyişine doğrudan bağımlı olmadan iletişim kurmasını sağlar.
Event Tanımlama
Event tanımlamak için event
anahtar kelimesini kullanırız. Event'ler, bir delegate türü ile ilişkilendirilir. Bu delegate, olayı dinleyen metotların (olay işleyicileri veya event handlers) imzasını belirtir.
using System;
// 1. Delegate Tanımlama: Olay işleyici metotların imzasını belirler
public delegate void VeriDegistiEventHandler(object sender, VeriDegistiEventArgs e);
// 2. EventArgs Sınıfı Tanımlama: Olayla birlikte gönderilecek ek bilgileri taşır
public class VeriDegistiEventArgs : EventArgs
{
public string YeniVeri { get; private set; } // Sadece okunabilir özellik
public VeriDegistiEventArgs(string yeniVeri)
{
YeniVeri = yeniVeri;
}
}
// 3. Olay Yayınlayıcı (Publisher) Sınıfı
public class VeriKaynagi
{
// Event tanımı: Belirlenen delegate türü ile ilişkilendirilir
public event VeriDegistiEventHandler VeriDegisti;
private string _veri;
public string Veri
{
get { return _veri; }
set
{
// Eğer veri değiştiyse olayı tetikle
if (_veri != value)
{
_veri = value;
OnVeriDegisti(new VeriDegistiEventArgs(value)); // Olayı tetikleyen metodu çağır
}
}
}
// Olayı tetikleyen korumalı sanal metot
// Bu metot, türetilmiş sınıfların olayı tetiklemesine olanak tanır
protected virtual void OnVeriDegisti(VeriDegistiEventArgs e)
{
// Event'e abone olan herhangi bir metot olup olmadığını kontrol et
if (VeriDegisti != null)
{
VeriDegisti(this, e); // Event'e abone olan tüm metotları çağır
}
}
}
Bu örnekte:
VeriDegistiEventHandler
adında bir delegate tanımlıyoruz. Bu delegate, olay işleyici metotların imzasını belirtir:void
dönüş tipi ve iki parametre (object sender
veVeriDegistiEventArgs e
).VeriDegistiEventArgs
sınıfı, olayla birlikte gönderilecek ek bilgileri taşır. Bu sınıfınEventArgs
sınıfından türemesi bir konvansiyondur.VeriKaynagi
sınıfındaVeriDegisti
adında bir event tanımlıyoruz. Bu event,VeriDegistiEventHandler
delegate türü ile ilişkilendirilir.Veri
özelliği her değiştiğindeOnVeriDegisti
metodu çağrılır. Bu metot, event'e abone olan tüm metotları (olay işleyicileri) tetikler.
Event'e Abone Olma ve Olay İşleyici Tanımlama
Bir nesnenin bir olayı dinlemesi (olaya abone olması) için +=
operatörünü kullanırız. Olay işleyici metot, event'in delegate türü ile aynı imzaya sahip olmalıdır.
using System;
// Olay Dinleyicisi (Subscriber) Sınıfı
public class VeriDinleyici
{
// Olay işleyici metot: Event'in delegate imzasına uygun olmalı
public void VeriDegistiHandler(object sender, VeriDegistiEventArgs e)
{
Console.WriteLine("Veri değişti: " + e.YeniVeri);
// İsterseniz olayı tetikleyen nesneye (sender) de erişebilirsiniz
// Console.WriteLine("Olayı tetikleyen nesne: " + sender.GetType().Name);
}
// Event'e abone olma metodu
public void AboneOl(VeriKaynagi kaynak)
{
kaynak.VeriDegisti += VeriDegistiHandler; // Olay işleyiciyi event'e ekle
Console.WriteLine("VeriDinleyici abone oldu.");
}
// Event aboneliğini iptal etme metodu
public void AboneliktenCik(VeriKaynagi kaynak)
{
kaynak.VeriDegisti -= VeriDegistiHandler; // Olay işleyiciyi event'ten çıkar
Console.WriteLine("VeriDinleyici abonelikten çıktı.");
}
}
Bu örnekte:
VeriDinleyici
sınıfındaVeriDegistiHandler
adında bir olay işleyici metot tanımlıyoruz. Bu metot,VeriDegistiEventHandler
delegate türü ile aynı imzaya sahiptir.AboneOl
metodu,+=
operatörü ileVeriDegisti
event'ineVeriDegistiHandler
metodunu abone yapar.AboneliktenCik
metodu-=
operatörü ileVeriDegistiHandler
metodunun aboneliğini iptal eder. Bu, özellikle bellek sızıntılarını önlemek için olay dinleyicileri artık gerekli olmadığında önemlidir.
Event'i Tetikleme
Bir olayı tetiklemek için, olayın delegate'ini çağırırız. Olayın tetiklendiği nesne (sender
) ve olayla ilgili ek bilgiler (EventArgs
) parametre olarak geçirilir.
// VeriKaynagi sınıfı içindeki OnVeriDegisti metodu
protected virtual void OnVeriDegisti(VeriDegistiEventArgs e)
{
// Event'e abone olan herhangi bir metot olup olmadığını kontrol et
// Bu kontrol, event'e abone olan hiçbir metot yoksa NullReferenceException hatası alınmasını engeller.
if (VeriDegisti != null)
{
VeriDegisti(this, e); // Event'e abone olan tüm metotları çağır
}
}
Bu örnekte:
OnVeriDegisti
metodu,VeriDegisti
event'ini tetikler.if (VeriDegisti != null)
kontrolü, event'e abone olan herhangi bir metot olup olmadığını kontrol eder. Bu, event'e abone olan hiçbir metot yoksaNullReferenceException
hatası alınmasını engeller.VeriDegisti(this, e)
ifadesi, event'e abone olan tüm metotları (olay işleyicileri) çağırır.this
parametresi, olayın tetiklendiği nesneyi (yaniVeriKaynagi
nesnesini) gönderir.
Örnek Kullanım
using System;
// Yukarıdaki VeriDegistiEventHandler, VeriDegistiEventArgs, VeriKaynagi ve VeriDinleyici sınıflarının tanımlandığını varsayın.
class Program
{
static void Main(string[] args)
{
VeriKaynagi kaynak = new VeriKaynagi();
VeriDinleyici dinleyici1 = new VeriDinleyici();
VeriDinleyici dinleyici2 = new VeriDinleyici();
Console.WriteLine("--- Abone Olma ---");
dinleyici1.AboneOl(kaynak);
dinleyici2.AboneOl(kaynak);
Console.WriteLine("\n--- Veri Değişiklikleri ---");
kaynak.Veri = "Merhaba"; // Event tetiklenir, her iki dinleyici de tepki verir
kaynak.Veri = "Dünya"; // Event tetiklenir, her iki dinleyici de tepki verir
Console.WriteLine("\n--- Abonelikten Çıkma ---");
dinleyici2.AboneliktenCik(kaynak); // Dinleyici2 abonelikten çıkar
Console.WriteLine("\n--- Yeni Veri Değişikliği ---");
kaynak.Veri = "Webkolog"; // Event tetiklenir, sadece dinleyici1 tepki verir
Console.ReadLine(); // Konsolun kapanmasını beklemek için
}
}
Bu örnekte:
VeriKaynagi
veVeriDinleyici
nesneleri oluşturulur.dinleyici1
vedinleyici2
,kaynak
nesnesininVeriDegisti
event'ine abone olur.kaynak.Veri
özelliği her değiştiğindeVeriDegisti
event'i tetiklenir ve abone olanVeriDegistiHandler
metotları çağrılır.dinleyici2
abonelikten çıktıktan sonra,kaynak.Veri
özelliği değiştiğinde sadecedinleyici1
'inVeriDegistiHandler
metodu çağrılır.
Neden Event Kullanmalıyız?
- Gevşek Bağlantı: Event'ler, nesneler arasında gevşek bir bağlantı kurarak bir nesnenin başka bir nesnenin iç işleyişine doğrudan bağımlı olmadan iletişim kurmasını sağlar. Bu, kodun daha modüler, esnek ve bakımı kolay olmasını sağlar.
- Olay Güdümlü Programlama: Event'ler, uygulamaların olaylara tepki vermesini ve dinamik davranmasını sağlar. Bu, özellikle kullanıcı etkileşimi, asenkron işlemler ve sistem olayları gibi durumlarda önemlidir.
- Çoklu Dinleyici: Bir event'e birden fazla nesne abone olabilir ve olay tetiklendiğinde tüm abone metotlar çağrılır. Bu, bir olayın birden fazla farklı işlem tetiklemesini sağlar.
Evet sevgili Webkolog.net okurları, bu yazımızda C# .NET Framework 4 ile Event'lerin ne olduğunu, nasıl tanımlandığını ve nasıl kullanıldığını detaylı bir şekilde inceledik. Event'ler, uygulamalarımızın olaylara tepki vermesini ve dinamik davranmasını sağlayarak daha etkileşimli ve kullanıcı dostu olmasını sağlar. Umarım bu rehber, event kavramını anlamanıza ve projelerinizde etkin bir şekilde kullanmanıza yardımcı olur. Bir sonraki yazımda, C# dilinin diğer önemli yapı taşlarını keşfetmeye devam edeceğiz. Webkolog.net'i takipte kalın!
Hepinize olaylarla dolu ve etkileşimli kodlama deneyimleri dilerim!
0 yorum:
Yorum Gönder