Sobes.tech
Junior

Was sind Ereignisse in C#?

sobes.tech KI

Antwort von AI

Ereignisse in C# sind ein Mechanismus, der auf dem "Beobachter"-Muster (Observer Pattern) basiert und es einem Objekt (dem Herausgeber) ermöglicht, andere Objekte (Abonnenten) über das Eintreten einer Aktion oder eine Zustandsänderung zu informieren.

Hauptkomponenten:

  • Herausgeber (Publisher): Klasse, die ein Ereignis deklariert.
  • Ereignis (Event): Deklaration eines Ereignisses mit dem Schlüsselwort event. Legt die Signatur der Methode fest, die von den Handlern verwendet wird.
  • Delegierter (Delegate): Typ, der die Signatur der Methoden definiert, die auf ein Ereignis abonnieren können. Häufig wird der vordefinierte Delegierte EventHandler oder EventHandler<TEventArgs> verwendet.
  • Abonnent (Subscriber): Klasse oder Objekt, das sich auf das Ereignis des Herausgebers abonniert und eine Methode (Ereignishandler) bereitstellt, die beim Auslösen des Ereignisses aufgerufen wird.
  • Ereignishandler (Event Handler): Methode des Abonnenten, die mit der Signatur des Delegierten des Ereignisses übereinstimmt.

Beispiel für Deklaration und Verwendung:

// Deklaration des Delegierten, falls nicht der vordefinierte EventHandler verwendet wird
public delegate void MyEventHandler(object sender, EventArgs e);

// Herausgeberklasse
public class Publisher
{
    // Deklaration des Ereignisses mit dem Delegierten
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Auslösen des Ereignisses (falls Abonnenten vorhanden)
        OnMyEvent(EventArgs.Empty);
    }

    // Methode zum Auslösen des Ereignisses (schützt vor null)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Abonnentenklasse
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Abonnement des Ereignisses
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Abbestellen des Ereignisses
        publisher.MyEvent -= HandleMyEvent;
    }

    // Ereignishandler
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Ereignis wurde ausgelöst!");
    }
}

// Beispiel für die Verwendung
public class Program
{
    public static void Main(string[] args)
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        sub.Subscribe(pub); // Abonnement

        pub.DoSomething(); // Ereignis auslösen

        sub.Unsubscribe(pub); // Abbestellen (optional)
    }
}

Ereignisse sorgen für eine lose Kopplung (loose coupling) zwischen Objekten, was ihnen ermöglicht, zu interagieren, ohne direkte Kenntnis von der Implementierung des anderen zu haben.