天天看點

C# 委托 Delegate 【基礎】C# 委托(Delegate)

C# 委托(Delegate)

委托(Delegate) 是存有對某個方法的引用的一種引用類型變量。引用可在運作時被改變。

委托(Delegate)特别用于實作事件和回調方法。所有的委托(Delegate)都派生自 System.Delegate 類。

聲明委托(Delegate)

委托聲明決定了可由該委托引用的方法。委托可指向一個與其具有相同标簽的方法。

例如,假設有一個委托:

public delegate int MyDelegate (string s);
           

上面的委托可被用于引用任何一個帶有一個單一的 string 參數的方法,并傳回一個 int 類型變量。

一個簡單的委托執行個體

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

delegate int NumberChanger(int n);
namespace DelegateDemo
{
    class Program
    {
        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 nc1 = new NumberChanger(AddNum);
            NumberChanger nc2 = new NumberChanger(MultNum);
            // 使用委托對象調用方法
            nc1(25);
            Console.WriteLine("Value of Num: {0}", getNum());
            nc2(5);
            Console.WriteLine("Value of Num: {0}", getNum());
            Console.ReadKey();
        }
    }
}
           

上面輸出 :

Value of Num: 35
Value of Num: 175
           

委托的多點傳播(Multicasting of a Delegate)

委托對象可使用 "+" 運算符進行合并。一個合并委托調用它所合并的兩個委托。隻有相同類型的委托可被合并。"-" 運算符可用于從合并的委托中移除元件委托。

使用委托的這個有用的特點,可以建立一個委托被調用時要調用的方法的調用清單。這被稱為委托的 多點傳播(multicasting),也叫多點傳播。

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

delegate int NumberChanger(int n);
namespace DelegateDemo
{
    class Program
    {
        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;
            NumberChanger nc1 = new NumberChanger(AddNum);
            NumberChanger nc2 = new NumberChanger(MultNum);
            nc = nc1;
            nc += nc2;
            // 調用多點傳播
            nc(5);
            Console.WriteLine("Value of Num: {0}", getNum());
            Console.ReadKey();
        }
    }
}
           

上面輸出:

Value of Num: 75
           

委托(Delegate)的用途 

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

delegate int NumberChanger(int n);
namespace DelegateDemo
{
    class Program
    {
        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 void getNum(NumberChanger nc,int a)
        {
            Console.WriteLine("Value of Num: {0}", nc(a));
        }
        static void Main(string[] args)
        {
            getNum(AddNum,5);
            getNum(MultNum, 5);
            Console.ReadKey();
        }
    }
}
           

上面輸出:

Value of Num: 15
Value of Num: 75