[C#]委派類型

  • 1553
  • 0
  • C#
  • 2020-07-02

什麼是委派呢?簡單來說就是允許將方法當作參數進行傳遞。

這篇的重點將放在委派類型(Delegate)的重要知識點。

  • 委派類型是一種參考類型,它的變數可以引用著一個物件,或是null值。這點和一般類別類型是一樣的。
  • 委派類型物件用來包裹「簽章」匹配的方法。
  • 委派類型的使用時機,在程式中扮演著間接叫用方法(Method)的功能,當一段程式碼中的上下文所需叫用的方法,不是固定的、是需要變動,或靈活性地替換叫用的方法,那麼使用委派類型是最好的選擇
    適時的善用Delegate能讓程式的耦合性降低,提升靈活性。
  • 宣告委派類型的方式,與宣告方法相似,必須提供「簽章」(回傳值型別、型別參數與數目)。
//宣告委派類型
namespace ConsoleApp1
{
    class Program
    {      
        static void Main(string[] args)
        {        
           
        }
    }
//回傳值型別int、(型別參數int)*2個
    delegate int MyDele(int x, int y);   
}
  • 委派類型物件可以封裝一個或多個方法,稱為單點傳送委派、合併委派Multicast Delegate(多點傳送委派)。
namespace ConsoleApp1
{
    class Program
    {
        
        static void Main(string[] args)
        {
            //單點傳送委派
            MyDele dele = new MyDele(Calaulator.Add);//封裝
            
            //叫用 委派物件封裝的方法,類似叫用一般方法的方式
            int res = dele(100, 200);
            
            //多點傳送委派(合併委派)
            dele += (new Calaulator()).Sub;//封裝
            int res2 = dele(200, 100);//叫用
            

            Console.WriteLine(res);
            Console.WriteLine(res2);
        }
    }

    class Calaulator
    {
        public static int Add(int a, int b)//靜態
        {
            return a + b;
        }

        public int Sub(int a, int b)//非靜態
        {
            return a - b;
        }
    }


    delegate int MyDele(int x, int y);
   
}

輸出結果:
300
100


  • 泛型委派在.net framework的預設裡分為兩大類:第一類 回傳值為void且帶一個或多個參數的委派Action,第二類 回傳值非void且帶一個或多個參數的委派Func。

例子:第一類 回傳值為void且帶2個參數的委派Action

 class Program
    {

        static void Main(string[] args)
        {
            Action<string, int> action = new Action<string, int>(SayHello);
            action("Lucy", 3);

        }

        static void SayHello(string name,int round)
        {
            for (int i = 0; i < round; i++)
            {
                Console.WriteLine($"Hello,{name}!");
            }
               
             
        }
    }

輸出結果:
Hello,Lucy!
Hello,Lucy!
Hello,Lucy!

例子:第二類 回傳值類型不為void且帶2個參數的委派Func

 class Program
    {

        static void Main(string[] args)
        {
            //使用Func有回傳值的泛型委派

            //包裹方法
            var func = new Func<int, int, int>(Calculator.Add);
            //叫用方法
            int res = func(100, 200);
            Console.WriteLine(res);

            var func1 = new Func<double, double, double>((new Calculator()).Mul);
            double result = func1(5.0, 4.0);
            Console.WriteLine(result);
        }

      
    }

    class Calculator
    {
        public static int Add(int a, int b)
        {
            return a + b;
        }
        public double Mul(double a, double b)
        {
            return a * b;
        }
    }

輸出結果:
300
20

參考資料:
https://medium.com/@ad57475747/c-%E9%9B%9C%E8%A8%98-%E5%A7%94%E6%B4%BE-delegate-func-action-4b3191c7a131

如有敘述錯誤,還請不吝嗇留言指教,thanks!