Sobes.tech
Junior

Wat zijn gebeurtenissen in C#?

sobes.tech AI

Antwoord van AI

De gebeurtenissen in C# zijn een mechanisme gebaseerd op het "observer"-patroon (Observer Pattern), waarmee een object (de uitgever) andere objecten (de abonnees) kan informeren over het optreden van een bepaalde actie of wijziging van de toestand.

Belangrijkste componenten:

  • Uitgever (Publisher): Klasse die een gebeurtenis declareert.
  • Gebeurtenis (Event): Declaratie van een gebeurtenis met het trefwoord event. Bepaalt de handtekening van de methode die door handlers wordt gebruikt.
  • Delegaat (Delegate): Type dat de handtekening van methoden definieert die op een gebeurtenis kunnen abonneren. Vaak wordt de vooraf gedefinieerde delegate EventHandler of EventHandler<TEventArgs> gebruikt.
  • Abonnee (Subscriber): Klasse of object dat zich abonneert op de gebeurtenis van de uitgever en een methode (gebeurtenishandler) levert die wordt aangeroepen bij het optreden van de gebeurtenis.
  • Gebeurtenishandler (Event Handler): Methode van de abonnee die overeenkomt met de handtekening van de delegate van de gebeurtenis.

Voorbeeld van declaratie en gebruik:

// Declaratie van de delegate, indien de vooraf gedefinieerde EventHandler niet wordt gebruikt
public delegate void MyEventHandler(object sender, EventArgs e);

// Uitgeverklasse
public class Publisher
{
    // Declaratie van de gebeurtenis met de delegate
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Trigger de gebeurtenis (indien abonnees aanwezig zijn)
        OnMyEvent(EventArgs.Empty);
    }

    // Methode om de gebeurtenis te triggeren (beschermd tegen null)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Abonne klasse
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Abonneren op de gebeurtenis
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Afmelden van de gebeurtenis
        publisher.MyEvent -= HandleMyEvent;
    }

    // Gebeurtenishandler
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("De gebeurtenis is getriggerd!");
    }
}

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

        sub.Subscribe(pub); // Abonneren

        pub.DoSomething(); // Trigger de gebeurtenis

        sub.Unsubscribe(pub); // Afmelden (optioneel)
    }
}

Gebeurtenissen zorgen voor een losse koppeling (loose coupling) tussen objecten, waardoor ze kunnen communiceren zonder directe kennis van de implementatie van de ander.