分享人:蔡永堅(jiān)
1. 問(wèn)題描述:委托掸读。
功能要求:已知有一個(gè)字符串?dāng)?shù)組会涎,將該數(shù)組里的長(zhǎng)度為2字符串選出來(lái)叉庐;
沒(méi)學(xué)習(xí)委托時(shí)做法:寫(xiě)一個(gè)方法舒帮,傳入一個(gè)字符串,然后遍歷判斷每個(gè)字符串的長(zhǎng)度陡叠,將長(zhǎng)度為2的字符串重新組成數(shù)組返回玩郊。
存在問(wèn)題:當(dāng)條件變換時(shí)(變成長(zhǎng)度大于3),那么得重新寫(xiě)一個(gè)方法枉阵。
使用委托:
List<string> strlist = new List<string>();
IEnumerable<string> newstrlist =strlist.Where(delegate(stringa)
{ return a.Length == 2; });
注:IEnumerable<T> 是一個(gè)接口, 他定義了一個(gè)可被枚舉對(duì)象
List < T > 是一個(gè)泛型集合類(lèi)的實(shí)現(xiàn), 他實(shí)現(xiàn)了上面的接口,
strlist.Where()是系統(tǒng)的方法译红,它的參數(shù)是一個(gè)委托:delegate(string a) { return a.Length == 2; }。
- 什么是委托
從數(shù)據(jù)結(jié)構(gòu)來(lái)講岭妖,委托是和類(lèi)一樣是一種用戶自定義類(lèi)型临庇。
從設(shè)計(jì)模式來(lái)講,委托(類(lèi))提供了方法(對(duì)象)的抽象昵慌。
既然委托是一種類(lèi)型假夺,那么它存儲(chǔ)的是什么數(shù)據(jù)?
委托是方法的抽象斋攀,它存儲(chǔ)的就是一系列具有相同簽名和返回回類(lèi)型的方法的地址已卷。調(diào)用委托的時(shí)候,委托包含的所有方法將被執(zhí)行淳蔼。
- 如何使用委托
在使用委托的時(shí)候侧蘸,你可以像對(duì)待一個(gè)類(lèi)一樣對(duì)待它。即先聲明鹉梨,再實(shí)例化讳癌。只是有點(diǎn)不同,類(lèi)在實(shí)例化之后叫對(duì)象或?qū)嵗嬖恚性趯?shí)例化后仍叫委托晌坤。
- 委托聲明:public delegate bool SelectStr (string a);
上述代碼指出逢艘,如果要?jiǎng)?chuàng)建SelectStr的一個(gè)實(shí)例,需要帶一個(gè)string 參數(shù)的方法骤菠,而且該方法需要有一個(gè)bool返回類(lèi)型它改。
- 定義一個(gè)方法:
public staticbool Function(stringa)
{ return a.Length == 2; }
- 創(chuàng)建一個(gè)委托實(shí)例:SelectStr s = new SelectStr(Function);
創(chuàng)建委托實(shí)例,使用了new 關(guān)鍵字商乎,說(shuō)明委托也是類(lèi)央拖,將方法名Function作為參數(shù)綁定到該委托實(shí)例,也就是將方法Function指派給SelectStr委托鹉戚,并將該引用賦給s對(duì)象鲜戒,也就表示s對(duì)象保存了指向Function方法的引用,以此實(shí)現(xiàn)了對(duì)Function的回調(diào)崩瓤。由此可見(jiàn)袍啡,委托表示了對(duì)其回調(diào)方法的簽名,可以將方法當(dāng)做參數(shù)進(jìn)行傳遞却桶,并根據(jù)傳入的方法來(lái)動(dòng)態(tài)的改變方法調(diào)用境输,只要為委托提供相同的簽名的方法,都可以與委托綁定颖系。
- 調(diào)用委托:bool a=s(“aa”);
可以認(rèn)為該代碼結(jié)果等于bool a= Function(“aa”);
回到上訴的.where里的參數(shù)delegate(string a) { return a.Length == 2;}嗅剖。這個(gè)其實(shí)是委托的匿名函數(shù)。
2. 泛型委托:
private Func<string, bool> del;
del =new Func<string, bool>(Function);
上面泛型委托定義和下面委托的定義得到的del結(jié)果相同嘁扼。
public delegate bool SelectStr (string a);
SelectStr
del = new SelectStr (Function);
為什么系統(tǒng)會(huì)提供泛型委托信粮,可以這么理解:我們?cè)陂_(kāi)發(fā)中會(huì)將一個(gè)類(lèi)多次實(shí)例化,而并不是每次要用到同一個(gè)類(lèi)都去創(chuàng)建類(lèi)再實(shí)例化趁啸。使用普通的委托定義其實(shí)是每次定義一個(gè)委托强缘,再實(shí)例化,可以理解成每次要用到同一個(gè)類(lèi)都去創(chuàng)建類(lèi)再實(shí)例化相似不傅,因此出現(xiàn)泛型委托旅掂,其中泛型委托有兩種:Func和Action.他們的區(qū)別在于Func是有返回值的,它的最后一個(gè)參數(shù)類(lèi)型就是方法返回類(lèi)型访娶,前面的參數(shù)類(lèi)型是方法的參數(shù)類(lèi)型(要一一對(duì)應(yīng))商虐,而Action沒(méi)有返回值,因此他不需要最后多一個(gè)參數(shù)崖疤。
3. 委托加減運(yùn)算:
可以使用+=運(yùn)算符秘车,為委托新增方法。
同樣可以使用-=運(yùn)算符劫哼,為委托移除方法叮趴。
del += ClassName.FunctionName; // 增加方法
del -= ClassName. FunctionName; //移除
當(dāng)一個(gè)委托通過(guò)+=新增多個(gè)方法時(shí),調(diào)用該委托會(huì)將新增的所有方法執(zhí)行一遍权烧,如果該委托是有返回值的眯亦,那么它只返回最后一次增加的方法的返回值咳蔚。
4、Lambda表達(dá)式
Lambda表達(dá)式主要用來(lái)簡(jiǎn)化匿名方法的語(yǔ)法搔驼。在匿名方法中,delegate關(guān)鍵字有點(diǎn)多余侈询,因?yàn)榫幾g器已經(jīng)知道我們將方法賦值給委托舌涨。通過(guò)幾個(gè)簡(jiǎn)單步驟,我們就可以將匿名方法轉(zhuǎn)換為L(zhǎng)ambda表達(dá)式:
在參數(shù)列表和匿名方法主體之間防Lambda運(yùn)算符=>扔字。Lambda運(yùn)算符讀作"goes to"鲫咽。
private Func<string, string> del;
del = delegate( string x) { returnx; };//匿名方法
del = (string x) => {return x;};//Lambda表達(dá)式
del = x => {return x};//簡(jiǎn)寫(xiě)的Lambda表達(dá)式
5. 推薦一個(gè)學(xué)習(xí)網(wǎng)站:傳智播客
里面有很多免費(fèi)的開(kāi)發(fā)教程視頻撮躁,講得很詳細(xì),有時(shí)間可以去學(xué)學(xué)。