1、委託概述
委託和類同樣,是用戶自定義類型,也是引用類型。但類表示的是數據和方法的集合,而委託持有一個或多個方法,以及一系列預約義操做。
能夠經過如下操做步驟來使用委託:
(1)聲明一個委託類型。委託聲明看上去和方法聲明類似,只是沒有實現塊。
(2)使用該委託類型聲明一個委託變量。
(3)建立委託類型的對象,把它賦值給委託變量。新的委託對象包括指向某個方法的引用,這個方法和第一步定義的簽名和返回類型一致。
(4)能夠選擇爲委託對象增長其餘方法。這些方法必須與第一步中定義的委託類型有相同的簽名和返回類型。
(5)在代碼中你能夠像調用方法同樣調用委託。在調用委託時,其包含的每一個方法都會被執行。
注:
(1)委託中,方法的列表稱爲調用列表。
(2)委託持有的方法能夠來自任何類或結構,能夠是實例方法也能夠是靜態方法,只要它們與委託類型有相同的簽名和返回類型便可。
(3)若是一個方法在調用列表中出現屢次,當委託被調用時,每次在列表中遇到該方法時它都會被調用一次。
(4)委託是恆定的。委託對象被建立後不能再被改變。spa
2、委託的類型聲明與對象建立
1. 委託類型聲明3d
語法:對象
2. 委託對象建立
建立委託對象會爲委託分配內存,還會把第一個方法放入委託調用列表。
建立方法一:blog
建立方法二(快捷語法):內存
圖示:變量
3、委託相關操做
因爲委託對象被建立後就是恆定不可變的,因此組合委託、爲委託添加方法、從委託移除方法,實質上都是建立了一個全新的委託。
1. 組合委託
組合委託:實質上是建立一個新的委託,其調用列表鏈接了做爲操做數的兩個委託的調用列表副本。
示例:搜索
圖示:語法
2. 爲委託添加方法
C#支持使用+=運算符爲委託的調用列表增長方法。
示例:引用
3. 從委託移除方法
C#支持使用-=運算符從委託的調用列表移除方法。
示例:方法
注:
(1)若是在調用列表中有多個實例,-=運算符將從列表最後開始搜索,而且移除第一個與方法匹配的實例。
(2)試圖刪除委託中不存在的方法沒有效果。
(3)試圖調用空委託會拋出異常。能夠經過把委託和null進行比較來判斷委託列表是否爲空。若是調用列表爲空,則委託是null。
4. 調用委託
能夠像調用方法同樣簡單地調用委託。調用委託的參數將會用於調用列表中的每一個方法。
示例:
圖示:
4、委託的參數和返回值問題
1. 調用帶引用參數的委託
若是委託有引用參數,參數值會根據調用列表中的一個或多個方法的返回值而改變,最後的值是委託的調用列表中全部方法依次共同做用於參數的結果。
2. 調用帶返回值的委託
若是委託有返回值而且調用列表中有一個以上方法,則委託調用的返回值就是調用列表中最後一個方法返回的值,其餘返回值被忽略。
3. 使用匿名方法給委託賦值
示例: