vb.net之旅(十四)—靜態關聯事情與處置順序。本站提示廣大學習愛好者:(vb.net之旅(十四)—靜態關聯事情與處置順序)文章只能為提供參考,不一定能成為您想要的結果。以下是vb.net之旅(十四)—靜態關聯事情與處置順序正文
“要解釋新的事情處置順序的辦法,我們需求先說幾個重要的問題。 ”大李開端嚴肅起來,我也只得移動一下身子,表現出正襟危坐的架勢。
“我們首先討論一下事情是怎樣發生的。事情是對象發送的音訊, 以發信號告訴操作的發作。操作能夠是由用戶交互,例如鼠標單擊惹起的,也可 能是由某些其他的順序邏輯觸發的。引發事情的對象叫做事情發送方(啊,聽到 這,henry忽然明白了事情處置順序中的第一個參量為什麼叫sender了,就是指事 件發送的那個對象呀)。捕捉事情並對其作出呼應的對象叫做事情接納方。在事 件通訊中,事情發送方類不知道哪個對象或辦法將接納到它引發的事情。所需求 的是在源和接納方之間存在一個媒介,或相似指針的機制。.net 框架定義了一個 特殊的類型delegate,也就是委托,該類型提供函數指針的功用。 ”
“啊,我早就聽說過委托的,就是不知道它是什麼意思咧! ”我做出期盼狀。
“委托就是可用於調用其他對象辦法的對象 。與其他的類不同,委托類具有一個簽名,並且它只能對與其簽名婚配的辦法進 行援用。”大李持續說著。
““噢,委托也就是一個函 數指針喽。”我好象了解了一點。
“差不多,委托可以等效於 一個類型平安函數指針或一個回調。但不同於函數指針,visual basic.net 委托 是基於 system.delegate 類的援用類型,它可以援用我們先前說過的共享辦法( 詳見《共享成員》一篇)和實例辦法。”
“明白了一點。 ”我一邊搖頭一邊說,“我們想要靜態調用事情處置順序,是不是就 要應用委托來聲明是哪個順序用於處置事情呀?”
大李驚異地看著 我,顯露了幾分贊許。
“委托是.net中的一個重要的類型,我們以 後還需求詳細討論。如今我們需求關注的就是如何來經過操作委托來完成將事情 與事情處置順序靜態聯絡起來。”大李接著就開端修正代碼:
module module1 public class chenry public event eventhr() ´ 聲明一個事情 sub causesomeevent() raiseevent eventhr() ´ 引發事情 end sub end class dim obj as new chenry() sub obj_eventhr() ´在handles之後聲明事情 msgbox("事情處置器捕獲到了事情.") ´處置事情. end sub sub main() addhandler obj.eventhr, addressof obj_eventhr obj.causesomeevent() ´調用對象去引發事情 end sub end module
“看到有什麼不同嗎?”大李轉過身來問我。
“次要有兩個不同,首先是obj的定義不再用withevents來標識了, 因而事情處置順序obj_eventhr()也就不能經過handles關鍵字來聲明事情,也就 是說eventhr事情與事情處置順序沒有用withevent-handles停止關聯;其次,是 運用了addhandle和 addressof……”說到這,我也沒有詞了 ,只能語焉不詳。
“呵呵,我來幫你接著說。”大李拍了拍我 的肩膀,接著說“先說addressof吧,addressof 運算符創立的是一個指向 指定的進程的進程委托。我們方才說過委托相當於一個函數指針,那麼addressof 就是委托的操作符,經過它能失掉委托的援用。”
見到我稍稍明白 了,大李又接著說:“光看addhandle可以將obj.eventhr事情與 obj_eventhr事情處置順序關聯起來的作法,你一定不理解我所說的靜態關聯益處 在哪裡。由於我沒提到另一個辦法removehandler。它的運用辦法和addhandle是 一樣的,比方:
removehandler obj.eventhr, addressof obj_eventhr
你看,addhandler 與 removehandler 在一同就可以提供比 handles 子句更大的靈敏性,只需我們擅長應用它們,就可以靜態地添加、移除 和更改與某事情關聯的事情處置順序。而且比 handles 要弱小的是,addhandler 允許將多個事情處置順序與單個事情停止關聯。”
大李停了一停, 接著說:“你要留意的一點就是addressof前面跟著的委托簽名應該與相應 的事情數據類相分歧,我們看一個例子。”
addhandler textbox.mousedown,addressof textboxmousedownhandler ‘錯誤的示例1: private sub textboxmousedownhandler( ) end sub ‘錯誤的示例2 private sub textboxmousedownhandler(byval sender as object, byval e as eventargs) end sub ‘正確的示例: private sub textboxmousedownhandler(byval sender as object, byval e as mouseeventargs) end sub
“事情是一個文本框中的鼠標按下事情,我們不必自帶的 規范關聯事情處置辦法,而用addhandler來完成,那麼addressof之後相應的辦法 的參數聲明,應該與mousedown事情對應的事情的委托mouseeventhandler具有相 同的簽名,也就是參數聲明上要堅持分歧,一個object變量,一個 system.windows.forms.mouseeventargs變量。”
我到這一步才算明 白了個大約,事情處置順序可以經過addhandler和removehandler辦法在我們需求 的時分靜態地樹立或斷開事情與事情處置順序的關聯關系。可是,關於大李剛說 的“事情的委托mouseeventhandler”,我還是不太了解。