crazy_coder
Moderatör
- Katılım
- 20 Şub 2026
- Mesajlar
- 204
- Tepkime puanı
- 0
- Puanları
- 16
C# Events ve Delegates: Olay Tabanlı Programlamanın Gücü
Bir uygulamada bir işlem bittiğinde (örneğin stok bittiğinde veya bir mesaj geldiğinde) sistemin diğer parçalarının bundan otomatik olarak haberdar olmasını istiyorsak Event yapısını kullanırız. Bu yapının motoru ise Delegate'tir.
1. Delegate (Temsilci) Nedir?
Delegate, bir metodun imzasını (dönüş tipi ve parametreleri) tutan bir "adres defteri" gibidir. Metotları bir değişken gibi taşımamıza olanak tanır.
C#:
// Temsilci tanımı: Geriye bir şey dönmeyen ve string alan metotları temsil eder.
public delegate void BildirimGonderici(string mesaj);
public class BildirimSistemi
{
public void SmsGonder(string m) => Console.WriteLine("SMS:m");publicvoidEmailGonder(stringm)=>Console.WriteLine("Email: {m}");
}
// Kullanım:
BildirimSistemi sistem = new BildirimSistemi();
BildirimGonderici elci = sistem.SmsGonder;
elci += sistem.EmailGonder; // Çoklu yayın (Multicast)
elci("Siparişiniz onaylandı!"); // Her iki metot da tetiklenir.
2. Event (Olay) Nedir?
Event, Delegate'lerin üzerine inşa edilmiş daha güvenli bir yapıdır. Sadece tanımlandığı sınıf içinden tetiklenebilir, ancak dışarıdan abone olunabilir. Bu, "Yayıncı (Publisher) - Abone (Subscriber)" modelidir.
Senaryo: Bir banka hesabında bakiye 100 TL'nin altına düştüğünde uyarı verelim.
C#:
public class BankaHesabi
{
// Olay tanımı
public event Action<string> DusukBakiyeUyari;
public decimal Bakiye { get; private set; } = 500;
public void ParaCek(decimal miktar)
{
Bakiye -= miktar;
if (Bakiye < 100 && DusukBakiyeUyari != null)
{
// Olayı tetikle
DusukBakiyeUyari($"Dikkat! Bakiyeniz kritik seviyede: {Bakiye} TL");
}
}
}
3. Olaylara Abone Olma (+= ve -=)
Bir olayı dinlemek için += operatörünü kullanırız. Dinlemeyi bırakmak için ise -= kullanılır.
C#:
BankaHesabi hesap = new BankaHesabi();
// Olaya abone oluyoruz
hesap.DusukBakiyeUyari += (mesaj) => {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(mesaj);
};
hesap.ParaCek(450); // Bakiye 50'ye düşer ve olay tetiklenir!
4. Delegate vs Event: Fark Nedir?
| Özellik | Delegate | Event |
|---|---|---|
| Erişim | Dışarıdan doğrudan tetiklenebilir (invoke). | Sadece tanımlandığı sınıf içinden tetiklenebilir. |
| Güvenlik | Düşüktür, herkes üzerine yazabilir (=). | Yüksektir, sadece ekleme/çıkarma yapılır (+=, -=). |
| Kullanım | Metotları parametre olarak geçmek için. | Sistemler arası iletişim ve bildirim için. |
Sonuç
Events ve Delegates, kodunuzu birbirinden bağımsız (decoupled) hale getirir. Banka hesabı sınıfı, bakiyenin düşük olduğunu bilir ama bu bilgiyi kimin, nasıl işleyeceğiyle (SMS mi atılacak, siren mi çalacak?) ilgilenmez. Sadece "benim işim bitti, ilgilenen varsa duyursun" der. Bu, profesyonel yazılım mimarisinin en temel prensiplerinden biridir.