基礎才是重(zhong)(zhong)中之重(zhong)(zhong)~委(wei)托(tuo)實例的幾種定義(yi)方式(shi)(規(gui)規(gui)矩(ju)矩(ju)method,邏輯簡單delegate,層次清(qing)晰lambda
委(wei)(wei)托(tuo)(tuo),一個(ge)不錯(cuo)的東(dong)西,.net中的委(wei)(wei)托(tuo)(tuo)用(yong)著挺爽,它的重要性(xing)以至于微軟把(ba)(ba)它單拿出(chu)來(lai),定義了(le)(le)幾個(ge)現(xian)成的委(wei)(wei)托(tuo)(tuo),如(ru),Func和Action,既然人家把(ba)(ba)最特殊的委(wei)(wei)托(tuo)(tuo)簽名拿 出(chu)來(lai)了(le)(le),所(suo)以咱們就不
自(zi)己去(qu)定義了,就(jiu)用Func和Action委托去(qu)講一個如何定義他們的(de)實例吧,呵呵。
第一 規規矩矩定義方法method
1 /// <summary> 2 /// 與(yu)Func<string>相同(tong)的方法簽名(ming) 3 /// </summary> 4 /// <returns></returns> 5 static string StandardFunc() { return "標準點好(hao)"; } 6 Func<string> Standard = new Func<string>(StandardFunc);//標準(zhun)的(de)委托實例
第二 邏輯簡單匿名方法delegate
在對于方(fang)(fang)(fang)法邏輯簡單(dan)的時(shi)候,我們沒有必須(xu)再(zai)去定義一個額外的方(fang)(fang)(fang)法,而(er)直接使用匿名方(fang)(fang)(fang)法即可
1 Func<string, bool> FuncWhat2 = delegate(string s) { return s == "hello"; };//delegate定(ding)義一個(ge)(ge)匿名方法,不用重新再定(ding)義一個(ge)(ge)方法了
1 Func<bool> FuncWhat3 = delegate() { return true; };
第三 層次清晰lambda
同(tong)樣(yang)的邏輯簡單,使用(yong)lambda表(biao)達(da)式(shi)則會使代碼層次(ci)感更清晰,本人超級推(tui)薦,呵呵
1 Func<string, string> FuncWhat4 = (string msg) => hello(msg);
事實上(shang),微軟自己(ji)的類庫,也經常(chang)使用(yong)這種lambda方式,在每個新的技術出現時,小(xiao)微自己(ji)都(dou)先(xian)去嘗試(shi),呵(he)呵(he)。
1 // 2 // 摘要(yao): 3 // 通過使(shi)用實現驗證(zheng)資(zi)源訪問功能的函數(shu),初始化 System.ComponentModel.DataAnnotations.ValidationAttribute 4 // 類的新實(shi)例。 5 // 6 // 參(can)數: 7 // errorMessageAccessor: 8 // 實現驗(yan)證資源訪問的函(han)數(shu)。 9 // 10 // 異(yi)常: 11 // System:ArgumentNullException: 12 // errorMessageAccessor 為 null。 13 protected ValidationAttribute(Func<string> errorMessageAccessor);
上(shang)面我只是一個簡單的舉例,在實(shi)際開發時,還要因情況而定,下面是在實(shi)現項目中的一個應用(yong),當用(yong)戶登陸時,去觸發一個LogOn事件(jian),然后,所(suo)以訂閱了它(ta)的方法都(dou)自(zi)動去處理(li)自(zi)己(ji)的
邏輯,看代碼:
1 /// <summary> 2 /// 登陸事(shi)件 3 /// </summary> 4 public class LogOnEvent 5 { 6 7 /// <summary> 8 /// 登陸后的事件(jian) 9 /// </summary> 10 public static event Action LogOnAfter; 11 12 /// <summary> 13 /// 觸(chu)發RegisterAfter事件(在本(ben)程序集中去觸(chu)發) 14 /// </summary> 15 internal static void OnLogOnAfter() 16 { 17 if (LogOnAfter != null) 18 { 19 LogOnAfter(); 20 } 21 } 22 23 }
而如(ru)果你希望在系(xi)統登陸時,去做一些(xie)事(shi)情,你可以先(xian)去訂閱它就可以了,類型這種:
1 //lambda方式 2 LogOnEvent.LogOnAfter += () => 3 { 4 //登陸后要處理的邏輯 5 }; 6 //匿名(ming)方法方式 7 LogOnEvent.LogOnAfter += delegate() 8 { 9 //登(deng)陸后(hou)要處(chu)理的邏輯 10 }; 11 //普(pu)通方(fang)式 12 LogOnEvent.LogOnAfter += LogDiary;