C# 委託與事件有啥區別?

一.委託和事件的差異在哪?

請各位思考一個問題,委託與事件功能幾乎相同,委託能幹的事件也能幹,反之亦然。那爲啥還要分別弄出兩個來呢?數組

(若是你是在學校學的暈頭轉向的可憐兄弟,那就繼續往下看吧,別直接跳到三了)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
             */
        }
    }
}
View Code

實際上還能夠這麼寫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
             */
        }
    }
}
View Code

這樣好像委託和事件沒什麼區別,委託能作的事件也能作,事件能作的委託也能作。get

仍是那個問題,委託與事件功能幾乎相同,委託能幹的事件也能幹,反之亦然。那爲啥還要分別弄出兩個來呢?

咱們仍是來看看反編譯結果

 

這個Combine應該不用解釋了吧。結論就是:沒啥區別,它實際上事件是微軟的一個語法糖。你能夠把他看成C++裏面的函數指針數組。

相關文章
相關標籤/搜索