VB.NET 委托 Delegate Action Func

VB.NET 委托 :Delegate、 Action、 Func


委托,是CTS(公共类型系统)规定的5种类型之一(类类型、结构类型、接口类型、枚举类型、委托类型)。它能够调用对象的方法(实例方法)和类的方法(静态方法、在VB.NET里的Shared方法)。 实现间接访问某一封装的函数方法,始终明确,委托可被视作类

Delegate

Delegate 是委托的祖宗,ActionFunc是VB.NET简化的委托。
委托实现的步骤:
1. 创建委托(相当于创建类)

    Public Delegate Function myact(str As String) As Integer //创建委托 有返回值FunctionPublic 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

实例

本文实例是两个窗口间的通信,MainFormChildForm,在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在一起。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值