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

  • 17951
  • 0
  • C♯
  • 2017-06-29

Lambda是函式的簡寫,顧名思義就是把一串函式用很精簡的方式表達。我想一定有人覺得很奇怪,怎麼會講到Lambda呢?

因為擴充方法加上FuncAction,最後再加上Lambda,就是我們在LINQ中經常看到的.Where、.Sum的寫法啦!

這麼好用的東西當然要給他介紹一下,您說是吧?

首先先來回顧一下Action的寫法

Class1

    public class Class1
    {
        // 撰寫一個函式
        // 在呼叫時,外部要傳入一個Action
        // Action 即是 無返回值的一個函式
        public static void DelegateByAction(Action action)
        {
            // 外部傳入一個函式,在這邊做執行
            // 但是要做什麼事,DelegateByAction本身並不知道
            action();
        }
    }

Main

        private static void Hello()
        {
            Console.WriteLine("Hello World!");
        }

        static void Main(string[] args)
        {
            // 把Hello這個無返回值的函式當作參數傳遞
            Class1.DelegateByAction(Hello);
        }

在這邊我們即將移除Hello這段函式,會改成這樣

    class Program
    {
        //private static void Hello()
        //{
        //    Console.WriteLine("Hello World!");
        //}

        static void Main(string[] args)
        {
            // 有沒有發現這邊寫得很奇怪呢?繼續看下去吧!
            Class1.DelegateByAction(() => Console.WriteLine("Hello World!"));
        }
    }

在這邊會寫的這個奇怪,是因為函式的表達方式被簡寫了

()代表著函式中要傳入的參數,因此如果Action有多個參數,則就在()中把參數帶入,應該很合理吧?

若是只傳入一個參數,則可以省略()這個符號

箭頭函式就不用想太多了,純粹就是個表達參數的方式而已

而後方的Console.WriteLine("Hello World!")即是要呈現的程式碼,如果有多行的程式碼,則必須使用大括號包夾{}

 

在這邊應該可以知道()代表函式中的()符號,至於{}則是代表函式中的{}符號,應該認識到Lambda是怎麼來的了吧!

將傳入的參數,指定給要實做的程式碼,表達的方式就是(參數) => {實做程式碼},想更了解的人可以上網查arrow function!

如果遇到Func的話,則在實做的程式碼中加個return即可

 

還是看不懂的話可以參考參考這篇

        static void Main(string[] args)
        {
            string hello = "Hello World!";

            // Action函式會印出Hello World!
            Action action = () => Console.WriteLine(hello);
            action();

            // 返回一個Hello World!的字串
            Func<string> func = () => { return hello; };
            var str = func();
        }

 


LINE討論群FB討論區

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

聯絡方式:
FaceBook
E-Mail