Delegate-Anweisung

Aktualisiert: November 2007

Wird zur Deklaration eines Delegaten verwendet. Ein Delegat ist ein Referenztyp, der auf eine Shared-Methode eines Typs oder auf eine Instanzenmethode eines Objekts verweist. Jede Prozedur mit identischen Parameter- und Rückgabetypen kann zum Erstellen einer Instanz dieser Delegatklasse verwendet werden. Die Prozedur kann anschließend mittels der Delegatinstanz aufgerufen werden.

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

Bestandteile

  • attrlist
    Optional. Liste der Attribute, die für diesen Delegaten zutreffen. Mehrere Attribute werden durch Komma voneinander getrennt. Sie müssen die Attributliste in spitze Klammern ("<" und ">") einschließen.

  • accessmodifier
    Optional. Gibt an, welcher Code auf den Delegaten zugreifen kann. Einer der folgenden Werte ist möglich:

    • Public. Jeder Code, der auf das Element zugreifen kann, das den Delegaten deklariert, kann auf diesen zugreifen.

    • Protected. Nur Code innerhalb der Klasse des Delegaten oder innerhalb einer abgeleiteten Klasse kann auf den Delegaten zugreifen.

    • Friend. Nur Code innerhalb der gleichen Assembly kann auf den Delegaten zugreifen.

    • Privat. Nur Code innerhalb des Elements, das den Delegaten deklariert, kann auf diesen zugreifen.

    Sie können Protected Friend angeben, um den Zugriff von Code innerhalb der Klasse des Delegaten, innerhalb einer abgeleiteten Klasse oder innerhalb der gleichen Assembly zu ermöglichen.

  • Shadows
    Optional. Gibt an, dass dieser Delegat ein Programmierelement mit der gleichen Bezeichnung oder eine Gruppe überladener Elemente in einer Basisklasse erneut deklariert und ausblendet. Sie können jede Art von deklariertem Element mit einer anderen Art spiegeln.

    Ein Element, für das ein Shadowing durchgeführt wurde, ist innerhalb der abgeleiteten Klasse, die das Shadowing durchführt, nicht verfügbar, es sei denn, auf das Element, welches das Shadowing durchführt, kann nicht zugegriffen werden. Wenn z. B. ein Private-Element ein Shadowing eines Basisklassenelements durchführt, greift Code ohne Zugriffsberechtigung für das Private-Element stattdessen auf das Basisklassenelement zu.

  • Sub
    Optional (entweder muss Sub oder Function angegeben werden). Deklariert diese Prozedur als Sub-Prozedur des Delegaten, die keinen Wert zurückgibt.

  • Function
    Optional (entweder muss Sub oder Function angegeben werden). Deklariert diese Prozedur als Function-Prozedur des Delegaten, die einen Wert zurückgibt.

  • name
    Erforderlich. Name des Delegattyps; entspricht den Standardnamenskonventionen für Variablen.

  • typeparamlist
    Optional. Liste mit Typparametern für diesen Delegaten. Mehrere Typparameter werden durch Komma voneinander getrennt. Sie müssen die Typenliste in Klammern einschließen und mit dem Of-Schlüsselwort einleiten.

  • parameterlist
    Optional. Liste mit Parametern, die an die Prozedur übergeben werden, wenn diese aufgerufen wird. Sie müssen die Parameterliste in Klammern einschließen.

  • type
    Erforderlich, wenn Sie eine Function-Prozedur angeben. Datentyp des Rückgabewerts.

Hinweise

Die Delegate-Anweisung definiert die Parameter- und Rückgabetypen einer Delegatklasse. Jede Prozedur mit identischen Parameter- und Rückgabetypen kann zum Erstellen einer Instanz dieser Delegatklasse verwendet werden. Die Prozedur kann anschließend über die Delegatinstanz aufgerufen werden. Dazu rufen Sie die Invoke-Methode des Delegaten auf.

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

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.

Beispiel

Im folgenden Beispiel wird mit der Delegate-Anweisung ein Delegat deklariert, mit dem zwei Zahlen bearbeitet werden und eine Zahl zurückgegeben wird. Die DelegateTest-Methode verwendet eine Instanz eines Delegaten dieses Typs und bearbeitet damit Zahlenpaare.

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

Aufgaben

Gewusst wie: Verwenden einer generischen Klasse

Konzepte

Generische Typen in Visual Basic

Referenz

AddressOf-Operator

Of

Weitere Ressourcen

Delegaten in Visual Basic