請各位思考一個問題,委託與事件功能幾乎相同,委託能幹的事件也能幹,反之亦然。那爲啥還要分別弄出兩個來呢?數組
(若是你是在學校學的暈頭轉向的可憐兄弟,那就繼續往下看吧,別直接跳到三了)ide
說的直白一點,你能夠把委託當C++中的函數指針來用。同返回值類型,同參數列表。函數
舉個例子:
this
using System; namespace ConsoleApp1 { public delegate int Mydel(int w,int d);//聲明委託 class Company { public int yuanTong(int Weight, int Distance) { //僞裝通過繁雜計算 int res = 10; Console.WriteLine($"圓通費用:{res}"); return res; } public int shenTong(int Weight, int Distance) { //僞裝通過繁雜計算 int res = 8; Console.WriteLine($"申通費用:{res}"); return res; } public int shunFeng(int Weight, int Distance) { //僞裝通過繁雜計算 int res = 15; Console.WriteLine($"順豐費用:{res}"); return res; } } class Program { static void Main(string[] args) { Company company = new Company(); //實例化委託 Mydel mydel; mydel = company.yuanTong; int res=mydel(10, 12); mydel = company.shenTong; res = mydel(10, 12); //多播委託 mydel += company.shunFeng; Console.WriteLine(); res = mydel(10, 12); /* 結果是: 圓通費用:10 申通費用:8 申通費用:8 順豐費用:15 */ } } }
實際上還能夠這麼寫spa
Mydel mydel = new Mydel(company.yuanTong);
註釋裏說實例化,這new一個咋這麼像一個類呀?它不會...指針
爲了解決你心中的疑惑,咱們看看反編譯結果code
你的猜想很正確,委託就是一個類。blog
上例多播委託也可用事件作到,這裏將事件發佈方法寫到另一個類裏了,讀者可將其也放入Company類,效果是同樣的。
事件
using System; namespace ConsoleApp1 { public delegate int Mydel(int w,int d);//聲明委託 //貨物類 發生事件 發佈者 class Cargo { public int Weight { get; set; } public int Distance { get; set; } //聲明一個事件 public event Mydel Cal; public void Send() { if(Cal!=null) { //觸發事件 Cal(this.Weight, this.Distance); } } } //公司類 處理事件 訂閱者 class Company { //定義事件處理程序 public int yuanTong(int Weight, int Distance) { //僞裝通過繁雜計算 int res = 10; Console.WriteLine($"圓通費用:{res}"); return res; } public int shenTong(int Weight, int Distance) { //僞裝通過繁雜計算 int res = 8; Console.WriteLine($"申通費用:{res}"); return res; } public int shunFeng(int Weight, int Distance) { //僞裝通過繁雜計算 int res = 15; Console.WriteLine($"順豐費用:{res}"); return res; } } class Program { static void Main(string[] args) { Company company = new Company(); Cargo cargo = new Cargo(); //訂閱事件 cargo.Cal += company.yuanTong; cargo.Cal += company.shenTong; cargo.Cal += company.shunFeng; cargo.Send(); /* 結果是: 圓通費用:10 申通費用:8 順豐費用:15 */ } } }
這樣好像委託和事件沒什麼區別,委託能作的事件也能作,事件能作的委託也能作。get
仍是那個問題,委託與事件功能幾乎相同,委託能幹的事件也能幹,反之亦然。那爲啥還要分別弄出兩個來呢?
咱們仍是來看看反編譯結果
這個Combine應該不用解釋了吧。結論就是:沒啥區別,它實際上事件是微軟的一個語法糖。你能夠把他看成C++裏面的函數指針數組。