一.委托和事件的差別在哪?
請各位思考一個問題,委托與事件功能幾乎相同,委托能干的事件也能干,反之亦然,那為啥還要分別弄出兩個來呢?
(如果你是在學校學的暈頭轉向的可憐兄弟,那就繼續往下看吧,別直接跳到三了)
二.委托
說的直白一點,你可以把委托當C++中的函式指標來用,同回傳值型別,同引數串列,
舉個例子:
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 */ } } }View Code
實際上還可以這么寫
Mydel mydel = new Mydel(company.yuanTong);
注釋里說實體化,這new一個咋這么像一個類呀?它不會...
為了解決你心中的疑惑,我們看看反編譯結果

你的猜測很正確,委托就是一個類,
三.事件和委托啥區別?
上例多播委托也可用事件做到,這里將事件發布方法寫到另外一個類里了,讀者可將其也放入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 */ } } }View Code
這樣好像委托和事件沒什么區別,委托能做的事件也能做,事件能做的委托也能做,
還是那個問題,委托與事件功能幾乎相同,委托能干的事件也能干,反之亦然,那為啥還要分別弄出兩個來呢?
我們還是來看看反編譯結果

這個Combine應該不用解釋了吧,結論就是:沒啥區別,它實際上事件是微軟的一個語法糖,你可以把他當作C++里面的函式指標陣列,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/59615.html
標籤:C#
上一篇:C#讀取靜態類常量屬性和值
