希格工作室

2012年12月26日 星期三

Func & Action


​這兩個用法我之前就很想搞懂,
但因為不知道怎麼去Google這關鍵字所以一直懸在心上
(<--實力差又沒在買書看的人)
剛好曹祖聖老師來公司上課時有舉到範例,解了我心懸一念
故在這邊簡略示意一般


一般我們可能會做個函式如:
​​​
01         public static string abc2(int a,int b)
02         {
03             return (a+b).ToString();
04         }


然後去針對abc2()去呼叫它(static別管它),一般的呼叫我們應該都知道了,只是我們也可以用Func的方式去呼叫它,如:
01 Func<int, int, string> dd = new Func<int, int, string>(abc2);


我們可以簡化它
01 Func<int, int, string> dd = abc2;


然後使用Invoke()或其它去執行它
01 dd.Invoke(1, 2)


但我們有時可能不希望函式寫一大堆,或是許多原因等,也可以用Func去改寫abc2:
01             Func<int, int, string> dd2 = new Func<int, int, string>(
02                 (a1,a2) =>
03                 {
04                     return (a1 + a2).ToString();
05                 }
06                 );


一樣用Invoke()或其它去執行它​
01 
02             Console.WriteLine(dd.Invoke(1, 2));
03             Console.WriteLine(dd.Invoke(1, 3));
04             Console.WriteLine(dd.Invoke(1, 4));
05             Console.WriteLine(dd.Invoke(1, 5));


有時依需求,因為這程式段落已經被拉到內層了使用了,所以甚至可以把a1 a2給省略或整合掉
01             int O1, O2;
02             O1 = 1; O2 = 2;
03             Func<string> dd2 = new Func<string>(
04                 () => {
05                     return (O1 + O2).ToString();
06                 }
07                 );
08             Console.WriteLine(dd2.Invoke());

​​​簡略來說就這樣囉,謝謝有來看的人觀賞~~~~
































嗯?怎麼沒講到Action?
其實Action一樣用法
只是Action對應的是void類型
而Func對應的是有return的類
看在你願意把畫面拉下來的份上,我還是貼個CODE好了
01             Action<int> fff = def;
02 
03             Action<int> dfqefqf = new Action<int>(
04                 delegate(int a1)
05                 {
06                 }
07                 );
08 
09 
10             Action<int> dfqefqf2 = new Action<int>(
11                 (no) =>
12                 {
13                     //code
14                 }
15                 );
以上~88

PS:有無發現,其實內圈的自定函式,是跑delegate的,只是剛才我都省略掉而已哦。