Yükleniyor...

C# Delegates ve Events

C#’ta delegate ve event kavramlarını öğrenin. Olay tabanlı programlama, callback mantığı ve kullanım senaryoları örneklerle anlatılıyor.

C# dilinde delegate ve event, olay tabanlı programlamanın temelini oluşturur. delegate, bir metodu işaret edebilen tip güvenli bir başvuru türüdür. event ise bir sınıfın dış dünyaya “şu olay gerçekleşti” bilgisini göndermesini sağlar. Bu mekanizmalar sayesinde gevşek bağlı (loosely coupled) mimariler kurulabilir ve dinamik olarak farklı metotlar çalıştırılabilir.


Delegate Nedir?

Delegate, belirli bir imzaya (parametreler ve dönüş tipi) sahip metotlara referans tutar. Yani “metotları değişken gibi taşıyabilen” yapılardır. Tek bir delegate değişkenine farklı metotlar atanabilir ve istenildiğinde çağrılabilir.


// Bir delegate tanımı
public delegate void Notify(string message);

class Program
{
    static void SendEmail(string message)
    {
        Console.WriteLine("E-posta gönderildi: " + message);
    }

    static void SendSms(string message)
    {
        Console.WriteLine("SMS gönderildi: " + message);
    }

    static void Main()
    {
        Notify notifyHandler;

        // Delegate'e metot atama
        notifyHandler = SendEmail;
        notifyHandler("Toplantı saat 10:00'da.");

        // Aynı delegate'e başka metot bağlama (multicast)
        notifyHandler += SendSms;
        notifyHandler("Yeni ürün yayında!");
    }
}

Bu örnekte notifyHandler delegate’i hem SendEmail hem SendSms metotlarını çağırır. Delegate, olayların dinamik olarak farklı metotlara yönlendirilmesini sağlar.


Event Nedir?

Event, bir olayın meydana geldiğini bildiren mekanizmadır. Genellikle delegate tabanlıdır. event anahtar kelimesiyle tanımlanır ve dış dünyadan sadece += (abone olma) veya -= (abonelikten çıkma) ile kullanılabilir. Böylece olayın tetiklenmesi sadece sınıf içinde yapılabilir, dışarıdan kontrol edilemez.


public class Button
{
    // Event tanımı (EventHandler standart delegate tipidir)
    public event EventHandler? Click;

    public void SimulateClick()
    {
        Console.WriteLine("Butona basıldı!");
        // Event'i tetikleme
        Click?.Invoke(this, EventArgs.Empty);
    }
}

class Program
{
    static void Main()
    {
        var btn = new Button();

        // Event'e abone olma
        btn.Click += (s, e) => Console.WriteLine("Olay: Butona tıklandı.");

        btn.SimulateClick();
    }
}

Burada Button sınıfı bir Click olayı yayıyor. Dışarıdan abone olan kod (lambda ifadesi) olay tetiklendiğinde çalışıyor. Bu yaklaşım, WinForms ve WPF gibi UI uygulamalarında sıkça kullanılır.


EventHandler ve EventArgs

C#’ta olaylar için yaygın kullanılan standart delegate EventHandler’dır. EventArgs veya ondan türeyen sınıflar ile olay hakkında ek bilgi taşınabilir.


public class OrderEventArgs : EventArgs
{
    public int OrderId { get; }
    public decimal Amount { get; }

    public OrderEventArgs(int orderId, decimal amount)
    {
        OrderId = orderId;
        Amount = amount;
    }
}

public class OrderService
{
    public event EventHandler<OrderEventArgs>? OrderCreated;

    public void CreateOrder(int id, decimal amount)
    {
        Console.WriteLine($"Sipariş oluşturuldu (ID={id}, Tutar={amount})");

        // Olayı tetikle
        OrderCreated?.Invoke(this, new OrderEventArgs(id, amount));
    }
}

class Program
{
    static void Main()
    {
        var service = new OrderService();

        service.OrderCreated += (s, e) =>
        {
            Console.WriteLine($"Bildirim: Sipariş alındı (#{e.OrderId}, {e.Amount} TL)");
        };

        service.CreateOrder(101, 250m);
    }
}

Bu örnekte OrderService sınıfı sipariş oluşturulduğunda OrderCreated olayını tetikler. Abone olan kod, sipariş bilgilerini EventArgs üzerinden alır.


Delegates ve Events Ne Zaman Kullanılır?


TL;DR

  • delegate: Metotlara referans tutan tip güvenli yapılardır.
  • event: Bir olayın gerçekleştiğini abone olanlara bildiren mekanizmadır.
  • EventHandler ve EventArgs: Olaylarda standart kullanım sağlar.
  • Delegates → çağrı ve yönlendirme, Events → bildirim ve abonelik mantığı için kullanılır.

İlişkili Makaleler

C# Lambda İfadeleri

C#’ta lambda ifadelerini öğrenin. Kısa sözdizimi, Func ve Action kullanımı ile LINQ sorgularında pratik örnekler keşfedin.