Delegate 语句

用于声明委托。 委托是引用类型或对象的实例方法的引用类型 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 Astype2type, ...])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

另请参阅