用于声明委托。 委托是引用类型或对象的实例方法的引用类型 Shared
。 任何具有匹配参数和返回类型的过程都可用于创建此委托类的实例。 然后,可以通过委托实例调用该过程。
语法
[ <attrlist> ] [ accessmodifier ] _
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]
部件
术语 | 定义 |
---|---|
attrlist |
可选。 应用于此委托的属性列表。 多个属性用逗号分隔。 必须将 属性列表 括在尖括号(“< ”和“)> 中。 |
accessmodifier |
可选。 指定哪些代码可以访问委托。 可以是以下值之一: - 公共。 任何可访问声明委托的元素的代码都可以访问它。 - 受保护。 只有委托的类或派生类中的代码才能访问它。 - 朋友 只有同一程序集中的代码可以访问委托。 - 专用。 只有声明委托的元素中的代码才能访问它。 - 受保护的好友 只有委托类、派生类或同一程序集中的代码才能访问委托。 - 专用保护 只有委托的类或同一程序集中的派生类中的代码才能访问委托。 |
Shadows |
可选。 指示此委托在基类中重新声明并隐藏同名编程元素或重载元素集。 可以使用任何其他类型隐藏任何类型的声明元素。 阴影元素在派生类中不可用,但阴影元素不可访问的位置除外。 例如,如果 Private 元素隐藏基类元素,则无权访问元素的代码将改为访问 Private 基类元素。 |
Sub |
可选,但 Sub 必须显示或 Function 必须显示。 将此过程声明为不返回值的委托 Sub 过程。 |
Function |
可选,但 Sub 必须显示或 Function 必须显示。 将此过程声明为返回值的委托 Function 过程。 |
name |
必填。 委托类型的名称;遵循标准变量命名约定。 |
typeparamlist |
可选。 此委托的类型参数列表。 多个类型参数用逗号分隔。 (可选)可以使用 In 泛型修饰符声明 Out 每种类型参数。 必须将 类型列表 括在括号中,并使用关键字来引入它 Of 。 |
parameterlist |
可选。 调用过程时传递给过程的参数列表。 必须将 参数列表 括在括号中。 |
type |
如果指定过程, Function 则为必需。 返回值的数据类型。 |
注解
该 Delegate
语句定义委托类的参数和返回类型。 任何具有匹配参数和返回类型的过程都可用于创建此委托类的实例。 然后,可以通过调用委托的方法调用委托实例来调用 Invoke
该过程。
可以在命名空间、模块、类或结构级别声明委托,但不能在过程中进行声明。
每个委托类定义一个构造函数,该构造函数接收对象方法的规范。 委托构造函数的参数必须是对方法或 lambda 表达式的引用。
若要指定对方法的引用,请使用以下语法:
AddressOf
[expression
.]methodname
编译时类型 expression
必须是类的名称或包含指定名称的方法的接口,其签名与委托类的签名匹配。
methodname
可以是共享方法或实例方法。 即使为类的默认方法创建委托,methodname
也不是可选的。
若要指定 lambda 表达式,请使用以下语法:
Function
([parm
As, parm2
Astype2
type
, ...])expression
函数的签名必须与委托类型的签名一致。 有关 lambda 表达式的详细信息,请参阅 Lambda 表达式。
有关委托的详细信息,请参阅 “委托”。
示例:
以下示例使用 Delegate
语句声明委托以对两个数字进行作并返回一个数字。 该方法 DelegateTest
采用此类型的委托的实例,并使用它对数字对进行作。
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