Menu
Coddy logo textTech

Delegates ve Eventler

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 43 / 70.

Bir delegate, bir yönteme başvuruyu temsil eden bir türdür. Bunu, veri yerine bir yöntem tutan bir değişken olarak düşünebilirsin. Bu, yöntemleri argüman olarak geçirmeni, koleksiyonlarda saklamanı ve dinamik olarak çağırmanı sağlar.

Başvurabileceği yöntemin imzasını belirterek bir delegate bildirirsin:

public delegate void Notify(string message);

public class Publisher
{
    public void SendAlert(string msg) => Console.WriteLine("Alert: " + msg);
}

// Kullanım
Notify notifier = new Publisher().SendAlert;
notifier("System started");  // Alert: System started

Olaylar, yayınla-abone ol pattern'ini uygulamak için delegeleri temel alır. Bir class event yükseltir ve diğer class'lar bildirim almak için abone olabilir. event anahtar sözcüğü, delegenin nasıl kullanılabileceğini kısıtlar — aboneler yalnızca handler ekleyebilir veya kaldırabilir, event'i doğrudan invoke edemez.

public class Button
{
    public event Action Clicked;
    
    public void Click()
    {
        Clicked?.Invoke();  // Tüm aboneleri bilgilendir
    }
}

// Abone olma
Button btn = new Button();
btn.Clicked += () => Console.WriteLine("Button was clicked!");
btn.Click();  // Düğme tıklandı!

+= operatörü bir handler'a abone olurken, -= abonelikten çıkarır. ?.Invoke() pattern'i, yalnızca subscribers varsa event'i safely çağırır. Event'ler GUI uygulamaları, oyun motorları ve nesnelerin sıkı bağlantı olmadan değişikliklere tepki vermesi gereken her sistem için temeldir.

challenge icon

Görev

Kolay

Delegeleri ve event'leri kullanarak sıcaklık değiştiğinde subscribers'ı bilgilendiren bir sıcaklık izleme sistemi oluşturalım. Bu, event'lerin çok zarif bir şekilde etkinleştirdiği publish-subscribe pattern'inin klasik bir örneğidir.

Code'unu iki dosyaya ayıracaksın:

  • TemperatureMonitor.cs: Publisher olarak görev yapan Monitoring namespace'inde bir TemperatureMonitor class'ı oluştur. Monitor'ün şunları yapmalıdır:
    • current temperature değerini store etmek için private bir field bulundurmalı
    • Sıcaklık güncellendiğinde tetiklenen, TemperatureChanged adlı Action<int> kullanan bir event Declare etmeli
    • Setter'ı private field'ı güncelleyen ve new temperature value ile event'i raise eden bir Temperature property (int) bulundurmalı
    Event'i yalnızca subscribers olduğunda safely raise etmek için ?.Invoke() pattern'ini kullanmayı unutma.
  • Program.cs: Main file'ında bir TemperatureMonitor oluştur ve iki farklı handler'ı onun TemperatureChanged event'ine Subscribe et:
    • Şunu prints eden bir handler: Alert: Temperature is now {value} degrees
    • Şunu prints eden another handler: Logged: {value}
    Her iki handler'ı Subscribe ettikten sonra input'tan gelen value'ları kullanarak temperature'ı iki kez ayarla. Temperature'ı her ayarladığında her iki handler da yanıt vermelidir.

İki input alacaksın:

  • First temperature value (integer)
  • Second temperature value (integer)

Örneğin input'lar 25 ve 30 ise output şöyle olmalıdır:

Alert: Temperature is now 25 degrees
Logged: 25
Alert: Temperature is now 30 degrees
Logged: 30

Temperature property'sini ayarlamanın tüm subscribers'ı otomatik olarak bilgilendirdiğine dikkat et — monitor, kimin dinlediği hakkında herhangi bir şey bilmek zorunda değildir. event-driven yaklaşımın güzelliği budur!

Kendin dene

using System;
using Monitoring;

class Program
{
    public static void Main(string[] args)
    {
        // Girdiyi oku
        int temp1 = Convert.ToInt32(Console.ReadLine());
        int temp2 = Convert.ToInt32(Console.ReadLine());

        // TODO: Bir TemperatureMonitor örneği oluştur

        // TODO: Subscribe a handler that prints: "Alert: Temperature is now {value} degrees"

        // TODO: "Logged: {value}" yazdıran başka bir işleyici abone et

        // TODO: Sıcaklığı temp1 olarak ayarla

        // TODO: Sıcaklığı temp2 olarak ayarla
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C# derleyicisi