委托可用于调用其他对象方法的对象,它的功能和C函数指针类似,可以通过一个到过程本身的指针对过程进行调用。委托与其他编程语言中所使用的函数指针相似,因此有时也称为“类型安全的函数指针”。但与函数指针不同的是,Visual Basic委托是基于System.Delegate类的引用类型。委托可以引用共享方法(无需类的特定实例便可调用的方法)和实例方法。
委托的声明与过程的声明类似。例如:
Delegate Sub SimpleDelegate(ByVal msg As String)
这个语句在Visual Basic在后台创建了一个名为SimpleDelegate的新类,该类是从System.Delegate类继承而来的。一旦定义了SimpleDelegate委托类,就可以为该委托类声明一个变量:
Dim deleg As SimpleDelegate
接下来创建一个SimpleDelegate委托类的实例对象:
Deleg=New SimpleDelegate(Addressof DisplayMsg)
其中,DisplayMsg是一个过程,其参数列表和SimpleDelegate委托相同:
Sub DisplayMsg(ByVal msg As String)
Console.WriteLine(msg)
End Sub
现在可以通过使用deleg变量的Invoke方法调用DisplayMsg过程,SimpleDelegate类从System.Delegate类继承了该方法。例如:
deleg.lnvoke("Hello")
在程序中使用委托,大大提高了程序的灵活性。例如,在程序中有一个遵循SimpleDelegate语法的过程:
Sub PopuMsg(ByVal msg As String)
MsgBox(msg)
End Sub
现在就可以使用SimpleDelegate委托调用过程PopupMsg:
deleg=New SimpleDelegate(Addressof PopupMsg)
deleg.lnvoke("Hello")
在上面的程序中,为了找到特定方法的地址,使用AddressOf运算符。这个运算符可以返回任何过程和方法的地址。实际上,通常可以直接将AddressOf的结果赋值到一个Delegate变量,而无需显式地创建一个相应类型的Delegate对象:
deleg= Addressof PopupMsg
Module Module1
'1.声明委托
Delegate Function SimpleDelegate(ByVal x As Integer, ByVal y As Integer) As Integer
Public Class Compare
'3.被委托的函数与委托签名相同,即参数相同
Shared Function Max(ByVal a As Integer, ByVal b As Integer) As Integer
Dim Result As Integer
If a > b Then
Result = a
Else
Result = b
End If
Return Result
End Function
End Class
Sub Main()
'2.声明委托变量
Dim deleg As SimpleDelegate
'4.创建委托实例
deleg = AddressOf Compare.Max
Dim a, b, c As Integer
Console.WriteLine("输入一个数")
a = Console.ReadLine
Console.WriteLine("输入第二个数")
b = Console.ReadLine
'5.调用委托
c = deleg.Invoke(a, b)
Console.WriteLine("两个数中较大的数是:" & c)
Console.Read()
End Sub
End Module