Delegate 语句

用于声明委托。 委托是引用类型的 Shared 方法或对象的实例方法的引用类型。 任何具有匹配的参数和返回类型的过程都可以用于创建此委托类的实例。 然后,可以通过委托实例调用该过程。

语法

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

组成部分

术语 定义
attrlist 可选。 应用于此委托的属性列表。 用逗号分隔多个属性。 必须将特性列表括进尖括号(“<”和“>”)中。
accessmodifier 可选。 指定哪些代码可以访问委托。 可以是以下值之一:

- Public。 任何代码,可以访问声明委托可以访问它的元素。
- 受保护。 只有委托类或派生类中的代码才能访问它。
- Friend。 只有同一程序集中的代码可以访问委托。
- Private。 只有声明委托的元素中的代码才能访问它。

- Protected Friend — 只有委托类、派生类或同一程序集中的代码才能访问它。
- Protected Friend — 只有同一程序集中委托类或派生类的代码才能访问它。
Shadows 可选。 指示此委托重新声明并隐藏基类中具有相同名称的编程元素或重载元素集。 可以与任何其他类型一起隐藏任何类型的已声明元素。

隐藏的元素不可在隐藏它的派生类中使用(除了从隐藏元素不可访问的位置)。 例如,如果 Private 元素隐藏一个基类元素,则无权访问 Private 元素的代码会改为访问该基类元素。
Sub 可选,但必须显示 SubFunction。 将此过程声明为不返回值的委托 Sub 过程。
Function 可选,但必须显示 SubFunction。 将此过程声明为不返回值的委托 Function 过程。
name 必需。 委托类型的名称;遵循标准变量命名约定。
typeparamlist 可选。 此委托的类型参数列表。 多个类型参数以逗号分隔。 根据需要,可以使用 InOut 泛型修饰符来声明每个类型参数。 必须将类型列表括在括号中,然后使用 Of 关键字引入它。
parameterlist 可选。 调用时,传递给过程的参数列表。 必须将参数列表括在括号中。
type 如果指定 Function 过程,则为必需。 返回值的数据类型。

注解

Delegate 语句定义参数和委托类的返回类型。 任何具有匹配的参数和返回类型的过程都可以用于创建此委托类的实例。 然后,可以通过调用委托的 Invoke 方法,通过委托实例调用该过程。

可以在命名空间、模块、类或结构级别声明委托,但不能在过程中声明委托。

每个委托类均可定义将对象方法指定传递到的构造函数。 委托构造函数的自变量必须是对方法的引用或 lambda 表达式。

若要指定对方法的引用,请使用以下语法:

AddressOf [expression.]methodname

expression 的编译时类型必须是类或接口的名称,此类或接口包含指定名称的方法,其签名与委托类的签名一致。 methodname 可以是共享方法,也可以是实例方法。 即使为类的默认方法创建委托,methodname 也不是可选的。

若要指定 lambda 表达式,请使用以下语法:

Function ([parm As type, parm2 As type2, ...]) 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

另请参阅