Delegaten und der AddressOf-Operator
Aktualisiert: November 2007
Delegaten sind Objekte, mit denen Sie die Methoden anderer Objekte aufrufen können. Sie werden mitunter als typsichere Funktionszeiger bezeichnet, da sie Funktionszeigern ähneln, die in anderen Programmiersprachen verwendet werden. Im Gegensatz zu Funktionszeigern sind Visual Basic-Delegaten ein Referenztyp, der auf der System.Delegate-Klasse basiert. Delegaten können sowohl auf freigegebene Methoden (d. h. Methoden, die ohne eine bestimmte Instanz einer Klasse aufgerufen werden können) als auch auf Instanzenmethoden verweisen.
Delegaten und Ereignisse
Delegaten sind in Situationen nützlich, in denen Sie einen Mittler zwischen einer aufrufenden Prozedur und der aufgerufenen Prozedur benötigen. Vielleicht soll z. B. ein Objekt, das Ereignisse auslöst, die Fähigkeit haben, in verschiedenen Situationen unterschiedliche Ereignishandler aufzurufen. Leider weiß das Objekt, das die Ereignisse auslöst, nicht im Voraus, welcher Ereignishandler ein bestimmtes Ereignis verarbeitet. Visual Basic ermöglicht es Ihnen, Ereignisse Ereignishandlern dynamisch zuzuweisen, indem Sie bei Verwendung der AddHandler-Anweisung einen Delegaten für sich erstellen. Zur Laufzeit leitet der Delegat dann Aufrufe an den entsprechenden Ereignishandler weiter.
Sie können zwar auch eigene Delegaten erstellen, doch in den meisten Fällen generiert Visual Basic den Delegaten und verarbeitet die Details. Eine Event-Anweisung definiert z. B. implizit eine Delegatklasse mit dem Namen <EventName>EventHandler als geschachtelte Klasse der Klasse, die die Event-Anweisung enthält, und mit der gleichen Signatur wie das Ereignis. Die AddressOf-Anweisung erstellt implizit eine Instanz eines Delegaten. Die folgenden beiden Codezeilen sind z. B. gleichbedeutend:
AddHandler Button1.Click, AddressOf Me.Button1_Click
' The previous line of code is shorthand for the next line of code.
AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
Die schnelle Methode zum Erstellen von Delegaten können Sie immer dort verwenden, wo der Compiler den Delegattyp anhand des Kontexts erkennen kann.
Deklarieren von Ereignissen, die einen vorhandenen Delegattyp verwenden
In manchen Situationen empfiehlt es sich, ein Ereignis so zu deklarieren, dass es einen vorhandenen Delegattyp als zugrunde liegenden Delegaten verwendet. Die folgende Syntax veranschaulicht dies:
Delegate Sub DelegateType()
Event AnEvent As DelegateType
Dies ist nützlich, wenn mehrere Ereignisse an den gleichen Handler weitergeleitet werden sollen.
Delegatvariablen und -parameter
Sie können Delegaten für andere, nicht mit Ereignissen verknüpfte Aufgaben (z. B. freies Threading) oder für Prozeduren verwenden, die zur Kompilierungszeit verschiedene Versionen von Funktionen aufrufen müssen.
Beispiel: Eine Anwendung für Gebrauchtwagen-Kleinanzeigen enthält ein Listenfeld mit den Namen von Fahrzeugen. Die Anzeigen sind nach Titel sortiert. Der Titel ist in der Regel der Name des Fahrzeugherstellers. Ein mögliches Problem tritt auf, wenn bei einigen Autos das Herstellungsjahr des Autos vor dem Herstellernamen steht. Das Problem besteht darin, dass die integrierte Suchfunktion des Listenfelds nur nach Zeichencodes sortiert. Dadurch werden alle Anzeigen, die mit dem Jahr beginnen, an den Beginn der Liste platziert, erst dann folgen die Anzeigen, die mit dem Herstellernamen beginnen.
Um dies zu beheben, können Sie eine Sortierprozedur in einer Klasse erstellen, die auf der standardmäßigen alphabetischen Sortierung basiert, die für die meisten Listenfelder gilt, jedoch zur Laufzeit auf die benutzerdefinierte Sortierung für Gebrauchtwagen umgestellt werden kann. Dafür übergeben Sie die benutzerdefinierte Sortierprozedur mithilfe von Delegaten zur Laufzeit an die Sortierklasse.
Jede Delegatklasse definiert einen Konstruktor, an den die Spezifikation einer Objektmethode übergeben wird. Ein Argument für einen Delegatkonstruktor muss ein Verweis auf eine Methode oder ein Lambda-Ausdruck sein.
Verwenden Sie die folgende Syntax, um einen Verweis auf eine Methode festzulegen:
AddressOf [expression.]methodName
Der Typ von expression muss zur Kompilierungszeit der Name einer Klasse oder Schnittstelle sein, die eine Methode des angegebenen Namens enthält, deren Signatur mit der Signatur der Delegatklasse übereinstimmt. Mit methodName kann entweder eine freigegebene Methode oder eine Instanzenmethode angegeben werden. methodName ist nicht optional, selbst dann nicht, wenn Sie einen Delegaten für die Standardmethode der Klasse erstellen.
Verwenden Sie die folgende Syntax, um einen Lambda-Ausdruck festzulegen:
Function ([parm As type, parm2 As type2, ...]) expression
Die Signatur der Funktion muss mit dem Delegattyp übereinstimmen. Weitere Informationen zu Lambdaausdrücken finden Sie unter Lambda-Ausdrücke.
Siehe auch
Aufgaben
Gewusst wie: Übergeben von Prozeduren an eine andere Prozedur in Visual Basic
Gewusst wie: Aufrufen einer Delegatenmethode
Gewusst wie: Schreiben von Ereignishandlern
Konzepte
Ereignisse und Ereignishandler