Fortgeschrittene Grundlagen: Ereignisse
Ereignisse oder auch Events genannt, sind eine Möglichkeit, Daten von einer Klasse zu einer anderen zu übertragen. Dabei gibt es immer die Klasse, welche das Event besitzt und auslöst (Herausgeber) und die Klasse, die das Event registriert hat (Abonnent). Ereignisse werden hauptsächlich in Windows-Anwendungen mit grafischer Oberfläche (Windows Forms und WPF) eingesetzt. Jedoch lohnt es sich schon jetzt, die Grundlagen zu lernen. In einer Konsolen-Anwendung gibt es das Event CancelKeyPress, welches ausgelöst wird, wenn Ctrl^C bzw. Strg^C gedrückt wird.
Um ein Event zu abonnieren, benötigen wir eine Anweisung, um eine Registrierung durchzuführen und eine Event-Funktion. Hierfür benötigen wir einen Event-Handler und Event-Argumente. Mit dem += Operator können wir ein Event registrieren. Hierfür muss ein Objekt der Klasse EventHandler dem Event zugewiesen werden. Im Konstruktor wird die Event-Funktion übergeben. Eine Event-Funktion besitzt immer zwei Übergabeparameter und keinen Rückgabewert. Die Übergabeparameter sind das Objekt, welches das Event ausgelöst (oftmals wird hier der Variablenname „sender“ verwendet) hat und die Event-Argumente (Klasse EventArgs, oftmals wird hier der Variablenname „e“ verwendet). Über die Basisklasse EventArgs und EventHandler können keine zusätzliche Informationen an die Event-Funktion über die Event-Argumente weitergegeben werden. Deshalb werden, wenn zusätzliche Informationen erforderlich sind, von EventArgs und EventHandler abgeleitete Klassen erstellt und in der Event-Funktion verwendet (z. B. ConsoleCancelEventArgs und ConsoleCancelEventHandler). Über den -= Operator kann ein Event auch wieder de-registriert werden. Wichtig zu wissen ist, dass ein Herausgeber mehrere Abonnenten haben kann.
Program.cs
using System; namespace CSV20.Ereignisse { class Program { static void Main(string[] args) { Console.CancelKeyPress += new ConsoleCancelEventHandler(AbbruchKommado); Console.WriteLine("Bitte drücken Sie Ctrl^C bzw. Strg^C ..."); // auf Auslösung des Events warten Console.ReadKey(); } private static void AbbruchKommado(object sender, ConsoleCancelEventArgs e) { Console.WriteLine("Event von Ctrl^C bzw. Strg^C erhalten!"); // Konsole offen halten, sodass der User die Nachricht lesen kann Console.ReadKey(); } } }