Ereignisse und Delegaten
Aktualisiert: November 2007
Ein Ereignis ist eine Meldung, die von einem Objekt gesendet wird, um das Auftreten einer Aktion zu signalisieren. Die Aktion kann durch Benutzerinteraktionen wie einen Mausklick oder durch andere Programmlogik ausgelöst worden sein. Das Objekt, das das Ereignis auslöst, wird als Ereignissender bezeichnet. Das Objekt, das das Ereignis abfängt und darauf reagiert, wird als Ereignisempfänger bezeichnet.
Bei der Ereigniskommunikation weiß die Ereignissenderklasse nicht, welches Objekt bzw. welche Methode das ausgelöste Ereignis empfängt (behandelt). Zwischen der Quelle und dem Empfänger ist daher ein Vermittler (oder zeigerähnlicher Mechanismus) erforderlich. .NET Framework definiert einen speziellen Typ (Delegate), der die Funktionen eines Funktionszeigers bereitstellt.
Ein Delegat ist eine Klasse, die einen Verweis auf eine Methode enthalten kann. Im Gegensatz zu anderen Klassen verfügt eine Delegatklasse über eine Signatur und kann nur Verweise auf Methoden enthalten, die die gleiche Signatur haben. Ein Delegat entspricht insofern einem typsicheren Funktionszeiger oder einem Rückruf. Während Delegaten auch anders verwendet werden können, geht es in diesem Thema um die Funktion von Delegaten bei der Ereignisbehandlung. Mit einer Delegatdeklaration ist eine Delegatklasse ausreichend definiert. Die Deklaration enthält die Signatur des Delegaten, und die Common Language Runtime stellt die Implementierung bereit. Das folgende Beispiel veranschaulicht die Deklaration eines Ereignisdelegaten.
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
Die Syntax entspricht der einer Methodendeklaration, wobei das Schlüsselwort delegate den Compiler informiert, dass AlarmEventHandler ein Delegattyp ist. Gemäß der Konvention verfügen Ereignisdelegaten in .NET Framework über zwei Parameter: die Quelle, die das Ereignis ausgelöst hat, und die Daten zu dem Ereignis.
Eine Instanz des AlarmEventHandler-Delegaten kann an jede Methode gebunden werden, deren Signatur mit der Signatur des Delegaten übereinstimmt, z. B. die AlarmRang-Methode der WakeMeUp-Klasse im folgenden Beispiel.
public class WakeMeUp
{
// AlarmRang has the same signature as AlarmEventHandler.
public void AlarmRang(object sender, AlarmEventArgs e)
{...};
...
}
Public Class WakeMeUp
' AlarmRang has the same signature as AlarmEventHandler.
Public Sub AlarmRang(sender As Object, e As AlarmEventArgs)
...
End Sub
...
End Class
Benutzerdefinierte Ereignisdelegaten sind nur dann erforderlich, wenn ein Ereignis Ereignisdaten generiert. Viele Ereignisse, einschließlich einiger Benutzeroberflächenereignisse wie Mausklicks, generieren keine Ereignisdaten. In diesen Fällen ist der in der Klassenbibliothek für das datenlose Ereignis bereitgestellte Ereignisdelegat System.EventHandler angebracht. Im Folgenden finden Sie die entsprechende Deklaration.
delegate void EventHandler(object sender, EventArgs e);
Public Delegate Sub EventHandler(sender As Object, e As EventArgs)
Ereignisdelegaten sind Multicastdelegaten, d. h., sie können Verweise auf mehrere Methoden für die Ereignisbehandlung enthalten. Ausführliche Informationen finden Sie unter Delegate. Delegaten bieten Flexibilität und eine genaue Steuerung bei der Ereignisbehandlung. Ein Delegat fungiert als ein Ereignisverteiler für die Klasse, die das Ereignis auslöst, indem er eine Liste der registrierten Ereignishandler für das Ereignis verwaltet.
Details zum Verwenden von Delegaten für Ereignisfunktionen in einer Komponente oder einem Steuerelement finden Sie unter Auslösen eines Ereignisses.
Eine Übersicht über die Verarbeitung von Ereignissen in Anwendungen finden Sie unter Behandeln von Ereignissen.
Siehe auch
Aufgaben
Gewusst wie: Auslösen und Behandeln von Ereignissen
Gewusst wie: Verbinden von Ereignishandlermethoden mit Ereignissen