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 startedOlaylar, 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.
Görev
KolayDelegeleri 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 yapanMonitoringnamespace'inde birTemperatureMonitorclass'ı 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,
TemperatureChangedadlıAction<int>kullanan bir event Declare etmeli - Setter'ı private field'ı güncelleyen ve new temperature value ile event'i raise eden bir
Temperatureproperty (int) bulundurmalı
?.Invoke()pattern'ini kullanmayı unutma.Program.cs: Main file'ında birTemperatureMonitoroluştur ve iki farklı handler'ı onunTemperatureChangedevent'ine Subscribe et:- Şunu prints eden bir handler:
Alert: Temperature is now {value} degrees - Şunu prints eden another handler:
Logged: {value}
- Şunu prints eden bir handler:
İ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: 30Temperature 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
}
}
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