Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event
Proszę używać zdarzeń w modelu publikowanie/subskrypcja: deklarować event, dodawać i usuwać handlery, przekazywać dane za pomocą EventArgs oraz zgłaszać zdarzenia według wzorca OnX.
Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 3 lekcji w sumie.
Przegląd zdarzeń
Cel: Publikować i subskrybować za pomocą zdarzeń.
- Deklarować zdarzenie u wydawcy
- Subskrybować za pomocą += i anulować subskrypcję za pomocą -=
- Bezpiecznie zgłaszać zdarzenie u wydawcy
- Przekazywać dane za pomocą EventArgs
Podstawy używania zdarzeń
Udostępnij zdarzenie i pozwól odbiorcom dołączać oraz odłączać obsługę. Tylko wydawca może je wywołać.
using System;
public class Button
{
public event EventHandler Click;
public void SimulateClick()
{
// Safe raise: copy then invoke if not null (C# 6-safe)
EventHandler h = Click;
if (h != null) h(this, EventArgs.Empty);
}
}
public class Program
{
static void OnClick(object sender, EventArgs e)
{
Console.WriteLine("Clicked!");
}
public static void Main(string[] args)
{
Button b = new Button();
b.Click += OnClick; // subscribe
b.SimulateClick(); // prints "Clicked!"
b.Click -= OnClick; // unsubscribe
b.SimulateClick(); // no output
}
}
Zdarzenie z danymi
Używaj EventArgs (lub EventHandler<TEventArgs>), aby przekazywać przydatne dane subskrybentom.
using System;
// Data for the event
public sealed class PriceChangedEventArgs : EventArgs
{
public decimal OldPrice { get; private set; }
public decimal NewPrice { get; private set; }
public PriceChangedEventArgs(decimal oldP, decimal newP)
{
OldPrice = oldP; NewPrice = newP;
}
}
public sealed class Product
{
private decimal _price;
public event EventHandler<PriceChangedEventArgs> PriceChanged;
public decimal Price
{
get { return _price; }
set
{
if (value != _price)
{
decimal old = _price;
_price = value;
EventHandler<PriceChangedEventArgs> h = PriceChanged;
if (h != null) h(this, new PriceChangedEventArgs(old, _price));
}
}
}
}
public class Program
{
public static void Main(string[] args)
{
Product p = new Product();
p.PriceChanged += delegate(object s, PriceChangedEventArgs e)
{
Console.WriteLine("Price: " + e.OldPrice + " -> " + e.NewPrice);
};
p.Price = 10m;
p.Price = 12m;
}
}
Delegaty wielokrotne i wyrażenia lambda
Zdarzenia są wielokrotne: wiele procedur obsługi jest uruchamianych w kolejności subskrypcji. Używaj nazwanych lub anonimowych procedur obsługi.
using System;
public class Alarm
{
public event EventHandler Ring;
public void Trigger()
{
EventHandler h = Ring;
if (h != null) h(this, EventArgs.Empty);
}
}
public class Program
{
static void HandlerA(object s, EventArgs e) { Console.WriteLine("A"); }
static void HandlerB(object s, EventArgs e) { Console.WriteLine("B"); }
public static void Main(string[] args)
{
Alarm a = new Alarm();
a.Ring += HandlerA; // named
a.Ring += delegate(object s, EventArgs e) { Console.WriteLine("lambda"); }; // anon
a.Ring += HandlerB;
a.Trigger(); // prints A, lambda, B (multicast order)
}
}
Wzorzec zgłaszania OnX
Używaj chronionej metody OnX do zgłaszania zdarzeń. Skopiuj delegata do zmiennej lokalnej i przed wywołaniem sprawdź, czy nie ma wartości null.
using System;
public class Ticker
{
public event EventHandler Tick;
protected virtual void OnTick()
{
EventHandler h = Tick; // copy to local
if (h != null) h(this, EventArgs.Empty);
}
public void RunOnce()
{
// do work...
OnTick(); // raise via protected method
}
}
public class Program
{
static void Show(object s, EventArgs e) { Console.WriteLine("Tick!"); }
public static void Main(string[] args)
{
Ticker t = new Ticker();
t.Tick += Show;
t.RunOnce();
}
}
Wskazówki i pułapki dotyczące zdarzeń
Wskazówki:
- Zawsze anuluj subskrypcję ( -= ), gdy subskrybent nie jest już potrzebny.
- Procedury obsługi powinny być krótkie; długotrwałą pracę należy umieścić w kolejce.
- Używaj EventArgs (lub podklasy), aby przekazywać dane.
- Tylko wydawca powinien zgłaszać zdarzenie.
Rola słowa kluczowego event
Podsumowanie
Podsumowanie: Zadeklaruj zdarzenie, pozwól odbiorcom dołączać i odłączać obsługę, przekazuj dane za pomocą EventArgs i zgłaszaj zdarzenie przez chronioną metodę OnX.
Często zadawane pytania
Czy lekcja „Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event” jest bezpłatna?
Tak — pełny tekst „Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 3 lekcji w sumie.
Co nauczysz się w „Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event”?
Proszę używać zdarzeń w modelu publikowanie/subskrypcja: deklarować event, dodawać i usuwać handlery, przekazywać dane za pomocą EventArgs oraz zgłaszać zdarzenia według wzorca OnX. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C# Academy?
Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 3.
Ile czasu zajmuje lekcja „Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?
Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- delegate, Action/Func, domknięcia
- Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event
- Wzorce zdarzeń i pułapki (wycieki pamięci)