Delegate、Action、Func的使用時機以及差異(Action篇)

  • 19394
  • 0
  • C♯
  • 2017-06-20

前陣子上了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


LINE討論群FB討論區

歡迎您的加入,讓這個社群更加美好!

聯絡方式:
FaceBook
E-Mail