現在鐵人賽結束,開始要漸漸的把文章轉到自己的部落格上,歡迎各位幫我的FB按讚@@
個人粉絲專頁:https://www.facebook.com/dannyliu.me
個人部落格:https://dannyliu.me/
前幾天提到C#1.0委派時,在那時候用delegate設計了需要把外部方法傳入物件裡面的類別如下:
我們建立委派類別來限制從外部傳入方法的傳入型別種類與數量,並且限制其回傳型別,上述程式碼中定義了能被委派的方法是無回傳值(void),並且要接受一個int傳入值(int i),這是以我們自行設定委派類別的動作,我們之前在泛型時提到過填入型別會產生對應型別的程式碼,而在.NET Framework 3.5類別庫(與C#3.0一同推出)已經透過泛型定義好委派類別讓我們直接使用,減少我們額外的宣告委派的動作。而這些定義好的泛型delegate類別就是今天要講的 Func 與 Action。
透過Action跟Func這些定義好的委派類別可以讓我們省略自己定義委派類別的步驟,而剛剛上述程式碼因為沒有回傳值所以要改用Action中的泛型Action<T>,並將傳入型別T改為int,結果如下:
.NET Framework原始碼
以這個例子為例,如果我們要有string回傳值並且有int一個傳入值的方法,可以用Func<T,TResult>,前面的T寫傳入的型別,後面的TReult寫回傳的型別,
public void 執行2(Func<int,string> 通知方法)
{
int 結果 = 123;
通知方法(結果);
}
.NET Framework還定義了其他不同傳入數量的Action與Func
我們在使用這個計算類別時,因為C#2.0的語法省略宣告委派直接將方法傳入,如下:
最後可以看到明明是透過delegate委派來傳遞方法,但是透過Func與Action來撰寫程式碼的過程中讓我們有種delegate已經消失的感覺。