委托,是CTS(公共类型系统)规定的5种类型之一(类类型、结构类型、接口类型、枚举类型、委托类型)。它能够调用对象的方法(实例方法)和类的方法(静态方法、在VB.NET里的Shared方法)。 实现间接访问某一封装的函数方法,始终明确,委托可被视作类
Delegate
Delegate
是委托的祖宗,Action
和Func
是VB.NET简化的委托。
委托实现的步骤:
1. 创建委托(相当于创建类)
Public Delegate Function myact(str As String) As Integer //创建委托 有返回值Function型
Public Delegate Sub myact2(str As String) //创建委托 无返回值 Sub型
2. 声明委托
Public myaction As myact
Public myaction2 As myact2
3. 委托实例化
将前边声明的委托与即将创建的委托方法相关联
方法①:使用函数地址提取 Addressof
来实例化委托
方法②:用New
实例化委托并绑定被委托的方法
myact = AddressOf Mycall //方法①
myact = New myact(AddressOf Mycall ) //方法②
4. 创建委托调用的方法
以myact
为例,初始创建委托类型时,是 Function(str As String) As Integer
,那么委托调用的方式类型也是如此。参数为String
,返回值为Integer
。
Private Function Mycall(str As String) As String
TextBox1.Text = str
Return 123
End Function
5. 委托调用
num = myaction.Invoke("调用成功!")
Action
VB.NET中 Action
定义:Public Delegate Function Func(Of In T)
,无返回值
因此Action
使用步骤同Delegate
,优点在于直接省略了步骤1
,不需要再创建委托了,Action本身即是委托,使用时直接声明就可以:
第一步:Public Myaction As Action
第二步:委托实例化
第三步:创建委托调用方法
第四步:调用委托
Func
定义:Public Delegate Function Func(Of In T, Out TResult) As TResult
,有返回值
使用方法同Action
实例
本文实例是两个窗口间的通信,MainForm
和ChildForm
,在Module
中声明委托。
功能:MainForm窗口、ChildForm窗口间互相传值
myModule.vb
Module myModule
'声明委托
Public myaction As Func(Of String, String)
'创建委托
'Public Delegate Function myact(str As String) As Integer
'Public Delegate Sub myact2(str As String)
'声明委托
'Public myaction As myact
'Public myaction2 As myact2
Public Mainf As New MainForm
Sub Main()
Application.EnableVisualStyles() '启用xp视觉样式
Application.Run(Mainf) '加不加()都是调用默认构造函数,最好加
End Sub
End Module
mainForm.vb
Public Class MainForm
Dim childF As New ChildForm
Private Function Mycall(str As String) As String
TextBox1.Text = str
Return 123
End Function
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
childF.Show()
childF.RSMsg = TextBox1.Text
myaction = AddressOf Mycall
'myaction2 = New myact2(AddressOf Mycall)
End Sub
End Class
childForm.vb
Public Class ChildForm
Public Property RSMsg() As String
Get
Return TextBox1.Text
End Get
Set(ByVal Value As String)
TextBox1.Text = Value
End Set
End Property
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim num As Integer
num = myaction.Invoke(RSMsg)
End Sub
End Class
运行结果
参考资料
https://blog.youkuaiyun.com/zyjq52uys/article/details/85621639
https://blog.youkuaiyun.com/dzweather/article/details/51533259
https://blog.youkuaiyun.com/m0_53168509/article/details/117883764
https://blog.youkuaiyun.com/zyjq52uys/article/details/85621639
注意点
使用Delegate
时,创建委托和声明委托应当在同一个文件Module
中,这样子ChildForm
中才可以调用。即步骤1、2在一起。