C# 實(shí)例詳解委托之Func、Action、delegate(精品)
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
概述委托是.NET編程的精髓之一,在日常編程中經(jīng)常用到,在C#中實(shí)現(xiàn)委托主要有Func、Action、delegate三種方式,本節(jié)主要就這三種委托的用法通過實(shí)例展開講解。 Func用法解析【Func】:Func是帶返回值的委托: 原型函數(shù)如下(以下展示的是有兩個(gè)參數(shù)的情況): public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2); 用法舉例1: 定義方法StringAddA public int StringAddA(string a, string b) { return int.Parse(a) + int.Parse(b); } 定義委托func,然后把方法StringAddA委托給它,接下來執(zhí)行委托并獲取結(jié)果,注意: Func<string, string, int> func = StringAddA; Func<string, string, int> func = new Func<string, string, int>(StringAddA); 的簡寫 Func<string, string, int> func = StringAddA;//簡寫 var result = func.Invoke("3", "5");//可以簡化為func("3", "5") sw.AppendLine($"【func用法1】func返回結(jié)果是:{result}"); 這里的執(zhí)行結(jié)果是: 【func用法1】func返回結(jié)果是:8 用法舉例2: 用lamda表達(dá)式簡化寫法,通過+=注冊實(shí)現(xiàn)多播委托 func += (a, b) => { return int.Parse(a) - int.Parse(b); }; sw.AppendLine($"【func用法2】func返回結(jié)果是:{func("3", "5")}"); 這里的執(zhí)行結(jié)果是: 【func用法1】func返回結(jié)果是:-2 注意 += 可以注冊多個(gè)委托,委托執(zhí)行后會(huì)按順序執(zhí)行方法. Action用法解析【Action】:Action是無返回值的委托: 原型函數(shù)如下(以下展示的是有兩個(gè)參數(shù)的情況): public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2); 用法舉例: 先定義方法:StringAddB public void StringAddB(string a, string b) { sw.AppendLine($"【Action用法】Action執(zhí)行結(jié)果:{(int.Parse(a) + int.Parse(b))}"); } 實(shí)例如下: Action<string, string> action = StringAddB;//簡寫 IAsyncResult asyncResult = action.BeginInvoke("3", "5", null, null);//action("3", "5"),BeginInvoke異步執(zhí)行,即:開啟新現(xiàn)成處理StringAddB action.EndInvoke(asyncResult);//阻塞委托,直到執(zhí)行完成 if (asyncResult.IsCompleted) { sw.AppendLine($"【Action用法】當(dāng)前異步委托線程已執(zhí)行完成"); } 這里BeginInvoke是異步委托,即新開線程去處理,我們的窗體線程在1號(hào)線程,這里我們可以在StringAddB里面打印線程id號(hào) sw.AppendLine($"【Action用法】Action執(zhí)行線程id:{Thread.CurrentThread.ManagedThreadId}"); 運(yùn)行結(jié)果: 【Action用法】Action執(zhí)行線程id:3 這里的EndInvoke是阻塞委托,直到執(zhí)行完成,當(dāng)然我們這里也可以用同步的Invoke去執(zhí)行,甚至Invoke都可以簡寫去掉,直接寫成action("3", "5") delegate用法解析【delegate】:delegate是可以有返回值也可以沒返回值的委托: 使用前需要先聲明: delegate int DelegateM(string a, string b);//聲明,可以有返回值也可以沒有 用法舉例: //delegate用法 //DelegateM delegateM = new DelegateM(p.StringAddA); DelegateM delegateM = StringAddA;//簡寫 sw.AppendLine($"【delegate用法】delegate返回結(jié)果是:{delegateM("3", "5")}"); 以上就是三種委托的區(qū)別和用法講解,那使用委托最大的優(yōu)勢是什么: 可以將方法當(dāng)作參數(shù)去傳遞,用法舉例如下: Test(func, action);//將方法委托后轉(zhuǎn)化為參數(shù)進(jìn)行傳遞 定義方法 public void Test(Func<string, string, int> f, Action<string, string> a) { a.Invoke(f.Invoke("3", "5").ToString(), "5"); } 該文章在 2024/1/23 12:47:02 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |