Sobes.tech
Junior

Cosa sono gli eventi in C#?

sobes.tech AI

Risposta dell'AI

Gli eventi in C# sono un meccanismo basato sul modello "osservatore" (Observer Pattern), che consente a un oggetto (l'editore) di notificare altri oggetti (gli abbonati) dell'avvenimento di un'azione o di una modifica dello stato.

Componenti principali:

  • Editore (Publisher): Classe che dichiara un evento.
  • Evento (Event): Dichiarazione di un evento usando la parola chiave event. Definisce la firma del metodo che gli handler utilizzeranno.
  • Delegato (Delegate): Tipo che definisce la firma dei metodi che possono iscriversi a un evento. Spesso si utilizza il delegato predefinito EventHandler o EventHandler<TEventArgs>.
  • Sottoscrittore (Subscriber): Classe o oggetto che si iscrive a un evento dell'editore e fornisce un metodo (gestore dell'evento) chiamato quando l'evento viene attivato.
  • Gestore dell'evento (Event Handler): Metodo del sottoscrittore che corrisponde alla firma del delegato dell'evento.

Esempio di dichiarazione e utilizzo:

// Dichiarazione del delegato, se non si utilizza il predefinito EventHandler
public delegate void MyEventHandler(object sender, EventArgs e);

// Classe editore
public class Publisher
{
    // Dichiarazione dell'evento usando il delegato
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Attivare l'evento (se ci sono sottoscrittori)
        OnMyEvent(EventArgs.Empty);
    }

    // Metodo per attivare l'evento (protetto da null)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Classe sottoscrittore
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Iscrizione all'evento
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Disiscrizione dall'evento
        publisher.MyEvent -= HandleMyEvent;
    }

    // Gestore dell'evento
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("L'evento si è verificato!");
    }
}

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

        sub.Subscribe(pub); // Iscrizione

        pub.DoSomething(); // Attiva l'evento

        sub.Unsubscribe(pub); // Disiscrizione (opzionale)
    }
}

Gli eventi forniscono un basso accoppiamento (loose coupling) tra oggetti, consentendo loro di interagire senza conoscere direttamente l'implementazione dell'altro.