委派和 AddressOf 運算子
更新:2007 年 11 月
委派 (Delegate) 是一種物件,讓您可以用來呼叫其他物件的方法。它們有時會被描述成「型別安全函式指標」,這是因為它們與使用在其他程式語言中的函式指標類似。但與函式指標不同的是,Visual Basic 委派是以類別 System.Delegate 為基礎的參考型別。委派可以同時參考共用方法 (不需特定的類別執行個體即可呼叫的方法) 和執行個體方法。
委派和事件
在呼叫程序與被呼叫程序之間需要媒介的情況下,委派相當有用。例如,您可能要引發事件的物件能夠在不同的情況下呼叫不同的事件處理常式。不幸的是,引發事件的物件無法事先知道處理特定事件的是哪一個事件處理常式。使用 AddHandler 陳述式時,Visual Basic 藉由為您建立委派,讓您可以動態產生事件處理常式與事件的關聯。委派會在 Run Time 時將呼叫轉至適當的事件處理常式。
雖然,您可以建立自己的委派,但多數情況下,Visual Basic 會為您建立委派並處理細節。例如,Event 陳述式會將名為 <EventName>EventHandler 的委派類別,隱含定義為包含 Event 陳述式的類別的巢狀類別 (Nested Class),並與事件具有相同的簽章。AddressOf 陳述式隱含建立委派的執行個體。例如,下列兩行程式碼是相同的:
AddHandler Button1.Click, AddressOf Me.Button1_Click
' The previous line of code is shorthand for the next line of code.
AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
只要編譯器 (Compiler) 能夠依內容判斷委派的型別,您就可以使用簡略的方法來建立委派。
宣告使用現有委派型別的事件
在一些情況下,您可能想要宣告事件來將現有的委派型別 (Delegate Type) 當做其基礎委派使用。如下列語法所示:
Delegate Sub DelegateType()
Event AnEvent As DelegateType
當您要傳送多個事件到相同的處理常式時,這會相當有用。
委派變數和參數
您可以在其他與事件無關的工作上使用委派 (Delegate),例如無限制執行緒 (Free Threading) 或是需要在編譯時間呼叫不同版本函式的程序。
例如,假設您有個分類廣告應用程式,其中包含具有汽車名稱的清單方塊。廣告是依標題 (通常是汽車的型號) 排序。當一些汽車在型號之前包括有年份時,就會發生您可能要面對的問題。問題在於,清單方塊的內建排序功能只會依字元碼排序;它會先列出所有以日期開頭的廣告,接著才是以型號開頭的廣告。
若要解決這個問題,您可以在類別中建立一排序程序,讓它在多數的清單方塊中使用標準的字母順序排序,但能夠在 Run Time 時切換控制為汽車廣告所用的自訂排序程序。若要這麼做,您就要在執行階段使用委派,將自訂排序程序傳遞至排序類別。
每個委派類別會定義傳遞物件方法規格的建構函式 (Constructor)。委派建構函式的引數必須是方法的參考或 Lambda 運算式。
若要指定方法的參考,請使用下列語法:
AddressOf [expression.]methodName
expression 在編譯時期的型別必須是包含指定名稱 (其簽章符合委派類別的簽章) 方法的類別或介面的名稱。methodName 可以是共用方法或執行個體方法。即使您為類別的預設方法建立委派,methodName 還是必要項。
若要指定 Lambda 運算式,請使用下列語法:
Function ([parm As type, parm2 As type2, ...]) expression
函式的簽章必須符合委派型別的簽章。如需 Lambda 運算式的詳細資訊,請參閱 Lambda 運算式。
請參閱
工作
HOW TO:在 Visual Basic 中將程序傳遞至其他程序