Junior
Czym są zdarzenia w C#?
sobes.tech AI
Odpowiedź od AI
Wydarzenia w C# to mechanizm oparty na wzorcu "obserwator" (Observer Pattern), który pozwala obiektowi (wydawcy) powiadamiać inne obiekty (subskrybentów) o wystąpieniu określonego działania lub zmianie stanu.
Główne komponenty:
- Wydawca (Publisher): Klasa deklarująca zdarzenie.
- Zdarzenie (Event): Deklaracja zdarzenia z użyciem słowa kluczowego
event. Określa sygnaturę metody, którą będą używać obsługiwacze. - Delegat (Delegate): Typ określający sygnaturę metod, które mogą być subskrybowane na zdarzenie. Często używa się predefiniowanego delegata
EventHandlerlubEventHandler<TEventArgs>. - Subskrybent (Subscriber): Klasa lub obiekt, który subskrybuje zdarzenie wydawcy i zapewnia metodę (obsługę zdarzenia), wywoływaną przy wystąpieniu zdarzenia.
- Obsługa zdarzenia (Event Handler): Metoda subskrybenta odpowiadająca sygnaturze delegata zdarzenia.
Przykład deklaracji i użycia:
// Deklaracja delegata, jeśli nie używa się predefiniowanego EventHandler
public delegate void MyEventHandler(object sender, EventArgs e);
// Klasa wydawcy
public class Publisher
{
// Deklaracja zdarzenia z użyciem delegata
public event MyEventHandler MyEvent;
public void DoSomething()
{
// Wywołanie zdarzenia (jeśli są subskrybenci)
OnMyEvent(EventArgs.Empty);
}
// Metoda do wywołania zdarzenia (chroniona przed null)
protected virtual void OnMyEvent(EventArgs e)
{
MyEvent?.Invoke(this, e);
}
}
// Klasa subskrybenta
public class Subscriber
{
public void Subscribe(Publisher publisher)
{
// Subskrypcja zdarzenia
publisher.MyEvent += HandleMyEvent;
}
public void Unsubscribe(Publisher publisher)
{
// Anulowanie subskrypcji zdarzenia
publisher.MyEvent -= HandleMyEvent;
}
// Obsługa zdarzenia
private void HandleMyEvent(object sender, EventArgs e)
{
Console.WriteLine("Zdarzenie zostało wywołane!");
}
}
// Przykład użycia
public class Program
{
public static void Main(string[] args)
{
Publisher pub = new Publisher();
Subscriber sub = new Subscriber();
sub.Subscribe(pub); // Subskrypcja
pub.DoSomething(); // Wywołanie zdarzenia
sub.Unsubscribe(pub); // Anulowanie subskrypcji (opcjonalnie)
}
}
Zdarzenia zapewniają luźne powiązanie (loose coupling) między obiektami, umożliwiając im interakcję bez bezpośredniej wiedzy o implementacji drugiego obiektu.