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:
VeriDegistiEventHandleradında bir delegate tanımlıyoruz. Bu delegate, olay işleyici metotların imzasını belirtir:voiddönüş tipi ve iki parametre (object senderveVeriDegistiEventArgs e).VeriDegistiEventArgssınıfı, olayla birlikte gönderilecek ek bilgileri taşır. Bu sınıfınEventArgssınıfından türemesi bir konvansiyondur.VeriKaynagisınıfındaVeriDegistiadında bir event tanımlıyoruz. Bu event,VeriDegistiEventHandlerdelegate türü ile ilişkilendirilir.Veriözelliği her değiştiğindeOnVeriDegistimetodu ç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:
VeriDinleyicisınıfındaVeriDegistiHandleradında bir olay işleyici metot tanımlıyoruz. Bu metot,VeriDegistiEventHandlerdelegate türü ile aynı imzaya sahiptir.AboneOlmetodu,+=operatörü ileVeriDegistievent'ineVeriDegistiHandlermetodunu abone yapar.AboneliktenCikmetodu-=operatörü ileVeriDegistiHandlermetodunun 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:
OnVeriDegistimetodu,VeriDegistievent'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 yoksaNullReferenceExceptionhatası alınmasını engeller.VeriDegisti(this, e)ifadesi, event'e abone olan tüm metotları (olay işleyicileri) çağırır.thisparametresi, olayın tetiklendiği nesneyi (yaniVeriKaynaginesnesini) 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:
VeriKaynagiveVeriDinleyicinesneleri oluşturulur.dinleyici1vedinleyici2,kaynaknesnesininVeriDegistievent'ine abone olur.kaynak.Veriözelliği her değiştiğindeVeriDegistievent'i tetiklenir ve abone olanVeriDegistiHandlermetotları çağrılır.dinleyici2abonelikten çıktıktan sonra,kaynak.Veriözelliği değiştiğinde sadecedinleyici1'inVeriDegistiHandlermetodu ç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