iT邦幫忙

0

C# delegate

我們習慣把數據或者對像作為參數傳遞給方法,比如: int i = int.Parse("99");

int i = int.Parse("99");

如果我們把方法作為參數傳遞給方法,這就需要用到委託了

namespace delegate_test_01
{
    class Program
    {
        //我們習慣把數據或者對像作為參數傳遞給方法,
        //比如:  int i = int.Parse("99");
        //如果我們把方法作為參數傳遞給方法,這就需要用到委託了
        public delegate void toSometing(int number);
        //C#中委託的參數和返回類型,都要和你要具體委託的方法要一致

        public static void PrintNum(int number) //預計要被傳遞的方法
        {
            Console.WriteLine($"PrintNumber:{number}");                      
        }
        
        public static void SquareFunction(int number) // print數字的平方
        {
            Console.WriteLine($"SquareFunction:{Math.Pow(number, 2)}");
        }
                
        public static void RadicalFunction(int number)// print數字開根號
        {
            Console.WriteLine($"RadicalFunction:{Math.Sqrt(number)}");
        }

        static void Main(string[] args)
        {
            //字面上理解委託,就像是A委託B去辦一件事情一樣
            // WriteSometing 請 PrintNumber 處理事情
            toSometing delegateTestA = new toSometing(PrintNum);//傳統寫法            
            
            delegateTestA += RadicalFunction;
            delegateTestA += PrintNum;
            delegateTestA += SquareFunction;
            delegateTestA(25);

            Console.WriteLine("====以下另一個委任====");
            toSometing b = PrintNum;     //語法糖
            b(88);

            Console.WriteLine("按任意鍵結束....");
            Console.ReadKey();  //可按任意鍵結束畫面
        }
    }
}

結果
PrintNumber:25
RadicalFunction:5
PrintNumber:25
SquareFunction:625
====以下另一個委任====
PrintNumber:88
按任意鍵結束....


實際應用的情境 教學 引用高手文章
https://eric0806.blogspot.com/2015/01/dotnet-delegate-usage.html


delegate 多播委託
委託的多播(Multicasting of a Delegate)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//delegate int NumberChanger(int n);

namespace multicasting1
{
    //delegate int NumberChanger(int n);
    class Program
    {
        delegate int NumberChanger(int n);
        
        static int num = 10;

        public static int AddNum(int p)
        {
            num += p;
            return num;
        }

        public static int MultNum(int q)
        {
            num *= q;
            return num;
        }

        public static int getNum()
        {
            return num;
        }

        static void Main(string[] args)
        {
            NumberChanger nc; //nc=5
            NumberChanger nc1 = new NumberChanger(AddNum);  
            //宣告的委派 有一個int參數5 這參數會送進 AddNum 方法當參數使用 num = num+5; 10+5
            NumberChanger nc2 = new NumberChanger(MultNum);  
            //宣告的委派 有一個int參數5 這參數會送進 MultNum 方法當參數使用15*5

            nc = nc1;
            nc += nc2;

            nc(5);  
            //使用同一個參數5 委派串了兩個方法 兩個方法參數都是5
            //num的值隨著方法 一直被更改值 一開始是num=10
            //進了第一個方法 num=15 進了第二個方法 num=75
            Console.WriteLine("Value of Num: {0}", getNum());
            Console.ReadKey();
        }
    }
}


尚未有邦友留言

立即登入留言