2017.11.06 委托

分享人:蔡永堅(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; }。

  • 什么是委托
  1. 從數(shù)據(jù)結(jié)構(gòu)來(lái)講岭妖,委托是和類(lèi)一樣是一種用戶自定義類(lèi)型临庇。

  2. 從設(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)站:傳智播客

http://www.itcast.cn/

里面有很多免費(fèi)的開(kāi)發(fā)教程視頻撮躁,講得很詳細(xì),有時(shí)間可以去學(xué)學(xué)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悟狱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子析蝴,更是在濱河造成了極大的恐慌懂诗,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抛虏,死亡現(xiàn)場(chǎng)離奇詭異博其,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)迂猴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)慕淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人沸毁,你說(shuō)我怎么就攤上這事峰髓。” “怎么了息尺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵携兵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我掷倔,道長(zhǎng)眉孩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任勒葱,我火速辦了婚禮浪汪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凛虽。我一直安慰自己死遭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布凯旋。 她就那樣靜靜地躺著呀潭,像睡著了一般钉迷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钠署,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天糠聪,我揣著相機(jī)與錄音,去河邊找鬼谐鼎。 笑死舰蟆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狸棍。 我是一名探鬼主播身害,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼草戈!你這毒婦竟也來(lái)了塌鸯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤唐片,失蹤者是張志新(化名)和其女友劉穎丙猬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體牵触,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淮悼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揽思。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袜腥。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钉汗,靈堂內(nèi)的尸體忽然破棺而出羹令,到底是詐尸還是另有隱情,我是刑警寧澤损痰,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布福侈,位于F島的核電站,受9級(jí)特大地震影響卢未,放射性物質(zhì)發(fā)生泄漏肪凛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一辽社、第九天 我趴在偏房一處隱蔽的房頂上張望伟墙。 院中可真熱鬧,春花似錦滴铅、人聲如沸戳葵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拱烁。三九已至生蚁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戏自,已是汗流浹背邦投。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擅笔,地道東北人尼摹。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像剂娄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玄呛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容