iT邦幫忙

第 11 屆 iThome 鐵人賽

0
Software Development

我要轉職成 C# / .NET 工程師系列 第 31

現成委派類 - Func <T> 與 Action <T>

現在鐵人賽結束,開始要漸漸的把文章轉到自己的部落格上,歡迎各位幫我的FB按讚@@
個人粉絲專頁:https://www.facebook.com/dannyliu.me
個人部落格:https://dannyliu.me/

前幾天提到C#1.0委派時,在那時候用delegate設計了需要把外部方法傳入物件裡面的類別如下:
https://ithelp.ithome.com.tw/upload/images/20191018/20120420LF5PGXibc6.png

我們建立委派類別來限制從外部傳入方法的傳入型別種類與數量,並且限制其回傳型別,上述程式碼中定義了能被委派的方法是無回傳值(void),並且要接受一個int傳入值(int i),這是以我們自行設定委派類別的動作,我們之前在泛型時提到過填入型別會產生對應型別的程式碼,而在.NET Framework 3.5類別庫(與C#3.0一同推出)已經透過泛型定義好委派類別讓我們直接使用,減少我們額外的宣告委派的動作。而這些定義好的泛型delegate類別就是今天要講的 Func 與 Action。

現成委派類 - Func與Action

  • Action - 接受沒有回傳值的void方法
  • Func - 接受有回傳值的方法

透過Action跟Func這些定義好的委派類別可以讓我們省略自己定義委派類別的步驟,而剛剛上述程式碼因為沒有回傳值所以要改用Action中的泛型Action<T>,並將傳入型別T改為int,結果如下:
https://ithelp.ithome.com.tw/upload/images/20191019/20120420xS0Z3k6SpH.png

.NET Framework原始碼

最基本的Action-沒有傳入值也沒有回傳值

https://ithelp.ithome.com.tw/upload/images/20191019/20120420uNc2KMGwxY.png

最基本的Func-有一個回傳值但沒有傳入值

https://ithelp.ithome.com.tw/upload/images/20191019/20120420wNv9uaOWsX.png
以這個例子為例,如果我們要有string回傳值並且有int一個傳入值的方法,可以用Func<T,TResult>,前面的T寫傳入的型別,後面的TReult寫回傳的型別,

    public void 執行2(Func<int,string> 通知方法)
    {
        int 結果 = 123;

        通知方法(結果);
    }

.NET Framework還定義了其他不同傳入數量的Action與Func
https://ithelp.ithome.com.tw/upload/images/20191019/20120420nYakxBYmxK.png
https://ithelp.ithome.com.tw/upload/images/20191019/201204202WrqMefb6F.png

回頭看看

我們在使用這個計算類別時,因為C#2.0的語法省略宣告委派直接將方法傳入,如下:
https://ithelp.ithome.com.tw/upload/images/20191018/2012042085ZT25EWvM.png

最後可以看到明明是透過delegate委派來傳遞方法,但是透過Func與Action來撰寫程式碼的過程中讓我們有種delegate已經消失的感覺。


上一篇
心得
下一篇
C# 3.0 擴充方法
系列文
我要轉職成 C# / .NET 工程師34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言