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.
public delegate void VeriDegistiEventHandler(object sender, VeriDegistiEventArgs e);
public class VeriKaynagi
{
public event VeriDegistiEventHandler VeriDegisti;
private string _veri;
public string Veri
{
get { return _veri; }
set
{
if (_veri != value)
{
_veri = value;
OnVeriDegisti(new VeriDegistiEventArgs(value));
}
}
}
protected virtual void OnVeriDegisti(VeriDegistiEventArgs e)
{
if (VeriDegisti != null)
{
VeriDegisti(this, e);
}
}
}
public class VeriDegistiEventArgs : EventArgs
{
public string YeniVeri { get; private set; }
public VeriDegistiEventArgs(string yeniVeri)
{
YeniVeri = yeniVeri;
}
}
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 ve VeriDegistiEventArgs e).
- VeriKaynagi sınıfında VeriDegisti adında bir event tanımlıyoruz. Bu
event, VeriDegistiEventHandler delegate türü ile ilişkilendirilir.
- Veri özelliği her değiştiğinde OnVeriDegisti metodu çağrılır. Bu
metot, event'e abone olan tüm metotları (olay işleyicileri) tetikler.
- VeriDegistiEventArgs sınıfı, olayla birlikte gönderilecek ek bilgileri taşır.
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.
public class VeriDinleyici
{
public void VeriDegistiHandler(object sender, VeriDegistiEventArgs e)
{
Console.WriteLine("Veri değişti: " + e.YeniVeri);
}
public void AboneOl(VeriKaynagi kaynak)
{
kaynak.VeriDegisti += VeriDegistiHandler;
}
public void AboneliktenCik(VeriKaynagi kaynak)
{
kaynak.VeriDegisti -= VeriDegistiHandler;
}
}
Bu örnekte:
- VeriDinleyici sınıfında VeriDegistiHandler adında bir olay işleyici
metot tanımlıyoruz. Bu metot, VeriDegistiEventHandler delegate türü ile
aynı imzaya sahiptir.
- AboneOl metodu, += operatörü ile VeriDegisti event'ine
VeriDegistiHandler metodunu abone yapar.
- AboneliktenCik metodu -= operatörü ile VeriDegistiHandler metodunun aboneliğini iptal eder.
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.
protected virtual void OnVeriDegisti(VeriDegistiEventArgs e)
{
if (VeriDegisti != null)
{
VeriDegisti(this, e);
}
}
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
yoksa NullReferenceException 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 (yani VeriKaynagi nesnesini) gönderir.
Örnek Kullanım
class Program
{
static void Main(string[] args)
{
VeriKaynagi kaynak = new VeriKaynagi();
VeriDinleyici dinleyici1 = new VeriDinleyici();
VeriDinleyici dinleyici2 = new VeriDinleyici();
dinleyici1.AboneOl(kaynak);
dinleyici2.AboneOl(kaynak);
kaynak.Veri = "Merhaba";
kaynak.Veri = "Dünya";
dinleyici2.AboneliktenCik(kaynak);
kaynak.Veri = "Webkolog";
Console.ReadLine();
}
}
Bu örnekte:
- VeriKaynagi ve VeriDinleyici nesneleri oluşturulur.
- dinleyici1 ve dinleyici2, kaynak nesnesinin VeriDegisti event'ine
abone olur.
- kaynak.Veri özelliği her değiştiğinde VeriDegisti event'i tetiklenir
ve abone olan VeriDegistiHandler metotları çağrılır.
- dinleyici2 abonelikten çıktıktan sonra, kaynak.Veri özelliği değiştiğinde sadece dinleyici1'in VeriDegistiHandler 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.
Webkolog'u takipte kalın!
Hepinize olaylarla dolu ve etkileşimli
kodlama deneyimleri dilerim!
0 yorum:
Yorum Gönder