Delegate — Instrukcja
Służy do deklarowania delegata. Delegat to typ odwołania, który odwołuje się do Shared
metody typu lub metody wystąpienia obiektu. Każdą procedurę z pasującym parametrem i typami zwracanymi można użyć do utworzenia wystąpienia tej klasy delegata. Następnie można wywołać procedurę za pomocą wystąpienia delegata.
Składnia
[ <attrlist> ] [ accessmodifier ] _
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]
generatora
Termin | Definicja |
---|---|
attrlist |
Opcjonalny. Lista atrybutów, które mają zastosowanie do tego delegata. Wiele atrybutów jest rozdzielonych przecinkami. Należy ująć listę atrybutów w nawiasach kątowych ("< " i "> "). |
accessmodifier |
Opcjonalny. Określa, jaki kod może uzyskać dostęp do delegata. Może być jednym z następujących elementów: - Publiczne. Dowolny kod, który może uzyskać dostęp do elementu, który deklaruje, że delegat może uzyskać do niego dostęp. - Chronione. Dostęp do niego może uzyskać tylko kod w klasie delegata lub klasie pochodnej. - Przyjaciel. Tylko kod w tym samym zestawie może uzyskać dostęp do delegata. - Prywatne. Tylko kod w elemecie, który deklaruje, że delegat może uzyskać do niego dostęp. - Chroniony przyjaciel tylko kod w klasie delegata, klasa pochodna lub ten sam zestaw może uzyskać dostęp do delegata. - Prywatny kod chroniony tylko 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. Możesz cieniować dowolny rodzaj zadeklarowanego elementu z dowolnym innym rodzajem. Element w tle jest niedostępny z klasy pochodnej, która go zaciemnia, z wyjątkiem tego, gdzie element cieniowania jest niedostępny. Jeśli na przykład Private element w tle element klasy bazowej, kod, który nie ma uprawnień dostępu do elementu, uzyskuje dostęp Private do elementu klasy bazowej. |
Sub |
Opcjonalnie, ale musi pojawić się element Sub lub Function . Deklaruje tę procedurę jako procedurę delegata Sub , która nie zwraca wartości. |
Function |
Opcjonalnie, ale musi pojawić się element Sub lub Function . Deklaruje tę procedurę jako procedurę delegata Function , która zwraca wartość. |
name |
Wymagany. Nazwa typu delegata; jest zgodna ze standardową konwencją 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 i In Out modyfikatorów ogólnych. Należy ująć listę typów w nawiasy i wprowadzić ją za pomocą słowa kluczowego Of . |
parameterlist |
Opcjonalny. Lista parametrów przekazywanych do procedury, gdy jest wywoływana. Należy ująć listę parametrów w nawiasy. |
type |
Wymagane, jeśli określisz procedurę Function . Typ danych zwracanej wartości. |
Uwagi
Instrukcja Delegate
definiuje parametr i zwracane typy klasy delegata. Każdą procedurę z pasującymi parametrami i typami zwracanymi można użyć do utworzenia wystąpienia tej klasy delegata. Następnie można wywołać procedurę za pomocą wystąpienia delegata, wywołując metodę delegata Invoke
.
Delegaty można zadeklarować 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 expression
czasu kompilacji musi być nazwą klasy lub interfejsu, który zawiera metodę określonej nazwy, której podpis jest zgodny z podpisem klasy delegata. Może methodname
to być metoda współdzielona lub metoda wystąpienia. Element methodname
nie 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
Jako type
, parm2
jako type2
, ...]) expression
Podpis funkcji musi być zgodny z typem 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 w Delegate
celu zadeklarowania delegata do obsługi dwóch liczb i zwrócenia liczby. Metoda DelegateTest
przyjmuje wystąpienie delegata tego typu i używa go do działania na parach 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