Sobes.tech
Junior

Ce sunt evenimentele în C#?

sobes.tech AI

Răspuns de la AI

Evenimentele în C# sunt un mecanism bazat pe modelul "observator" (Observer Pattern), care permite unui obiect (editorul) să notifice alte obiecte (abonamentele) despre apariția unei anumite acțiuni sau schimbări de stare.

Componente principale:

  • Editor (Publisher): Clasa care declară un eveniment.
  • Eveniment (Event): Declarație a unui eveniment folosind cuvântul cheie event. Definește semnătura metodei pe care o vor folosi handler-ele.
  • Delegat (Delegate): Tip care definește semnătura metodelor care pot fi abonate la un eveniment. De obicei, se folosește delegatul predefinit EventHandler sau EventHandler<TEventArgs>.
  • Abonat (Subscriber): Clasă sau obiect care se abonează la evenimentul editorului și furnizează o metodă (handler-ul evenimentului) care este apelată la declanșarea evenimentului.
  • Handler-ul evenimentului (Event Handler): Metoda abonatului care corespunde semnăturii delegatului evenimentului.

Exemplu de declarație și utilizare:

// Declararea delegatului, dacă nu se folosește delegatul predefinit EventHandler
public delegate void MyEventHandler(object sender, EventArgs e);

// Clasa editor
public class Publisher
{
    // Declararea evenimentului folosind delegatul
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Declanșarea evenimentului (dacă există abonați)
        OnMyEvent(EventArgs.Empty);
    }

    // Metodă pentru declanșarea evenimentului (protejat de null)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Clasa abonat
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Abonare la eveniment
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Dezabonare de la eveniment
        publisher.MyEvent -= HandleMyEvent;
    }

    // Handler-ul evenimentului
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Evenimentul a fost declanșat!");
    }
}

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

        sub.Subscribe(pub); // Abonare

        pub.DoSomething(); // Declanșare eveniment

        sub.Unsubscribe(pub); // Dezabonare (opțional)
    }
}

Evenimentele asigură o cuplare slabă (loose coupling) între obiecte, permițându-le să interacționeze fără cunoaștere directă despre implementarea celuilalt.