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 startedOlaylar, 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.
Görev
KolaySı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 yapanTemperatureMonitorad alanında birMonitoringsı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ıTemperatureChangedtü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ı
?.Invoke()modelini kullanmayı unutmayın.Program.cs: Ana dosyanızda birTemperatureMonitoroluşturun veTemperatureChangedolayı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}
- Şunu yazdıran bir işleyici:
İ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: 30Temperature ö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
}
}
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
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci KayıtlarıKendi başına pratik yap: Online C# derleyicisi