Delegate ve Event’ler
Delegate ve Event’ler, C#’ta uygulamaların esnek, modüler ve sürdürülebilir olmasını sağlayan temel yapı taşlarıdır. Delegate, bir metodun referansını tip güvenli bir şekilde saklamamızı ve gerektiğinde çağırmamızı sağlayan özel bir türdür. Event’ler ise delegate’ler üzerine kurulu olup, Publisher-Subscriber (Yayıncı-Abone) tasarım desenini uygulayarak nesnelerin birbirine bağımlı olmadan olaylara tepki vermesini sağlar.
C# geliştirme süreçlerinde Delegate ve Event’ler genellikle kullanıcı arayüzü bildirimleri, veri işleme, loglama, genişletilebilir framework’ler ve asenkron işlemler gibi alanlarda kullanılır. Delegate sayesinde bir metodun detaylarını bilmeden çağrı yapabiliriz; Event’ler ile birden fazla abone, aynı olaya tepki verebilir.
Bu eğitimde okuyucu, C#’ta delegate ve event tanımlamayı, abone olmayı ve event tetiklemeyi öğrenecek. Ayrıca, delegate ve event’leri OOP prensipleri, veri yapıları ve algoritmalar ile birleştirerek gerçek dünyadan problemleri çözme yöntemleri gösterilecek. Bu konseptler, yazılım mimarisinde düşük bağımlılık, sürdürülebilirlik ve yeniden kullanılabilirlik sağlayan yapılar olarak ele alınacaktır.
Temel Örnek
textusing System;
namespace DelegateEventDemo
{
public delegate void NotificationHandler(string message);
public class Publisher
{
public event NotificationHandler Notify;
public void SendNotification(string message)
{
Notify?.Invoke(message);
}
}
public class Subscriber
{
private string _name;
public Subscriber(string name)
{
_name = name;
}
public void OnNotificationReceived(string message)
{
Console.WriteLine($"{_name} mesajı aldı: {message}");
}
}
class Program
{
static void Main(string[] args)
{
Publisher publisher = new Publisher();
Subscriber alice = new Subscriber("Alice");
Subscriber bob = new Subscriber("Bob");
publisher.Notify += alice.OnNotificationReceived;
publisher.Notify += bob.OnNotificationReceived;
publisher.SendNotification("Merhaba aboneler!");
publisher.Notify -= bob.OnNotificationReceived;
publisher.SendNotification("İkinci mesaj");
Console.ReadLine();
}
}
Bu örnekte NotificationHandler
delegate’i, event ile ilişkili metodların imzasını belirler ve tip güvenliği sağlar. Publisher
sınıfında Notify
eventi tanımlanır ve ?.Invoke()
kullanılarak güvenli şekilde tetiklenir. Bu yöntem, event’e abone olmayan durumlarda NullReferenceException hatasını önler.
Subscriber
sınıfı, delegate ile uyumlu OnNotificationReceived
metodunu uygular. Main
metodunda Publisher ve Subscriber nesneleri oluşturulur, abone olunur ve abonelik iptalleri yapılır. Bu sayede Observer tasarım deseni uygulanır, kodun bağımlılığı azaltılır ve bakım kolaylığı sağlanır.
Pratik Örnek
textusing System;
using System.Collections.Generic;
namespace DelegateEventAdvanced
{
public delegate void DataProcessedHandler(int result);
public class DataProcessor
{
public event DataProcessedHandler DataProcessed;
public void ProcessData(List<int> data)
{
int sum = 0;
foreach (var num in data)
{
if (num < 0)
{
Console.WriteLine("Negatif değer atlandı: " + num);
continue;
}
sum += num;
}
DataProcessed?.Invoke(sum);
}
}
public class Logger
{
public void LogResult(int result)
{
Console.WriteLine($"Sonuç kaydedildi: {result}");
}
}
public class Notifier
{
public void SendAlert(int result)
{
if (result > 50)
Console.WriteLine("Uyarı! Sonuç limitin üzerinde: " + result);
}
}
class Program
{
static void Main(string[] args)
{
DataProcessor processor = new DataProcessor();
Logger logger = new Logger();
Notifier notifier = new Notifier();
processor.DataProcessed += logger.LogResult;
processor.DataProcessed += notifier.SendAlert;
List<int> sampleData = new List<int> { 10, 20, 30, -5 };
processor.ProcessData(sampleData);
Console.ReadLine();
}
}
Bu örnekte DataProcessor
negatif değerleri atlayarak toplam hesaplar. DataProcessed
eventi sayesinde Logger
ve Notifier
sınıfları işleme sonucu hakkında tepki verir. Logger sonucu kaydederken, Notifier belirli bir eşik aşıldığında uyarı verir. Bu yapı, SRP (Single Responsibility Principle) ve Observer tasarım desenini uygulayarak, düşük bağımlılık ve güvenli event kullanımını göstermektedir.
C#’ta Delegate ve Event’ler için en iyi uygulamalar ve yaygın hatalar:
- Tip güvenli ve kapsüllü delegate ve event kullanın.
- Event’leri
?.Invoke()
ile tetikleyin. - Artık kullanılmayan event aboneliklerini iptal edin, memory leak’leri önleyin.
- Uzun ömürlü anonim delegate’lerden kaçının.
- Event tetikleme sırasında uzun işlemleri ana thread’de yapmayın.
- Yüksek frekansta çalışan event’lerde gereksiz nesne oluşturmayın.
- Event tetiklemeden önce veri doğrulaması yapın.
📊 Referans Tablosu
C# Element/Concept | Description | Usage Example |
---|---|---|
Delegate | Tip güvenli metod referansı | public delegate void MyDelegate(int x); |
Event | Delegate tabanlı olay | public event MyDelegate MyEvent; |
Subscription | Event’e abone olma | myPublisher.MyEvent += mySubscriber.MyMethod; |
Unsubscription | Event aboneliğini iptal | myPublisher.MyEvent -= mySubscriber.MyMethod; |
Conditional Invocation | Güvenli event çağrısı | MyEvent?.Invoke(42); |
Anonymous Delegate | Inline delegate tanımı | myPublisher.MyEvent += (x) => Console.WriteLine(x); |
Özet ve sonraki adımlar:
Delegate ve Event’ler, C# uygulamalarında esnek ve düşük bağımlılık sağlayan yapılar sunar. Temel kavramlar arasında tip güvenli delegate, event tanımı, güvenli abonelik ve Observer deseni vardır.
İleri seviyede, asenkron programlama, LINQ ile delegate kombinasyonu ve event tabanlı mimariler öğrenilmelidir. Pratik uygulamalar, bildirim sistemleri, genişletilebilir framework’ler ve gerçek zamanlı veri işleme senaryolarında görülür. Kaynak olarak Microsoft dokümantasyonu ve open-source projeler önerilir.
🧠 Bilginizi Test Edin
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek