Delegate — Instrukcja

Służy do deklarowania delegata. Delegat jest typem referencyjnym, który odwołuje się do metody typu lub do Shared metody wystąpienia obiektu. Do utworzenia wystąpienia tej klasy delegata można użyć dowolnej procedury z pasującymi parametrami i zwracanych typami. Następnie procedurę można wywołać za pomocą wystąpienia delegata.

Składnia

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

Części

Okres Definicja
attrlist Opcjonalny. Lista atrybutów, które mają zastosowanie do tego delegata. Wiele atrybutów jest rozdzielonych przecinkami. Listę atrybutów należy ująć w nawiasy kątowe (" " i " < > ").
accessmodifier Opcjonalny. Określa, jaki kod może uzyskać dostęp do delegata. Może być jedną z następujących czynności:

- Publiczny. Każdy kod, który może uzyskać dostęp do elementu, który deklaruje delegata, może uzyskać do niego dostęp.
- Chronione . Tylko kod w klasie delegata lub klasie pochodnej może uzyskać do niego dostęp.
- Znajomy. Tylko kod w tym samym zestawie może uzyskać dostęp do delegata.
- Prywatna. Tylko kod w elemencie, który deklaruje delegata, może uzyskać do niego dostęp.

- Chroniony znajomy Tylko kod w klasie delegata, klasie pochodnej lub tym samym zestawie może uzyskać dostęp do delegata.
- Private Protected Tylko kod w klasie delegata lub w klasie pochodnej w tym samym zestawie może uzyskać dostęp do delegata.
Shadows Opcjonalny. Wskazuje, że ten delegat ponownie deklaruje i ukrywa identycznie nazwany element programowania lub zestaw przeciążonych elementów w klasie bazowej. Każdy rodzaj zadeklarowanego elementu można zasłonić dowolnym innym rodzajem.

Element w tle jest niedostępny z klasy pochodnej, która go przesłania, z wyjątkiem sytuacji, w której element w tle jest niedostępny. Na przykład jeśli element przesłania element klasy bazowej, kod, który nie ma uprawnień dostępu do elementu, zamiast tego uzyskuje dostęp do Private Private elementu klasy bazowej.
Sub Opcjonalne, ale albo Sub lub Function musi się pojawić. Deklaruje tę procedurę jako procedurę Sub delegata, która nie zwraca wartości.
Function Opcjonalne, ale albo Sub lub Function musi się pojawić. Deklaruje tę procedurę jako procedurę Function delegata, która zwraca wartość.
name Wymagane. Nazwa typu delegata; zgodnie ze standardowymi konwencjami nazewnictwa zmiennych.
typeparamlist Opcjonalny. Lista parametrów typu dla tego delegata. Wiele parametrów typu jest rozdzielonych przecinkami. Opcjonalnie każdy parametr typu może być zadeklarowany jako wariant przy użyciu In Out modyfikatorów ogólnych i . Listę typów należy ująć w nawiasy i wprowadzić ją za pomocą słowa Of kluczowego .
parameterlist Opcjonalny. Lista parametrów, które są przekazywane do procedury, gdy jest wywoływana. Listę parametrów należy ująć w nawiasy.
type Wymagane w przypadku określenia Function procedury. Typ danych zwracanej wartości.

Uwagi

Instrukcja Delegate definiuje parametry i zwracane typy klasy delegata. Do utworzenia wystąpienia tej klasy delegata można użyć dowolnej procedury z pasującymi parametrami i zwracanych typów. Następnie procedurę można wywołać za pomocą wystąpienia delegata, wywołując metodę Invoke delegata.

Delegaty mogą być deklarowane na poziomie przestrzeni nazw, modułu, klasy lub struktury, ale nie w ramach procedury.

Każda klasa delegata definiuje konstruktor, który jest przekazywany do specyfikacji metody obiektu. Argument konstruktora delegata musi być odwołaniem do metody lub wyrażenia lambda.

Aby określić odwołanie do metody, użyj następującej składni:

AddressOf [expression.]methodname

Typ czasu kompilacji musi być nazwą klasy lub interfejsu, który zawiera metodę o określonej nazwie, której podpis pasuje do podpisu expression klasy delegata. Element methodname może być metodą udostępnioną lub metodą wystąpienia. Nie methodname jest opcjonalny, nawet jeśli utworzysz delegata dla domyślnej metody klasy.

Aby określić wyrażenie lambda, użyj następującej składni:

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

Podpis funkcji musi odpowiadać podpisowi typu delegata. Aby uzyskać więcej informacji na temat wyrażeń lambda, zobacz Wyrażenia lambda.

Aby uzyskać więcej informacji na temat delegatów, zobacz Delegaty.

Przykład

W poniższym przykładzie użyto instrukcji , aby zadeklarować delegata do działania na dwóch liczbach Delegate i zwrócenia liczby. Metoda przyjmuje wystąpienie delegata tego typu i używa go do obsługi DelegateTest par liczb.

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

Zobacz też