前陣子上了OOP的課程後,仍對委派一直不是很熟悉,但知道了Action以及Func的用途後後,也慢慢地感受到了委派使用的方式以及時機。我會先讓大家寫Action、Func,接著再來認識底層的Delegate是如何實作,相信能比較好上手。
什麼是Action?什麼是Fuck(Func)?
對於英文不好的我在初期看到Func真的只想說Fuck,這到底是什麼鬼呢?
為了認識委派的使用時機,先來個情境題!
在設計讀取Excel套件的時候,會知道使用者的Excel欄位有哪些名稱嗎?
肯定不知道對吧!因為我們不知道有哪些欄位,要對應到哪個屬性,這段只能知道執行時的需要帶入哪些資料(參數),以及執行後的結果(return),因此就必須讓外部自行實做這段程式碼。
可是從目前既有的知識中,了解屬性、函式、類別、甚至是靜態函式,都沒有這種使用可供外部實做程式碼的語法。
這時候委派就上場啦!
所以簡單來說,我個人把委派當作為外部開後門的一個語法。那該怎麼傳入參數呢?
先來看看Action在MSDN中的解釋
「封裝沒有參數且沒有傳回值的方法。」
這段說明了Action是一個不會傳回值的函式。接著來實做Action。
在這邊我會切割成二個檔案,主要是希望看的朋友可以了解函式如何被當成參數傳遞
先來建立一個Class1的類別
using System;
namespace ConsoleApp5
{
public class Class1
{
// 撰寫一個函式
// 在呼叫時,外部要傳入一個Action
// Action 即是 無返回值的一個函式
public static void DelegateByAction(Action action)
{
// 外部傳入一個函式,在這邊做執行
// 但是要做什麼事,DelegateByAction本身並不知道
action();
}
}
}
接著在外面實做程式碼
using System;
namespace ConsoleApp5
{
class Program
{
// 外部實做的無返回值函式,會印出Hello World!
private static void Hello()
{
Console.WriteLine("Hello World!");
}
static void Main(string[] args)
{
// 把Hello這個無返回值的函式當作參數傳遞
Class1.DelegateByAction(Hello);
}
}
}
所以執行時期會變成這個樣子,把函式的記憶體位址傳入給Action所以執行到action();的時候,結果會印出「Hello World!」
再回頭來看看Action的定義
「封裝沒有參數且沒有傳回值的方法。」
是不是對應到Hello的函式無返回值的特性呢。因此Action是給外部實做程式碼的一段函式,既然都說了函式,那傳入參數無返回值的方式應該也能理解吧。
另外值得一提的部分是,Action雖然無返回值,但是可傳入的參數可從0個,到多達16個之多,這則是透過多載完成的。
public void Action<T>(Action<T> action)
{
}
public void Action<T,T1>(Action<T,T1> action)
{
}
public void Action<T, T1, T2>(Action<T, T1, T2> action)
{
}
public void Action<T, T1, T2, T3>(Action<T, T1, T2, T3> action)
{
}
知道了就去寫多載來練習XD
這就是Action傳入參數的方式,至於T是什麼呢?看第三篇就知道了XD
歡迎您的加入,讓這個社群更加美好!