VB.NET下的事件和委托

前端之家收集整理的这篇文章主要介绍了VB.NET下的事件和委托前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
本文依然给大家介绍事件和委托,只不过这次介绍的是VB.NET中的事件和委托。希望对大家有帮助,一起来看。

AD:


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

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

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

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

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

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

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

处理来自基类的事件

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

   
   
  1. PublicClassClass1
  2. PublicEventSE(ByValiAsInteger)
  3. 'Placemethodsandpropertieshere.
  4. EndClass
  5. PublicClassClass2
  6. InheritsClass1
  7. SubEventHandler(ByValxAsInteger)HandlesMyBase.SE
  8. 'PlacecodetohandleeventsfromClass1here.
  9. EndSub
  10. EndClass

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

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

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

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

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

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

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

这就是现实中的委托。

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

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

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

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

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

   
   
  1. ImportsSystem
  2. ModuleModule1
  3. '准备引用无赖类的偷东西事件
  4. PublicWithEventswAs无赖
  5. SubMain()
  6. Console.WriteLine("新的一天开始了....")
  7. '实例华警察、无赖、自愿反扒队类
  8. DimpAsNew警察
  9. w=New无赖
  10. DimppAsNew自愿反扒队
  11. '设置对无赖类的偷东西事件的监视,并设置相应的事件处理程序
  12. '如果小偷玩偷东西则引用警察的罚钱处理程序
  13. AddHandlerw.PlayGame,AddressOfp.扣钱
  14. '如果小偷偷东西则引用自愿反扒队的打人处理程序
  15. AddHandlerw.PlayGame,AddressOfpp.打人
  16. w.偷东西()
  17. Console.WriteLine("天黑了....")
  18. Console.ReadLine()
  19. EndSub
  20. 'EndClass
  21. PublicClass警察
  22. SubNew()
  23. Console.WriteLine("生成警察......")
  24. EndSub
  25. '定义的事件处理程序的参数类型要与定义的委托的参数类型相一致
  26. PublicSub扣钱(ByValsenderAsObject,ByValeAsSystem.EventArgs)
  27. Console.WriteLine("警察:好小子,胆敢偷东西...")
  28. '定义线程输出迟缓3秒
  29. System.Threading.Thread.Sleep(3000)
  30. Console.WriteLine("警察:看看你小子有多少钱...")
  31. DimfAs无赖=sender
  32. System.Threading.Thread.Sleep(3000)
  33. Console.WriteLine("无赖的钱:"+f.钱.ToString())
  34. System.Threading.Thread.Sleep(3000)
  35. Console.WriteLine("开始扣钱......")
  36. System.Threading.Thread.Sleep(3000)
  37. f.钱=f.钱-500
  38. Console.WriteLine("扣完了....现在无赖还剩下:"+f.钱.ToString())
  39. System.Threading.Thread.Sleep(3000)
  40. EndSub
  41. EndClass
  42. PublicClass无赖
  43. '先定义一个偷东西的事件使用现有委托类型PlayGameHandler为基础委托
  44. PublicEventPlayGameAsPlayGameHandler
  45. Privatem_MoneyAsInteger
  46. PrivateeyAsInteger
  47. SubNew()
  48. Console.WriteLine("生成无赖....")
  49. m_Money=1000
  50. ey=5
  51. EndSub
  52. '定义挨打属性用来记录挨打过几次
  53. Property挨打()AsInteger
  54. Get
  55. Returney
  56. EndGet
  57. Set(ByValValueAsInteger)
  58. ey=Value
  59. EndSet
  60. EndProperty
  61. '定义前属性用来记录有多少钱
  62. Property钱()AsInteger
  63. Get
  64. Returnm_Money
  65. EndGet
  66. Set(ByValValueAsInteger)
  67. m_Money=Value
  68. EndSet
  69. EndProperty
  70. '定义偷东西过程
  71. PublicSub偷东西()
  72. Console.WriteLine("无赖开始偷东西了")
  73. System.Threading.Thread.Sleep(3000)
  74. '实例化事件参数
  75. DimeAsNewSystem.EventArgs
  76. '引发偷东西事件,参数类型要与现有委托类型一致
  77. RaiseEventPlayGame(Me,e)
  78. EndSub
  79. EndClass
  80. PublicClass自愿反扒队
  81. SubNew()
  82. Console.WriteLine("自愿反扒队来了.....")
  83. System.Threading.Thread.Sleep(3000)
  84. EndSub
  85. '定义的事件处理程序的参数类型要与定义的委托的参数类型相一致
  86. PublicSub打人(ByValsenderAsObject,ByValeAsSystem.EventArgs)
  87. System.Threading.Thread.Sleep(3000)
  88. Console.WriteLine("自愿反扒队:好小子,敢偷东西...")
  89. System.Threading.Thread.Sleep(3000)
  90. Console.WriteLine("自愿反扒队:你小子挨过几次打了...")
  91. DimbnAs无赖=sender
  92. System.Threading.Thread.Sleep(3000)
  93. Console.WriteLine("无赖:"+bn.挨打.ToString+"次")
  94. System.Threading.Thread.Sleep(3000)
  95. Console.WriteLine("自愿反扒队:那也得揍你,先来一拳....")
  96. System.Threading.Thread.Sleep(3000)
  97. Console.WriteLine("自愿反扒队:再来一脚......")
  98. System.Threading.Thread.Sleep(3000)
  99. Console.WriteLine("自愿反扒队:打完了...赶紧去医院吧...")
  100. EndSub
  101. EndClass
  102. '定义委托类型
  103. DelegateSubPlayGameHandler(ByValsenderAsObject,ByValeAsSystem.EventArgs)
  104. EndModule
原文链接:https://www.f2er.com/vb/259418.html

猜你在找的VB相关文章