Sobes.tech
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 EventHandler lub EventHandler<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.