概述
? ? ?委托是.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異步執行,即:開啟新現成處理StringAddBaction.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");}
以上就是本節全部內容,下節將針對事件委托展開講解,敬請關注!