1. 程式人生 > >VB.NET學習筆記:初識委託——System.Delegate 類

VB.NET學習筆記:初識委託——System.Delegate 類

想必你對生活中的“委託”耳聞能詳,如委託某人辦某事。沒想到VB.NET程式設計也要跟委託打交道。因擴充套件控制元件,使其列頭增加全選全不選複選框並具備分頁功能需要用到委託和事件,詳見博文《》、《》,所以拜讀了多篇相關委託與事件的博文,結合自己在程式設計中的使用情況,談談我對委託與事件的一些認識,記錄下來做個記號,溫習時可以用用。
一、委託
一、問題暴露:方法能作為引數傳給方法嗎?
為了優化精簡程式碼,通常會把多次重複的程式碼寫成過程或函式,然後再呼叫該過程或函式,這樣要修改程式碼就不必用到四處修改,只需對修改該過程或函式程式碼即可。程式碼示例如下:

以委託也可以實現過程或函式的呼叫。程式碼如下:
Public Class Form1

Delegate Sub fr(ByVal str As String) '建立一個委託
Dim a As New fr(AddressOf talk) '宣告例項化委託並繫結被委託的方法:talk
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
a.Invoke(“hello”)'執行指定的委託即間接呼叫talk方法
End Sub
Public Sub talk(ByVal str As String)
MsgBox(str)

End Sub

End Class
好囉嗦的程式碼,真是畫蛇添足,多此一舉。
為了進一步暴露問題,我們把Call過程封裝到一個類中,從類中呼叫窗體裡提供的過程或函式,實現程式碼如下:

於是,矛盾並在類和窗體兩位主人公之間展開了,窗體不滿足只有英文版的“Hello World”,說要整個中文版,不容類辯駁就擅自增加了中文版的過程,要求類能根據組合框的選擇呼叫相應版本的過程。類只能妥協,通過加IF語句來滿足了窗體的要求。程式碼如下:

不用我說大家肯定也能猜到,窗體是不會善罷甘休,還要增加俄語版、德語版……,類只能一次次的用IF語句來滿足窗體的新要求。終於有一天,類為窗體的新要求犯難了。窗體說不想呼叫各語種的“Hello World”了,但具體要呼叫什麼過程又沒想好,於是把所有版本的“Hello World”過程清空。沒有過程名類要怎麼用Call來呼叫過程呢?如果能把方法作為引數傳遞問題就有解了。程式碼如下:

可是VB.NET不支援這樣語法。正當類犯愁時,委託出場了,並幫助類滿足了窗體的要求。程式碼如下:

只要窗體想好了方法,就自行繫結給委託,而類不需要做任何修改,真是一勞永逸。
好了,想必讀者到此也能自行總結傳統的Call和委託的利弊。傳統的擴充套件性差,最重要的是不能動態呼叫方法。那到底VB.NET中的委託是什麼?
二、委託的概念
Visual Basic .NET 委託是基於 System.Delegate 類(更準確地說從 Systetn.MuhicastDelegate 繼承而來的,而 System.MulticastDelegate 則又是從 System.Delegate 繼承而來 的。)的引用型別,是CTS(公共型別系統)規定的5種類型之一(類型別、結構型別、介面型別、列舉型別、委託型別)。它能夠呼叫物件的方法(例項方法)和類的方法(靜態方法、在VB裡的Shared方法)。有了委託就可以透過方法來呼叫指定方法,這種指定不是編譯時指定的而是在程式執行時指定。
三、委託的使用
1、基本步驟
2、呼叫含引數過程
3、呼叫函式
4、呼叫多個方法