日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳談VB.NET事件編程

可能大家使用VB.NET事件編程已經(jīng)多年了,當你對委托了解得越深,使用事件編程時就越能利用其強大的功能。在使用通用語言運行的事件驅(qū)動框架工作時,了解事件在低層是怎樣工作的很重要。本文的目標就是讓你了解事件在低層是怎樣工作的。事件到底是什么?

七臺河ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

事件僅僅是一種軟件模式(pattern),在事件中通知源對一個或多個處理方法進行回調(diào)(callback)。因此事件與接口(interface)和委托(delegate)相似,因為它們都提供了一條途徑來設(shè)計使用回調(diào)方法的應(yīng)用程序。但是事件生產(chǎn)率更高,因為它比接口和委托更易使用。事件讓編譯器和Visual Studio .NET集成開發(fā)環(huán)境在后臺為你做了很多工作。
包含事件的設(shè)計是基于一個事件源和一個或多個處理程序的。事件源可以是類或?qū)ο?,事件處理程序是綁定到某個處理方法的委托對象。圖1在較高層次顯示了數(shù)據(jù)源與處理方法的聯(lián)系。

VB.NET事件編程之事件源和處理程序

每個事件都根據(jù)特定的委托類型定義。對于每個事件源定義的事件,都有一個基于事件下面的委托類型的專用字段,該字段用于跟蹤多點傳送的委托對象。事件源也提供了一個公共的注冊方法,讓你可以注冊希望的事件處理程序。

當你建立一個事件處理程序(一個委托對象)并把它與事件源一起注冊時,事件源簡單地把新的事件處理程序添加到列表的結(jié)尾。接著事件源能使用專用字段調(diào)用多點傳送委托對象的Invoke方法,該方法將執(zhí)行所有已注冊的事件處理程序。事件真正好的地方是大多數(shù)設(shè)置工作已經(jīng)被開發(fā)環(huán)境完成。你將看到,Visual Basic .NET編譯器幫助你在定義事件時自動的添加一個私有字段和一個公共注冊方法。你也會看到Visual Studio .NET通過自動生成處理方法的框架定義的代碼生成器為你提供了更多幫助。

使用VB.NET事件編程

由于在.NET中的事件建立在委托的頂層,所有它們下面的通道細節(jié)與早期版本的Visual Basic工作方式有很大的不同。但是Visual Basic .NET語言的設(shè)計者為了保持與早期Visual Basic版本語言的一致性做了大量的工作。在很多情況中,事件編程使用與原來相近的語法。例如,你將使用Event、 RaiseEvent和WithEvents等關(guān)鍵字,它們的行為與早期版本的相同。

我們建立一個簡單的基于事件的回調(diào)設(shè)計。首先我需要使用Event關(guān)鍵字在類的定義中定義一個事件。事件必須根據(jù)特定的委托類型來定義。下面是一個委托類型定義和使用它定義事件的類:

 
 
 
  1. Delegate Sub LargeWithdrawHandler(ByVal Amount As Decimal)
  2. Class BankAccount
  3. Public Event LargeWithdraw As LargeWithdrawHandler
  4. '省略了其它成員
  5. End Class 

在上面的例子中,LargeWithdraw事件被定義為一個實例成員。該設(shè)計中BankAccount對象將作為事件源。如果你希望用類代替對象作為事件源,你可以使用Shared關(guān)鍵字把事件定義為共享成員。

當使用事件編程時,肯定編譯器在后臺做了大量的工作也很重要。例如,當編譯BankAccount類的定義時編譯器做了什么?圖2顯示了使用ILDasm.exe(中間語言反編譯器)查看類的定義結(jié)果。

圖2. ILDasm中的類定義

當你定義事件時,編譯器在類的定義中產(chǎn)生四個成員。第一個成員是基于委托類型的私有字段,它用于跟蹤一個委托對象的引用。編譯器產(chǎn)生的該私有字段的名字是事件字加上"Event"標識。這意味著建立LargeWithdraw事件的結(jié)果是建立了名為LargeWithdrawEvent的私有字段。

編譯器也產(chǎn)生了兩個方法幫助注冊和取消注冊作為事件處理程序服務(wù)的委托對象。這兩個方法的命名使用了標準的命名轉(zhuǎn)換。注冊事件處理程序的方法的名字加了"add_"前綴,取消注冊的方法前面加了"remove_"前綴。因此為LargeWithdraw事件建立的這兩個方法名稱為add_LargeWithdraw 和remove_LargeWithdraw。

Visual Basic .NET編譯器為add_LargeWithdraw產(chǎn)生了實現(xiàn)代碼,它接收以一個委托對象作為參數(shù)并通過調(diào)用委托類的Combine方法將它添加到處理程序列表。編譯器也產(chǎn)生remove_LargeWithdraw的實現(xiàn)代碼,它通過調(diào)用委托類的Remove方法從列表中刪除一個處理方法。添加到類定義中的第四個成員表現(xiàn)了事件本身。你能在圖2中定位名為LargeWithdraw的事件成員。它有一個向下的三角形。但是你必須注意這個事件成員不是一個真的與其它三個相似的物理事件,它是一個元數(shù)據(jù)成員。該元數(shù)據(jù)事件成員是有價值的,因為它通知編譯器和其它開發(fā)工具該類支持.NET框架中的事件注冊標準模式。該事件成員也包含注冊和反注冊方法的名字。這使Visual Basic .NET和C#等可管理語言的編譯器能在編譯時就發(fā)現(xiàn)注冊方法的名稱。當Visual Basic .NET發(fā)現(xiàn)類定義中包含事件時,它自動在產(chǎn)生事件處理程序的注冊代碼時生成該處理方法的框架定義。

在討論引發(fā)事件前,我將講解建立用于定義事件的委托類型所涉及的限制。定義事件的委托類型不能有返回值,你必須使用Sub關(guān)鍵字而不能使用Function關(guān)鍵字:

 
 
 
  1. '能被事件使用
  2. Delegate Sub BaggageHandler()
  3. Delegate Sub MailHandler(ItemID As Integer)
  4. '不能被事件使用
  5. Delegate Function QuoteOfTheDayHandler(Funny As Boolean) As String 

該限制有一個很好的原因。在綁定到多個處理方法的多點傳送委托中使用返回值非常困難。多點傳送委托的Invoke調(diào)用返回的值是調(diào)用列表中最后一個處理方法的值??墒遣东@列表中前面的處理方法的返回值就不直接了,消除捕獲多個返回值的需求使事件更容易使用。


標題名稱:詳談VB.NET事件編程
網(wǎng)站鏈接:http://m.5511xx.com/article/dheoejh.html