Delegate-Anweisung
Wird verwendet, um einen Delegaten zu deklarieren. Ein Delegat ist ein Verweistyp und verweist auf eine Shared
-Methode eines Typs oder auf eine Instanzmethode eines Objekts. Jede Prozedur mit passenden Parametern und Klassen sowie passendem Rückgabetyp kann dazu verwendet werden, eine Instanz dieser Delegatklasse zu erstellen. Die Prozedur kann später mithilfe der Delegatinstanz aufgerufen werden.
Syntax
[ <attrlist> ] [ accessmodifier ] _
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]
Bestandteile
Begriff | Definition |
---|---|
attrlist |
Dies ist optional. Liste der Attribute, die für dieses Delegat gelten. Mehrere Attribute werden durch Kommas getrennt. Sie müssen die Attributliste in spitze Klammern ("< " und "> ") einschließen. |
accessmodifier |
Optional. Gibt an, welcher Code auf dieses Delegat zugreifen kann. Dabei kann es sich um eine der folgenden Methoden handeln: - Public. Code, der auf das Delegat zugreifen kann, welches ihn deklariert, hat Zugriff. - Protected. Nur Code innerhalb der Klasse des Delegats oder einer abgeleiteten Klasse hat Zugriff. - Friend. Nur Code innerhalb des selben Assembly kann auf das Delegat zugreifen. - Private. Nur Code innerhalb des Elements, welches das Delegat deklariert, kann darauf zugreifen. - Protected Friend. Nur Code in der Klasse des Delegats, einer abgeleiteten Klasse oder dem selben Assembly hat Zugriff. - Private Protected. Nur Code in der Klasse des Delegats oder in einer abgeleiteten Klasse in dem selben Assembly hat Zugriff. |
Shadows |
Optional. Gibt an, dass dieses Delegat ein identisch benanntes Programmierelement oder einen Satz überladener Elemente in einen Basisklasse erneut deklariert und ausblendet. Sie können ein Shadowing von jedem deklarierten Element mit einer anderen Art vornehmen. Ein schattiertes Element steht in der abgeleiteten Klasse, die es spiegelt, nicht zur Verfügung, und zwar mit Ausnahme von dem Punkt, wo nicht auf das Shadowing-Element zugriffen werden kann. Wenn beispielsweise ein Private -Element ein Basisklassenelement spiegelt, greift der Code, der nicht über die Berechtigung für den Zugriff auf das Private -Element verfügt, anstelle auf das Basisklassenelement zu. |
Sub |
Optional, aber es muss Sub oder Function angezeigt werden. Deklariert diese Prozedur als Delegat-Sub -Prozedur, die keinen Wert zurückgibt. |
Function |
Optional, aber es muss Sub oder Function angezeigt werden. Deklariert diese Prozedur als Delegat-Function -Prozedur, die einen Wert zurückgibt. |
name |
Erforderlich. Der Name des Delegattyps; folgt standardmäßigen Variablennamenskonventionen. |
typeparamlist |
Optional. Liste mit Typparametern für dieses Delegat. Mehrere Typparameter werden durch Kommas getrennt. Optional kann jeder Typparameter mit generischen In - und Out -Modifizierern als Variante deklariert werden. Sie müssen die Typliste in Klammern einschließen und mit dem Of -Schlüsselwort einführen. |
parameterlist |
Optional. Liste der Parameter, die an die Prozedur übergeben werden, wenn sie aufgerufen wird. Sie müssen die Parameterliste in Klammern umschließen. |
type |
Erforderlich, wenn Sie eine Function -Prozedur angeben. Datentyp des Rückgabewerts. |
Bemerkungen
Die Delegate
-Anweisung definiert die Parameter- und Rückgabetypen einer Delegatklasse. Jede Prozedur mit passenden Parametern und Klassen sowie passendem Rückgabetyp kann dazu verwendet werden, eine Instanz dieser Delegatklasse zu erstellen. Die Prozedur kann später mithilfe der Delegatinstanz aufgerufen werden, indem die Invoke
-Methode des Delegats aufgerufen wird.
Delegate können auf Namespace-, Modul-, Klassen- oder Strukturebene deklariert werden, aber nicht innerhalb einer Prozedur.
Jede Delegatklasse definiert einen Konstruktor, dem 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. Bei methodname
kann es sich um eine freigegebene Methode oder um eine Instanzmethode handeln. Der 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 der des Delegattyps übereinstimmen. Weitere Informationen zu Lambdaausdrücken finden Sie unter Lambda Expressions (Lambdaausdrücke).
Weitere Informationen über Delegaten finden Sie unter Delegaten.
Beispiel
Im folgenden Beispiel wird die Delegate
-Anweisung verwendet, um ein Delegat für den Betrieb mit zwei Zahlen zu deklarieren und eine Zahl zurückzugeben. Die DelegateTest
-Methode nimmt eine Instanz eines Delegats dieses Typs an und verwendet sie, um mit Zahlenpaaren zu arbeiten.
Delegate Function MathOperator(
ByVal x As Double,
ByVal y As Double
) As Double
Function AddNumbers(
ByVal x As Double,
ByVal y As Double
) As Double
Return x + y
End Function
Function SubtractNumbers(
ByVal x As Double,
ByVal y As Double
) As Double
Return x - y
End Function
Sub DelegateTest(
ByVal x As Double,
ByVal op As MathOperator,
ByVal y As Double
)
Dim ret As Double
ret = op.Invoke(x, y) ' Call the method.
MsgBox(ret)
End Sub
Protected Sub Test()
DelegateTest(5, AddressOf AddNumbers, 3)
DelegateTest(9, AddressOf SubtractNumbers, 3)
End Sub