24 Mart 2012 Cumartesi

C# ile Events

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