自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

VB.NET下的事件和委托

開發(fā) 后端
本文依然給大家介紹事件和委托,只不過這次介紹的是VB.NET中的事件和委托。希望對大家有幫助,一起來看。

委托是可用于調(diào)用其他對象方法的對象。它們有時被稱為類型安全函數(shù)指針,因為它們與其他編程語言中所使用的函數(shù)指針相似。但不同于函數(shù)指針,VB.NET 委托是基于 System.Delegate 類的引用類型,它可以引用共享方法—無需特定的類實例即可調(diào)用的方法和實例方法。

委托在調(diào)用過程和被調(diào)用過程需要媒介的情況下是很有用的。例如,您可能想讓一個引發(fā)事件的對象能夠在不同的環(huán)境下調(diào)用不同的事件處理程序。不幸的是,引發(fā)事件的對象無法提前知道處理特定事件的事件處理程序。Visual Basic .NET 通過在使用 AddHandler 語句時創(chuàng)建委托,可讓您動態(tài)地將事件處理程序與事件關(guān)聯(lián)。在運行時,委托將各種調(diào)用轉(zhuǎn)發(fā)到相應(yīng)的事件處理程序。

盡管可以創(chuàng)建自己的委托,但在大多數(shù)情況下,Visual Basic .NET 為您創(chuàng)建委托并提供具體信息。例如,Event 語句將名為 <EventName>EventHandler 的委托類隱式定義為 Event 語句所在類的嵌套類,且其簽字與該事件相同。AddressOf 語句則隱式創(chuàng)建委托的實例。例如,以下兩行代碼是等效的:

  1. AddHandler Button1.Click    
  2. AddressOf Me.Button1_Click   
  3. ' AddHandler 指向引發(fā)事件的對象,AddressOf則確定該事件對象所要調(diào)用的事件處理程序  
  4. '上述行為又可以稱為 監(jiān)視  
  5. AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)  

只要編譯器可以用上下文確定委托的類型,就可以使用速寫方法創(chuàng)建委托。

注:處理自基類繼承的事件

派生類(繼承某個基類特征的類)能用 Handles MyBase 語句處理它們的基類所引發(fā)的事件。

處理來自基類的事件

通過給事件處理程序過程的聲明行添加 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 

聲明使用現(xiàn)有委托類型的事件

某些情況下,可能會要聲明某事件使用現(xiàn)有委托類型為基礎(chǔ)委托。以下語法說明了進行聲明的方式:

Event AnEvent As DelegateType該語法在將多個事件路由到同一處理程序時是很有用的,不過使用現(xiàn)有委托類型時需要先進行如下定義:

  1. delegate {sub|function} DelegateType(參數(shù)1,參數(shù)2) 

下面是vb.net控制臺程序演示單一事件委托多處理程序.

比如說在社會上,你是法律,社會上有三種人,警察、無賴和自愿反扒隊。

你規(guī)定:如果小偷偷東西,則警察處罰小偷500元錢,自愿反扒隊要打無賴進醫(yī)院一次

這就是現(xiàn)實中的委托。

實際上,在寫程序中,程序員就是法律,警察、小偷和自愿反扒隊就是三個對象。小偷偷東西是一個方法,小偷還有一個偷東西事件,他偷東西激發(fā)這個事件。而警察和自愿反扒隊就是兩個事件處理對象,警察負責把小偷的錢扣除500,自愿反扒隊需要大小偷進醫(yī)院一次。

所以,委托有如下幾個要素:

  • 激發(fā)事件的對象--就是小偷
  • 處理對象事件的對象--就是警察和自愿反扒隊
  • 定義委托,就是法律讓警察和自愿反扒隊監(jiān)視小偷。

如果這三個要素都滿足的話,則你就寫出了一個完整事件的處理。

下面是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. '設(shè)置對無賴類的偷東西事件的監(jiān)視,并設(shè)置相應(yīng)的事件處理程序  
  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. '定義的事件處理程序的參數(shù)類型要與定義的委托的參數(shù)類型相一致  
  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("扣完了....現(xiàn)在無賴 還剩下:" + f.錢.ToString())  
  42. System.Threading.Thread.Sleep(3000)  
  43. End Sub 
  44.  
  45. End Class 
  46. Public Class 無賴  
  47. '先定義一個偷東西的事件使用現(xiàn)有委托類型 PlayGameHandler為基礎(chǔ)委托  
  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. '定義挨打?qū)傩杂脕碛涗洶ご蜻^幾次  
  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. '實例化事件參數(shù)  
  79. Dim e As New System.EventArgs  
  80. '引發(fā)偷東西事件,參數(shù)類型要與現(xiàn)有委托類型一致  
  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. '定義的事件處理程序的參數(shù)類型要與定義的委托的參數(shù)類型相一致  
  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("自愿反扒隊:打完了...趕緊去醫(yī)院吧...")  
  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編碼規(guī)范
  2. VB.NET實現(xiàn)圖象文件和XML文件互換
  3. .NET程序員是否應(yīng)該放棄VB.NET?
  4. 盤點VB.NET對話框制作技巧
  5. 詳解VB.NET與GDI結(jié)合實現(xiàn)步驟
責任編輯:于鐵 來源: CSDN博客
相關(guān)推薦

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-11-02 17:12:01

VB和VB.NET

2009-10-27 11:39:03

VB.NET事件處理程

2010-01-11 10:08:47

VB.NET事件通道

2010-01-22 17:22:49

VB.NET事件訪問器

2009-11-03 11:06:40

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

2011-05-19 09:20:21

VB.NETASP.NET

2009-10-10 16:40:37

VB.NET Cont

2011-06-17 11:05:22

VB.NET

2009-06-24 15:45:32

VB.NET

2010-01-08 18:26:34

VB.NET網(wǎng)頁控件事

2010-01-13 17:23:36

VB.NET動態(tài)事件

2010-01-14 17:33:47

VB.NET重載事件處
點贊
收藏

51CTO技術(shù)棧公眾號