1. 程式人生 > >【轉】C#中Func與Action的理解

【轉】C#中Func與Action的理解

.net ring UNC 簡單 代碼 操作 不必要 返回值 tps

原文地址:https://www.cnblogs.com/ultimateWorld/p/5608122.html

Action 與 Func是.NET類庫中增加的內置委托,以便更加簡潔方便的使用委托。
最初使用委托時,均需要先定義委托類型,然後定義一個符合委托類型簽名的函數,
在調用前,需聲明並創建委托對象,將指定函數與委托進行關聯。
如例1:
public delegate int Math(int param1,int param2);定義委托類型
Public int Add(int param1,int param2)//定義同簽名函數
{
Return param1+param2;
}
Math math;//聲明委托
math=new Math(Add);創建委托對象,與指定進行關聯
math(3,4);//調用委托函數
如果需要三個、四個參數的委托類型,則需要再次定義委托類型。簡單的委托調用,卻需要根據簽名不斷改變多次定義委托類型,而微軟推出了對此進行簡化的內置委托類型:
Action和Func,簡化了這些不必要的操作。
內置委托類型,顧名思義Action和Func本身就是已經定義好的委托類型。兩種委托類型的區別在於:Action委托簽名不提供返回類型,而Func提供返回類型。
Action委托具有Action<T>、Action<T1,T2>、Action<T1,T2,T3>……Action<T1,……T16>多達16個的重載,其中傳入參數均采用泛型中的類型參數T,涵蓋了幾乎所有可能存在的無返回值的委托類型。Func則具有Func<TResult>、Func<T,Tresult>……Func<T1,T2,T3……,Tresult>17種類型重載,T1……T16為出入參數,Tresult為返回類型。
例1通過簡單改造:
Func<int,int,int> math=Add;//指定委托對象並關聯函數
math(3,4);//調用委托函數
無需定義直接進行聲明關聯。
既然是委托類型,也同樣可以與匿名函數、或者采用Lambda表達式結合使用:
匿名函數:
Func<int,int,int> math=delegate(int param1,int param2)
{
Return param1+param2;
}
Lambda:
Func<int,int,int> math=(param1,param2)=>
{
Return param1+param2;
}
Action的使用如同上面Func的使用一樣,只是缺少了返回類型,直接調用委托函數。
Public void Add(int param1,int param2)
{
MessageBox.show((param1+param2).ToString());
}
遇到此類的委托函數調用,那我們就可以直接用Action了:
Action<int,int> math=Add;
math(3,4);
以上是個人對Action和Func的簡單理解和介紹,代碼均在文檔中手敲進行示意性展示,如果存在問題還請諒解。

【轉】C#中Func與Action的理解