vb.net教程https://www.xin3721.com/eschool/vbnetxin3721/
委托和事件
委托,这个词一听被邪乎。几年前我还以为和律师什么的有关系。可事实上“委托”就是System.Delegate 类。它是一个类,这就意味着它是一个数据类型,而且是一个引用类型。它能够引用对象的方法(实例方法)和类的方法(静态方法、在VB 里的Shared 方法)。
使用委托可以概括为三步:声明、实例化、调用。
Public Class Class1
Shared Sub Main ()
Dim cls2 As New Class2
'实例化
Dim d1 As OneDelegate = AddressOf cls2.fun1
'调用
d1() '实际上执行fun1
'实例化
Dim d2 As OneDelegate = AddressOf Class2.fun2
'调用
d2() '实际上执行fun2
Console.ReadLine()
End Sub
End Class
'声明委托
Delegate Sub OneDelegate()
Public Class Class2
'实例方法
Public Sub fun1()
Console.WriteLine("fun1")
End Sub
'shared方法
Public Shared Sub fun2()
Console.WriteLine("fun2")
End Sub
End Class
这样直接调用委托没有什么意义。因为可以直接调用方法。那样更加简单。使用委托最多的其实是事件,因为事件是由委托实现的。现如今大多数程序都是事件驱动的。要使用事件必须正确作如下几件事:
声明事件
引发事件
编写事件处理程序
把时间处理程序和事件联系起来
声明事件
通常我们都是在编写某一个类的时候把事件添加给类。请看下面这段代码:
Public Class class3
'该类具有一个属性Prop。当该属性发生改变之后引发事件PropChanged
'添加事件PropChanged
Public Event PropChanged()
'把事件添加给一个类,指定该类可以引发该事件。
'要引发事件必须使用RaisEvent,就像下面这样。(在属性的set里面)
'注意:使用事件必须注意,事件不能具有返回值、可选参数、ParamArray参数。
Private _prop As String
'参数Prop
Public Property Prop() As String
Get
Return Me._prop
End Get
Set(ByVal Value As String)
Me._prop = Value
'当这个参数发生改变之后触发事件PropChanged
RaiseEvent PropChanged()
'这样事件就发生了。但是让这个事件发生绝对不是
'最终的目的。人们使用事件机制,是为了在事件发生
'的时候做点什么事情。所以,必须再使用这个类的
'程序里写一个函数作为事件处理程序。
'就像Class1.cls3_PropChanged(那样)
End Set
End Property
End Class
Public Class Class1
Shared Sub Main ()
Dim cls2 As New Class2
'实例化
Dim d1 As OneDelegate = AddressOf cls2.fun1
'调用
d1() '实际上执行fun1
'实例化
Dim d2 As OneDelegate = AddressOf Class2.fun2
'调用
d2() '实际上执行fun2
Dim cls1 As New Class1
cls1.TestEvent()
Console.ReadLine()
End Sub
'声明class3对象
Private cls3 As class3
'事件处理程序。准备用来处理对象cls3的PropChanged事件。
'就是说,当对象cls3.Prop被改变之后,这个函数被执行。
'这就需要把事件处理程序,也就是这个方法,和事件联系起来。
'然后再为cls3.Prop赋值。就像TestEvent方法所作的那样。
Private Sub cls3_PropChanged()
'把事件和事件处理程序分开
RemoveHandler cls3.PropChanged, _
AddressOf Me.cls3_PropChanged
Console.WriteLine("cls3_PropChanged被执行")
End Sub
Private Sub TestEvent()
Me.cls3 = New class3
'把事件处理程序和事件联系起来。
AddHandler cls3.PropChanged, AddressOf Me.cls3_PropChanged
'注意:
'还有另一种把事件和事件处理程序联系起来的方法,
'就是使用WithEvents和Handles。非常常见,所以不详述。
'为属性赋值
Me.cls3.Prop = "改变属性"
'事件这时就发生了,事件处理程序被执行。
End Sub
End Class
'声明委托
Delegate Sub OneDelegate()
Public Class Class2
'实例方法
Public Sub fun1()
Console.WriteLine("fun1")
End Sub
'shared方法
Public Shared Sub fun2()
Console.WriteLine("fun2")
End Sub
End Class