C# Delegates ve Events

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ı

ÖzellikDelegateEvent
KullanımTek başına kullanılabilir.Bir sınıf içinde delegate ile tanımlanır.
ErişimDelegate doğrudan çağrılabilir.Etkinlik yalnızca tetiklenebilir.
Çoklu AbonelikMulticast 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);
    }
}

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir