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.

delegate, bir metoda yapılan başvuruyu temsil eden bir türdür. Bunu, veri yerine bir metot tutan bir değişken olarak düşünebilirsin. Bu, metotları bağımsız değişken olarak geçirmeni, koleksiyonlarda saklamanı ve dinamik olarak çağırmanı sağlar.

Bir temsilciyi, başvurabileceği yöntemin imzasını belirterek bildirirsiniz:

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ımlama-abone olma desenini uygulamak için temsilciler üzerine kuruludur. Bir sınıf bir olay oluşturur ve diğer sınıflar bildirimleri almak için abone olabilir. event anahtar sözcüğü, temsilcinin nasıl kullanılabileceğini kısıtlar; aboneler yalnızca işleyicileri ekleyebilir veya kaldırabilir, olayı doğrudan tetikleyemez.

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 işleyiciye abone olurken -= abonelikten çıkarır. ?.Invoke() kalıbı, yalnızca abone olanlar varsa olayı güvenli bir şekilde çağırır. Olaylar, GUI uygulamalarının, oyun motorlarının ve nesnelerin sıkı bir bağımlılık olmadan değişikliklere tepki vermesi gereken her sistemin temel bir parçasıdır.

challenge icon

Görev

Kolay

Sıcaklık her değiştiğinde abonelere bildirim göndermek için temsilcileri ve olayları kullanan bir sıcaklık izleme sistemi oluşturalım. Bu, olayların çok zarif bir şekilde etkinleştirdiği yayınla-abone olma modelinin klasik bir örneğidir.

Kodunuzu iki dosya arasında düzenleyeceksiniz:

  • TemperatureMonitor.cs: Yayıncı olarak görev yapan TemperatureMonitor ad alanında bir Monitoring sınıfı oluşturun. İzleyiciniz:
    • Geçerli sıcaklığı depolamak için özel bir alana sahip olmalı
    • Sıcaklık güncellendiğinde tetiklenen, Action<int> adlı TemperatureChanged türünde bir olay tanımlamalı
    • Ayarlayıcısı özel alanı güncelleyen ve yeni sıcaklık değeriyle olayı tetikleyen bir Temperature özelliğine (int) sahip olmalı
    Olayı yalnızca abone olanlar varsa güvenli bir şekilde tetiklemek için ?.Invoke() modelini kullanmayı unutmayın.
  • Program.cs: Ana dosyanızda bir TemperatureMonitor oluşturun ve TemperatureChanged olayına iki farklı işleyici abone edin:
    • Şunu yazdıran bir işleyici: Alert: Temperature is now {value} degrees
    • Şunu yazdıran başka bir işleyici: Logged: {value}
    Her iki işleyiciyi de abone ettikten sonra, girdiden alınan değerleri kullanarak sıcaklığı iki kez ayarlayın. Sıcaklığı her ayarladığınızda her iki işleyici de yanıt vermelidir.

İki girdi alacaksınız:

  • İlk sıcaklık değeri (tam sayı)
  • İkinci sıcaklık değeri (tam sayı)

Örneğin, girdiler 25 ve 30 ise çıktı şöyle olmalıdır:

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

Temperature özelliğinin ayarlanmasının tüm abonelere otomatik olarak bildirim gönderdiğine dikkat edin - izleyicinin kimin dinlediği hakkında herhangi bir şey bilmesine gerek yoktur. Olay güdümlü 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