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

Siehe auch