15. Olaylar ve Delegeler

C# Logo
C# Logo
image text






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.

C#

 // 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:

C#

 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.

C#

 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.

C#

 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.

 

İlk yorum yapan olun

Bir yanıt bırakın

E-posta hesabınız yayımlanmayacak.


*