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