委托和類一樣,是用戶的自定義類型,區別在于類是數據和方法的集合,而委托則持有一個或多個方法,以及一系列預定義操作。
由于委托是類型,所以在創建變量以及類型的對象前需要先進行聲明。
delegate void MyDel(int value) ;委托的聲明與方法的聲明十分相似,但有兩點不同:
(1)以關鍵字deltgate開頭
(2)沒有方法主體
3.聲明委托變量
MyDel del1 , del2 ;4.創建委托對象
(1)使用帶new運算符創建委托對象
del1=new MyDel(myclassA.M1); //實例方法del2=new MyDel(ClassB.M2); //靜態方法new運算符后+委托類型名+(實例方法or靜態方法)
(2)快捷語法
del1=myclassA.M1;del2=ClassB.M2;這與之前帶new運算符的方式是等價的,因為方法名和對應的委托類型之間存在隱式轉換。
5.委托賦值
由于委托是引用類型,所以可以通過給委托賦值來改包含在委托變量中的引用,舊的委托對象會被垃圾回收器回收
Mydel delvar;delvar=myclassA.m1; //創建委托對象并賦值delvar=ClassB.M2; //創建新的委托對象并賦值6.組合委托
委托間合一通過額外的運算符,創造出新的委托,新的委托的方法調用列表鏈接了作為操作數的委托的調用列表副本
Mydel delA,delB,delC;delA=myclassA.M1;delB=ClassB.M2;delC=delA+delB; //組合調用列表7.為委托添加、刪除方法
(1)添加方法
Mydel delA=myclass.M1; //創建并初始化delA+=ClassB.M2;//添加方法添加方法的本質其實就是組合委托,每次等于創建了一個新的委托,將新的委托賦值給委托變量。
(2)刪除方法
delA-=myclassA.M1; //刪除方法刪除委托方法的時候,有如下注意事項:
若調用列表中存在多個相同方法,則會從調用列表的底部開始尋找第一個符合的方法刪除
試圖刪除調用列表中不存在的方法沒有效果
試圖調用空委托會異常,需要和null作比較
8.調用委托
if(delA!=null){delA(666);}else{Console.WriteLine("Delegate is empty!")}當委托有返回值時,調用列表中最后一個方法的返回值就是委托的返回值
當委托有引用參數時,引用參數的新值會傳遞到下一個方法
9.匿名方法
為了避免因初始化委托,而創建僅僅使用一次的具名方法,所以有了匿名方法
匿名方法可以使用在如下情況內:
聲明委托變量時放在右側作為初始化表達式
組合委托時放在賦值語句的右側
為委托增加事件時在賦值語句的右側
匿名方法語法如下:
delegate (參數){語句塊} ;
可以發現匿名方法并沒有返回值類型,但在實現代碼時,比如根據匹配的委托類型,返回相應的返回值
匿名方法的參數必須在以下幾點上與委托匹配:
參數數量
參數類型以及位置
修飾符,params參數除外,匿名方法中忽略關鍵字params
當匿名方法滿足以下兩點的時候,可以使用()或者空白來代替參數:
委托的參數列表不包含out參數
匿名方法不使用任何參數
10.Lambda表達式
在C#3.0中引入了Lambda表達式來替代匿名方法,=>讀作goes to
Mydel del1 = delegate (int i){return i+1 ;};等價于Mydel del1 = (int i) =>{return i+1;};
當參數列表中不包含ref以及out參數時,可以省略參數類型,稱為隱式參數
當參數中僅包含一個隱式參數,可以省略參數外的()
|
新聞熱點
疑難解答