VB.NET下的事件和委托

开发 后端
本文依然给大家介绍事件和委托,只不过这次介绍的是VB.NET中的事件和委托。希望对大家有帮助,一起来看。

委托是可用于调用其他对象方法的对象。它们有时被称为类型安全函数指针,因为它们与其他编程语言中所使用的函数指针相似。但不同于函数指针,VB.NET 委托是基于 System.Delegate 类的引用类型,它可以引用共享方法—无需特定的类实例即可调用的方法和实例方法。

委托在调用过程和被调用过程需要媒介的情况下是很有用的。例如,您可能想让一个引发事件的对象能够在不同的环境下调用不同的事件处理程序。不幸的是,引发事件的对象无法提前知道处理特定事件的事件处理程序。Visual Basic .NET 通过在使用 AddHandler 语句时创建委托,可让您动态地将事件处理程序与事件关联。在运行时,委托将各种调用转发到相应的事件处理程序。

尽管可以创建自己的委托,但在大多数情况下,Visual Basic .NET 为您创建委托并提供具体信息。例如,Event 语句将名为 <EventName>EventHandler 的委托类隐式定义为 Event 语句所在类的嵌套类,且其签字与该事件相同。AddressOf 语句则隐式创建委托的实例。例如,以下两行代码是等效的:

  1. AddHandler Button1.Click    
  2. AddressOf Me.Button1_Click   
  3. ' AddHandler 指向引发事件的对象,AddressOf则确定该事件对象所要调用的事件处理程序  
  4. '上述行为又可以称为 监视  
  5. AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)  

只要编译器可以用上下文确定委托的类型,就可以使用速写方法创建委托。

注:处理自基类继承的事件

派生类(继承某个基类特征的类)能用 Handles MyBase 语句处理它们的基类所引发的事件。

处理来自基类的事件

