vb.net中的委托与事件

    委托是CTS(公共类型系统)规定的5种类型之一(类类型、结构类型、接口类型、枚举类型、委托类型)它是一种类型可以用来调用其他对象的方法,也称为函数指针。其实在vb.net中委托也可以当做是可以用来共享其他对象的方法的对象。当程序必须通过调用一个方法来执行某个操作(调用某个方法),但在编译时不知道该方法是什么时,就可以使用委托。委托允许在程序运行时指定调用的方法,委托的特点是面向对象的,类型是安全的。
委托的使用:

首先创建一个委托:delegate{sub|function}DelegateType(参数1,参数2)由于委托是一种类型所以在创建一个委托之后就是将它声明并实例化,第二步就是声明实例化委托并与对应方法绑定dim a as delegateType(Delegate sub),声明委托时注意它的参数类型与数量要跟创建的保持一致。第三就是用委托间接调用被委托的方法

例:

Public Class Form1

Delegate Sub fr(ByVal str As String) '创建一个委托
Dim a As New fr(AddressOf talk) '声明实例化委托并绑定被委托的方法:talk
 Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MyBase.Load
        a.Invoke("hello")'运行指定的委托即间接调用talk方法
    End Sub
Public Sub talk(ByVal str As String)
        MsgBox(str)

    End Sub
End Class

委托在vb.net中的另一种形式:事件

有了委托就可以透过方法来调用指定方法,这种指定不是编译时指定的而是在程序运行时指定,所以在面向对象程序设计中委托的出现可以说降低了类与类之间的耦合关系也就是实现了解耦。委托在面向对象程序中的最好应用就是事件。

在vb.net中事件可以看成为一种特殊的委托,所以就可以将一些sub或function委托给事件,当某一方法触发事件时就会执行委托给该事件的sub或function。

vb.net中自定义事件:

Public Class Test1'自定义类
    
    Public Event speak(ByVal str As String) '自定义事件speak
    Public Sub Te(ByVal str As String) '定义触发事件函数
        RaiseEvent speak(str) '触发事件
    End Sub
End Class

Public Event speak(ByVal str As String)
等效于
Delegate Sub fr(ByVal str As String)
Public Event speak As fr

声明事件对象并将sub或function委托给事件:

方法一:

Module Module1
    Public WithEvents tea As New Test1() '声明事件对象
    Public Sub talk(ByVal str As String) Handles tea.speak '将talk委托给Test类中speak事件
        Console.WriteLine(str)
    End Sub
    Sub Main()
        tea.Te("hello") '执行Test1中触发speak事件的方法
    End Sub
End Module

方法二:

Module Module1
    Public tea As New Test1() '声明事件对象
    Public Sub talk(ByVal str As String)
        Console.WriteLine(str)
    End Sub
    Sub Main()
        AddHandler tea.speak,AddressOf talk '将talk方法委托给Test1类的speak事件
        tea.Te("hello") '执行Test1中触发speak事件的方法
    End Sub
End Module

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...