Sobes.tech
Junior

Kas yra įvykiai C#?

sobes.tech AI

Atsakymas iš AI

C# įvykiai yra mechanizmas, pagrįstas "stebėtojo" (Observer Pattern) šablonu, leidžiantis objektui (leidėjui) pranešti kitiems objektams (abonentams) apie tam tikro veiksmo ar būsenos pasikeitimą.

Pagrindiniai komponentai:

  • Leidėjas (Publisher): Klasė, kuri deklaruoja įvykį.
  • Įvykis (Event): Deklaruojamas naudojant raktinį žodį event. Nustato metodo signatūrą, kurią naudos apdorotojai.
  • Delegatas (Delegate): Tipas, apibrėžiantis metodų signatūrą, kurie gali būti prenumeruojami įvykiui. Dažnai naudojamas iš anksto apibrėžtas EventHandler arba EventHandler<TEventArgs>.
  • Prenumeratorius (Subscriber): Klasė arba objektas, kuris prenumeruoja leidėjo įvykį ir pateikia metodą (įvykio apdorotoją), kuris iškviečiamas įvykio įvykdymo metu.
  • Įvykio apdorotojas (Event Handler): Prenumeratoriaus metodas, atitinkantis įvykio delegato signatūrą.

Pavyzdys deklaravimui ir naudojimui:

// Delegato deklaravimas, jei nenaudojamas iš anksto apibrėžtas `EventHandler`
public delegate void MyEventHandler(object sender, EventArgs e);

// Leidėjo klasė
public class Publisher
{
    // Įvykio deklaravimas naudojant delegatą
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Įvykio iškvietimas (jei yra prenumeratorių)
        OnMyEvent(EventArgs.Empty);
    }

    // Metodas įvykio iškvietimui (apsaugotas nuo null)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Prenumeratoriaus klasė
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Prenumerata įvykio
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Atsisakymas prenumeratos
        publisher.MyEvent -= HandleMyEvent;
    }

    // Įvykio apdorotojas
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Įvykis įvyko!");
    }
}

// Pavyzdys naudojimui
public class Program
{
    public static void Main(string[] args)
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        sub.Subscribe(pub); // Prenumerata

        pub.DoSomething(); // Iškvies įvykį

        sub.Unsubscribe(pub); // Atsisakymas (pasirinktinai)
    }
}

Įvykiai užtikrina silpną sujungimą (loose coupling) tarp objektų, leidžiant jiems sąveikauti be tiesioginės žinojimo apie kitų įgyvendinimą.