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