.Net的委托(Delegate)
到現在,我仍然認為自己沒有完全明白委托是怎么一回事。不過,從例子以及自己的實踐倒是知道了它的用處。
一、概念
先說說委托的概念吧:
委托是可用于調用其他對象方法的對象。他們有時被稱為類型安全函數指針,因為它們与其他編程語言中所使用的函數指針相似。
但不同于函數指針,Visual Basic .NET 委托是基于 System.Delegate 類的引用類型,它可以引用共享方法 —无需特定的類實例即可調用的方法和實例方法。
創建委托,可讓您動態地將事件處理程序与事件關聯。在運行時,委托將各种調用轉發到相應的事件處理程序,從而讓一個引發事件的對象能夠在不同的環境下調用不同的事件處理程序
----referenced from VB.NET下的事件和委托 (http://www.wewill.cn/n2013c7.aspx)
委托的概念和功能大致是此,假如不明白,我們可以從另一個角度來理解委托。
話說某個開發者需要編寫一個排序程序,里面有多個對象,類型較多,而且排序標準也不同。如Person對象按姓名排列,SaleOrder對象根據銷售日期排序...這樣的程序無疑很復雜,不僅需要對每種情況都進行判斷,而且很多代碼都重復。于是,為了簡化程序,復用代碼,委托便被created(我是這么理解的)。
下面的使用方法和例子將以排序程序來樣本。
二、使用方法
使用委托,主要有3步:
1.聲明委托
聲明一個委托,它定義了一個方法的簽名(如下)。
如果某個方法跟它一個結構(F (Object,Object) ),那么可以將該方法看作是Compare類型。
以排序為例,這里統一了結構(F (Object,Object),后面各種排序處理方法都可以以這種結構為模板,實現具體處理代碼。
2. 使用委托數據類型
在代碼模塊中添加下列的排序方法
Dim outer As Integer
Dim inner As Integer
Dim temp As Object
For outer = 0 To ArrayLst.Count - 1
For inner = outer + 1 To ArrayLst.Count - 1
If greateThan.Invoke(ArrayLst(outer), ArrayLst(inner)) Then
temp = ArrayLst(outer)
ArrayLst(outer) = ArrayLst(inner)
ArrayLst(inner) = temp
End If
Next
Next
End Sub
這個DoSort其實就是整個排序程序的核心代碼,所有的對象排序使用這個方法,只是其具體的ArrayList和compare類型。
根據對象來確定。例子中使用的Invoke方法從代碼中調用委托,兩個對象間的特殊比較則由作為一個參數傳遞的委托歷程來處理。
這里可以看到,(1)里聲明的compare在這里被作為一個數據類型來看待,從而具體的排序方法可以以參數形式被引入。
3.實現委托方法
剩下的就是創建委托例程的實現代碼,調用排序方法。
Return CType(obj_1, Person).Age> CType(obj_2, Person).Age
End Function
上面是一個比較Person對象年齡的方法,該方法應該擁有與在委托語句中定義的相同數目的參數已經相同的數據類型,
該方法提供的返回值類型必須與所定義的相同。方法的實際名稱并不重要。
方法useFunction調用了DoSort方法進行排序,而具體使用的排序方法是compareAge.
為了找到特定方法的地址,可以使用AddressOf操作符。這個操作符返回任何過程或方法的地址,允許把地址當作參數
傳遞到任何將委托當作參數的例程中。
Dim SourceList As New ArrayList
AddToSourceList(100, "0343", SourceList)
AddToSourceList(70, "1343", SourceList)
AddToSourceList(50, "8343", SourceList)
AddToSourceList(78, "1343", SourceList)
AddToSourceList(2220, "343", SourceList)
DoSort(SourceList, AddressOf compareAge)
End Sub
-----------------------------------------------------------
佛对我说:你心里有尘。我用力的拭擦。