Freigeben über


Delegate-Anweisung

Wird zum Deklarieren eines Delegaten verwendet. Ein Delegat ist ein Verweistyp, der auf eine Shared Methode eines Typs oder auf eine Instanzmethode eines Objekts verweist. Jede Prozedur mit übereinstimmenden Parametern und Rückgabetypen kann verwendet werden, um eine Instanz dieser Delegatenklasse zu erstellen. Die Prozedur kann dann später mithilfe der Delegateninstanz aufgerufen werden.

Syntax

[ <attrlist> ] [ accessmodifier ] _  
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]  

Bestandteile

Begriff Definition
attrlist Wahlfrei. Liste der Attribute, die für diese Stellvertretung gelten. Mehrere Attribute werden durch Kommas getrennt. Sie müssen die Attributliste in winkelige Klammern ("<" und ">") einschließen.
accessmodifier Wahlfrei. Gibt an, welcher Code auf den Delegaten zugreifen kann. Dabei kann es sich um eine der folgenden Methoden handeln:

- Öffentlich. Jeder Code, der auf das Element zugreifen kann, das die Stellvertretung deklariert, kann darauf zugreifen.
- Geschützt. Nur Code innerhalb der Klasse des Delegaten oder einer abgeleiteten Klasse kann darauf zugreifen.
- Freund. Nur Code innerhalb derselben Assembly kann auf den Delegaten zugreifen.
- Privat. Nur Code innerhalb des Elements, das die Stellvertretung deklariert, kann darauf zugreifen.

- Geschützter Freund Nur Code innerhalb der Klasse des Delegaten, einer abgeleiteten Klasse oder derselben Assembly kann auf den Delegaten zugreifen.
- Privat geschützt Nur Code innerhalb der Klasse des Delegaten oder in einer abgeleiteten Klasse in derselben Assembly kann auf den Delegaten zugreifen.
Shadows Wahlfrei. Gibt an, dass dieser Delegat ein identisch benanntes Programmierelement oder einen Satz überladener Elemente in einer Basisklasse neu deklariert und ausgeblendet. Sie können jede Art deklarierter Elemente mit jeder anderen Art abschatten.

Ein abgeschattetes Element ist nicht innerhalb der abgeleiteten Klasse verfügbar, die es schattiert, es sei denn, auf den Schattenelement kann nicht zugegriffen werden. Wenn z. B. ein Element ein Private Basisklassenelement schattiert, greift Code, der nicht über die Berechtigung zum Zugriff auf das Private Element verfügt, stattdessen auf das Basisklassenelement zu.
Sub Optional, aber entweder Sub oder Function muss angezeigt werden. Deklariert diese Prozedur als Stellvertretungsprozedur Sub , die keinen Wert zurückgibt.
Function Optional, aber entweder Sub oder Function muss angezeigt werden. Deklariert diese Prozedur als Stellvertretungsprozedur Function , die einen Wert zurückgibt.
name Erforderlich. Name des Delegattyps; folgt standardbenennungskonventionen für Variablen.
typeparamlist Wahlfrei. Liste der Typparameter für diesen Delegat. Mehrere Typparameter werden durch Kommas getrennt. Optional kann jeder Typparameter mithilfe von InOut generischen Modifizierern variant deklariert werden. Sie müssen die Typliste in Klammern einschließen und mit dem Of Schlüsselwort einführen.
parameterlist Wahlfrei. Liste der Parameter, die beim Aufrufen an die Prozedur übergeben werden. Sie müssen die Parameterliste in Klammern einschließen.
type Erforderlich, wenn Sie eine Function Prozedur angeben. Datentyp des Rückgabewerts.

Bemerkungen

Die Delegate Anweisung definiert den Parameter und rückgabetypen einer Delegatenklasse. Jede Prozedur mit übereinstimmenden Parametern und Rückgabetypen kann verwendet werden, um eine Instanz dieser Delegatenklasse zu erstellen. Die Prozedur kann dann später mithilfe der Delegateninstanz aufgerufen werden, indem die Methode des Delegaten Invoke aufgerufen wird.

Stellvertretungen können auf Namespace-, Modul-, Klassen- oder Strukturebene deklariert werden, jedoch nicht innerhalb einer Prozedur.

Jede Delegatklasse definiert einen Konstruktor, der die Spezifikation einer Objektmethode übergeben wird. Ein Argument für einen Delegatkonstruktor muss entweder ein Verweis auf eine Methode oder ein Lambda-Ausdruck sein.

Verwenden Sie die folgende Syntax, um einen Verweis auf eine Methode anzugeben:

AddressOf [expression.]methodname

Der Kompilierungszeittyp des expression Typs muss der Name einer Klasse oder einer Schnittstelle sein, die eine Methode des angegebenen Namens enthält, deren Signatur der Stellvertretungsklasse entspricht. Dies methodname kann eine freigegebene Methode oder eine Instanzmethode sein. Dies methodname ist nicht optional, auch wenn Sie einen Delegaten für die Standardmethode der Klasse erstellen.

Verwenden Sie die folgende Syntax, um einen Lambda-Ausdruck anzugeben:

Function ([parm As type, parm2 As type2, ...]) expression

Die Signatur der Funktion muss mit der des Delegattyps übereinstimmen. Weitere Informationen zu Lambda-Ausdrücken finden Sie unter Lambda-Ausdrücke.

Weitere Informationen zu Stellvertretungen finden Sie unter "Stellvertretungen".

Beispiel

Im folgenden Beispiel wird die Delegate Anweisung verwendet, um einen Delegat für das Arbeiten mit zwei Zahlen zu deklarieren und eine Zahl zurückzugeben. Die DelegateTest Methode verwendet eine Instanz eines Delegaten dieses Typs und verwendet sie zum Arbeiten mit Zahlenpaaren.

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