通过给事件处理程序过程的声明行添加 Handles MyBase.<event name> 语句来声明派生类中的事件处理程序,其中的 event name 是基类中正在处理的事件的名称。例如:

  1. Public Class Class1  
  2. Public Event SE(ByVal i As Integer)  
  3. ' Place methods and properties here.  
  4. End Class 
  5.  
  6. Public Class Class2  
  7. Inherits Class1  
  8. Sub EventHandler(ByVal x As IntegerHandles MyBase.SE  
  9. ' Place code to handle events from Class1 here.  
  10. End Sub 
  11. End Class 

声明使用现有委托类型的事件

某些情况下,可能会要声明某事件使用现有委托类型为基础委托。以下语法说明了进行声明的方式:

Event AnEvent As DelegateType该语法在将多个事件路由到同一处理程序时是很有用的,不过使用现有委托类型时需要先进行如下定义:

  1. delegate {sub|function} DelegateType(参数1,参数2) 

下面是vb.net控制台程序演示单一事件委托多处理程序.

比如说在社会上,你是法律,社会上有三种人,警察、无赖和自愿反扒队。

你规定:如果小偷偷东西,则警察处罚小偷500元钱,自愿反扒队要打无赖进医院一次

这就是现实中的委托。

实际上,在写程序中,程序员就是法律,警察、小偷和自愿反扒队就是三个对象。小偷偷东西是一个方法,小偷还有一个偷东西事件,他偷东西激发这个事件。而警察和自愿反扒队就是两个事件处理对象,警察负责把小偷的钱扣除500,自愿反扒队需要大小偷进医院一次。

所以,委托有如下几个要素:

  • 激发事件的对象--就是小偷
  • 处理对象事件的对象--就是警察和自愿反扒队
  • 定义委托,就是法律让警察和自愿反扒队监视小偷。

如果这三个要素都满足的话,则你就写出了一个完整事件的处理。

下面是vb.net控制台的实例

  1. Imports System  
  2. Module Module1  
  3.  
  4. '准备引用 无赖 类的偷东西事件  
  5. Public WithEvents w As 无赖  
  6. Sub Main()  
  7. Console.WriteLine("新的一天开始了....")  
  8. ' 实例华警察、无赖、自愿反扒队 类  
  9. Dim p As New 警察  
  10. w = New 无赖  
  11. Dim pp As New 自愿反扒队  
  12. '设置对无赖类的偷东西事件的监视,并设置相应的事件处理程序  
  13. '如果小偷玩偷东西则引用警察的罚钱处理程序  
  14. AddHandler w.PlayGame, AddressOf p.扣钱  
  15. '如果小偷偷东西则引用自愿反扒队的打人处理程序  
  16. AddHandler w.PlayGame, AddressOf pp.打人  
  17. w.偷东西()  
  18. Console.WriteLine("天黑了....")  
  19. Console.ReadLine()  
  20. End Sub 
  21. 'End Class  
  22.  
  23. Public Class 警察  
  24. Sub New()  
  25. Console.WriteLine("生成警察......")  
  26. End Sub 
  27. '定义的事件处理程序的参数类型要与定义的委托的参数类型相一致  
  28. Public Sub 扣钱(ByVal sender As ObjectByVal e As System.EventArgs)  
  29.  
  30. Console.WriteLine("警察:好小子,胆敢偷东西...")  
  31. '定义线程输出迟缓3秒  
  32. System.Threading.Thread.Sleep(3000)  
  33. Console.WriteLine("警察:看看你小子有多少钱...")  
  34. Dim f As 无赖 = sender  
  35. System.Threading.Thread.Sleep(3000)  
  36. Console.WriteLine("无赖 的钱: " + f.钱.ToString())  
  37. System.Threading.Thread.Sleep(3000)  
  38. Console.WriteLine("开始扣钱......")  
  39. System.Threading.Thread.Sleep(3000)  
  40. f.钱 = f.钱 - 500  
  41. Console.WriteLine("扣完了....现在无赖 还剩下:" + f.钱.ToString())  
  42. System.Threading.Thread.Sleep(3000)  
  43. End Sub 
  44.  
  45. End Class 
  46. Public Class 无赖  
  47. '先定义一个偷东西的事件使用现有委托类型 PlayGameHandler为基础委托  
  48. Public Event PlayGame As PlayGameHandler  
  49. Private m_Money As Integer 
  50. Private ey As Integer 
  51. Sub New()  
  52. Console.WriteLine("生成无赖....")  
  53. m_Money = 1000  
  54. ey = 5  
  55. End Sub 
  56. '定义挨打属性用来记录挨打过几次  
  57. Property 挨打() As Integer 
  58. Get 
  59. Return ey  
  60. End Get 
  61. Set(ByVal Value As Integer)  
  62. ey = Value  
  63. End Set 
  64. End Property 
  65. '定义前属性用来记录有多少钱  
  66. Property 钱() As Integer 
  67. Get 
  68. Return m_Money  
  69. End Get 
  70. Set(ByVal Value As Integer)  
  71. m_Money = Value  
  72. End Set 
  73. End Property 
  74. '定义偷东西过程  
  75. Public Sub 偷东西()  
  76. Console.WriteLine("无赖开始偷东西了")  
  77. System.Threading.Thread.Sleep(3000)  
  78. '实例化事件参数  
  79. Dim e As New System.EventArgs  
  80. '引发偷东西事件,参数类型要与现有委托类型一致  
  81. RaiseEvent PlayGame(Me, e)  
  82. End Sub 
  83. End Class 
  84. Public Class 自愿反扒队  
  85. Sub New()  
  86. Console.WriteLine("自愿反扒队来了.....")  
  87. System.Threading.Thread.Sleep(3000)  
  88. End Sub 
  89. '定义的事件处理程序的参数类型要与定义的委托的参数类型相一致  
  90. Public Sub 打人(ByVal sender As ObjectByVal e As System.EventArgs)  
  91. System.Threading.Thread.Sleep(3000)  
  92. Console.WriteLine("自愿反扒队:好小子,敢偷东西...")  
  93. System.Threading.Thread.Sleep(3000)  
  94. Console.WriteLine("自愿反扒队:你小子挨过几次打了...")  
  95. Dim bn As 无赖 = sender  
  96. System.Threading.Thread.Sleep(3000)  
  97. Console.WriteLine("无赖:" + bn.挨打.ToString + "次")  
  98. System.Threading.Thread.Sleep(3000)  
  99.  
  100. Console.WriteLine("自愿反扒队:那也得揍你,先来一拳.... ")  
  101. System.Threading.Thread.Sleep(3000)  
  102. Console.WriteLine("自愿反扒队:再来一脚......")  
  103. System.Threading.Thread.Sleep(3000)  
  104.  
  105. Console.WriteLine("自愿反扒队:打完了...赶紧去医院吧...")  
  106. End Sub 
  107. End Class 
  108. '定义委托类型  
  109. Delegate Sub PlayGameHandler(ByVal sender As ObjectByVal e As System.EventArgs)  
  110. End Module 

进一步阅读:谈JavaScript中的事件委托

【编辑推荐】

  1. VB.NET和ASP.NET编码规范
  2. VB.NET实现图象文件和XML文件互换
  3. .NET程序员是否应该放弃VB.NET?
  4. 盘点VB.NET对话框制作技巧
  5. 详解VB.NET与GDI结合实现步骤
责任编辑:于铁 来源: CSDN博客
相关推荐

2009-10-23 17:03:18

VB.NET事件编程

2010-01-12 18:12:58

VB.NET事件

2009-11-11 13:24:29

VB.NET事件

2009-11-04 09:32:12

VB.NET Auto

2009-10-29 14:02:24

VB和VB.NET比较

2009-10-27 11:39:03

VB.NET事件处理程

2010-01-22 17:22:49

VB.NET事件访问器

2009-11-03 11:06:40

VB.NET事件

2010-01-11 10:08:47

VB.NET事件通道

2009-11-02 17:12:01

VB和VB.NET

2009-10-10 17:06:09

VB和VB.NET

2009-10-23 17:22:48

VB.NET编程

2009-10-14 14:50:16

VB6.0VB.NET

2010-01-08 18:02:33

VB.NET事件

2011-05-19 09:20:21

VB.NETASP.NET

2010-01-14 17:33:47

VB.NET重载事件处

2010-01-13 17:23:36

VB.NET动态事件

2010-01-08 18:26:34

VB.NET网页控件事

2009-10-09 16:00:34

VB6.0开发

2010-01-07 11:38:25

VB.NET键盘事件
点赞
收藏

51CTO技术栈公众号