C# programlama dilinde delegeler (delegates) ve etkinlikler (events), nesneler arasındaki iletişimi kolaylaştırmak ve dinamik yöntem çağrılarını desteklemek için kullanılan güçlü özelliklerdir. Delegeler, işaretçi mantığıyla çalışan nesnelerdir ve bir yöntemi temsil eder. Etkinlikler ise delegeler kullanılarak bildirim tabanlı bir yapıyı destekler.
1. Delegeler (Delegates)
Delegate Tanımı
Delegate, bir veya daha fazla yöntemi temsil eden bir türdür. Bu sayede, programın çalışma zamanında hangi yöntemin çağrılacağı dinamik olarak belirlenebilir.
Delegate Söz Dizimi
delegate dönüşTipi DelegateAdı(parametreler);
Örnek: Basit Delegate Kullanımı
using System;
delegate void MesajGoster(string mesaj);
class Program
{
static void Merhaba(string mesaj)
{
Console.WriteLine("Merhaba, " + mesaj);
}
static void Main()
{
MesajGoster mesajGoster = new MesajGoster(Merhaba);
mesajGoster("Dünya");
}
}
2. Multicast Delegeler
Bir delegate, birden fazla yöntemi aynı anda çağırabilir. Bu yapıya multicast delegate denir.
Örnek: Multicast Delegate
using System;
delegate void MesajGoster(string mesaj);
class Program
{
static void IlkMesaj(string mesaj)
{
Console.WriteLine("İlk Mesaj: " + mesaj);
}
static void IkinciMesaj(string mesaj)
{
Console.WriteLine("İkinci Mesaj: " + mesaj);
}
static void Main()
{
MesajGoster mesajGoster = IlkMesaj;
mesajGoster += IkinciMesaj;
mesajGoster("Merhaba Dünya!");
}
}
3. Etkinlikler (Events)
Etkinlik Nedir?
Etkinlikler, bir olay meydana geldiğinde birden fazla yöntemin çağrılmasını sağlar. Etkinlikler genellikle kullanıcı eylemleri (örneğin, bir düğmeye tıklama) gibi olaylarla ilişkilendirilir.
Etkinlik Söz Dizimi
event delegate Tür EtkinlikAdı;
Örnek: Etkinlik Kullanımı
using System;
delegate void BildirimHandler(string mesaj);
class Haberci
{
public event BildirimHandler Bildirim;
public void OlayTetikle(string mesaj)
{
if (Bildirim != null)
Bildirim(mesaj);
}
}
class Program
{
static void BildirimAlindi(string mesaj)
{
Console.WriteLine("Bildirim: " + mesaj);
}
static void Main()
{
Haberci haberci = new Haberci();
haberci.Bildirim += BildirimAlindi;
haberci.OlayTetikle("Yeni bir mesaj var!");
}
}
4. Action ve Func Delegeleri
Action Delegesi
Action
, geriye değer döndürmeyen (void) yöntemleri temsil eder.
Örnek: Action Delegesi
using System;
class Program
{
static void Merhaba(string mesaj)
{
Console.WriteLine("Merhaba, " + mesaj);
}
static void Main()
{
Action<string> mesajGoster = Merhaba;
mesajGoster("Dünya");
}
}
Func Delegesi
Func
, geriye bir değer döndüren yöntemleri temsil eder.
Örnek: Func Delegesi
using System;
class Program
{
static int Topla(int a, int b)
{
return a + b;
}
static void Main()
{
Func<int, int, int> toplamaIslemi = Topla;
int sonuc = toplamaIslemi(5, 10);
Console.WriteLine("Sonuç: " + sonuc);
}
}
5. Delegate ve Etkinliklerin Farkları
Özellik | Delegate | Event |
---|---|---|
Kullanım | Tek başına kullanılabilir. | Bir sınıf içinde delegate ile tanımlanır. |
Erişim | Delegate doğrudan çağrılabilir. | Etkinlik yalnızca tetiklenebilir. |
Çoklu Abonelik | Multicast destekler. | Multicast destekler. |
Kullanım Amacı | Genellikle bağımsız yöntem çağrılarında kullanılır. | Olay tabanlı bildirimler için kullanılır. |
6. Gerçek Hayat Senaryosu
Bir Banka Hesabı Örneği
using System;
delegate void HesapHandler(string mesaj);
class BankaHesabi
{
public event HesapHandler HesapEtkinligi;
public void ParaCek(double miktar)
{
if (miktar > 0)
HesapEtkinligi?.Invoke($"Hesabınızdan {miktar} TL çekildi.");
}
public void ParaYatir(double miktar)
{
if (miktar > 0)
HesapEtkinligi?.Invoke($"Hesabınıza {miktar} TL yatırıldı.");
}
}
class Program
{
static void HesapOlayi(string mesaj)
{
Console.WriteLine("Banka Mesajı: " + mesaj);
}
static void Main()
{
BankaHesabi hesap = new BankaHesabi();
hesap.HesapEtkinligi += HesapOlayi;
hesap.ParaYatir(1000);
hesap.ParaCek(500);
}
}