Event (Grundlagen)

Im Beitrag Delegates Grundlagen wie einzelne oder mehrere Methoden gekapselt werden können, also flexible Methodenreferenzen verwalten können.
Diese Technik bildet auch die Grundlage für Events in C#. Während Delegates für den Allgemeinen Methoden Aufruf verwendet werden können, bieten Events die Möglichkeit auf Benachrichtigungen zu reagieren.

Erstes Beispielprojekt zu Events

Wir erstellen eine Klasse Rechner, diese besitz eine Methode Namens Addiere. Diese Methode soll 2 Zahlen miteinander addieren und das Ergebnis über einem Event veröffentlichen.

class Rechner {
    // Delegat welches vom Event verwendet wird um den Erfolg einer Rechnung zu Signalisieren    
    public delegate void ErgebnisRechnungsErfolgHandler(int ergebnis);
    // Event 
    public event ErgebnisRechnungsErfolgHandler ErgebnisMelden;
    /// <summary>
    /// Addieren 
    /// </summary>
    /// <param name="a">Zahl 1</param>
    /// <param name="b">Zahl 2</param>
    /// <remarks>
    /// Statt einen Rückgabewert wird ein Event ausgelößt wenn die Berechnung beendet ist
    /// </remarks>
    public void Addiere(int a, int b)
    {
        int result = a + b;

        // Event auslösen (kurze schreibweise)
        ErgebnisMelden?.Invoke(result);
        // Event auslösen (lange schreibweise)
        //if (!(ErgebnisMelden == null))
        //    ErgebnisMelden(result);
    }
}

Was geschieht in der Klasse Rechner:
Zunächst wird ein Delegate deklariert: „public delegate void ErgebnisRechnungsErfolgHandler(int ergebnis);„. Um die Grundlagen von Delegates zu vertiefen, kann dies an im Beitrag Delegates (Grundlagen) nachgelesen werden.
Anschließend wird das Delegate mit einem Event verbunden, das von der Klasse aufgerufen wird: „public event ErgebnisRechnungsErfolgHandler ErgebnisMelden;„. Das Schlüsselwort event stellt sicher, dass sich externe Teilnehmer nur an diesem Delegate anmelden (+=) oder abmelden (-=) können, während die Kontrolle bei der Klasse Rechner als Auslöser bleibt.
Um das Event auszulösen kann einfach das Event, wie auch jede andere Methode aufgerufen werden mit „ErgebnisMelden(result)“.
Aber ACHTUNG, wenn das Event nicht implementiert worden ist, tritt hier ein Fehler auf da der „Zeiger“ des Events ins nichts zeigt. Aus diesem Grund habe ich hier im Code 2 Möglichkeiten aufgezeigt welche ein Absturz des Programmes verhindern.
Die erste Möglichkeit und kurze Möglichkeit ist „ErgebnisMelden?.Invoke(result);“. Wenn das Event Ereignismelden abonniert ist, dann wird das Event ausgeführt, sollte es nicht abonniert sein, wird das Event nicht ausgelöst.
Die zweite Möglichkeit ist für Beginner mit der Thematik einfacher verständlich.

if (!(ErgebnisMelden == null))
    ErgebnisMelden(result);

Es wird erst geprüft ob das Event ErgebnisMelden abonniert ist. Wenn es abonniert ist, wird es ausgeführt.

Wir haben nun die Klasse die Arbeitet, nun möchten wir natürlich auch das Programm erstellen welches die Methoden der Klasse anwendet.

static void Main(string[] args){
    Rechner rechne = new Rechner();                 // Rechner instanziieren
    rechne.ErgebnisMelden += Rechne_ErgebnisMelden; // Event abonnieren
    rechne.Addiere(1, 2);
    Console.WriteLine("Taste zum beenden.");
    Console.ReadKey();
}
private static void Rechne_ErgebnisMelden(int ergebnis){
    Console.WriteLine($"Ergebnis der Berechnung: {ergebnis}");
}

Was geschieht im Code?
Nach der Instanziierung der Klasse wird das in der Klasse definierte Event ErgebnisMelden mittels += abonniert: „rech.ErgebnisMelden += Rechne_ErgebnisMelden;„. Das abonnierte Event verweist anschließend auf die Methode, die mit dem Ergebnis weiterarbeitet.

Dieses kleine Beispiel zeigt wie Events funktionieren.
Im Beispielcode Download zu diesem Artikel ist ein 2tes (Windows Forms Projekt) enthalten. In diesem Windows Forms Projekt ist eine Klasse welche eine längere Aufgabe (Strings addieren) übernimmt und mittels Event zum einen den Status der Aufgabe (z.B. für einen Fortschrittsbalken) übergibt und das Ende der Aktion signalisiert. Als lange Aufgabe habe ich das Beispiel aus dem Eintrag Coding: Vergleich Strings und Array mit viel Inhalt verwendet.

Warum Events verwenden? Ich habe mal ein Modul erstellt, welches eine Kasse mit einem Bezahlterminal kommuniziert (Kartenzahlung), Während der Kartenzahlung werden diverse Informationen zwischen Kasse und Terminal hin und her gesandt (besonders dann wenn nicht das EC Terminal, sondern die Kasse den Zahlungsbeleg druckt). Damit die Kasse sämtliche Informationen am Kunden und Kassiererdisplay/Monitor anzeigt oder Zahlungsstatis, Start/Ende des Zahlungvorganges, etc. habe ich hier Events verwendet.

Quellcode des Beispiel zum Download.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen