溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

詳解C#事件機(jī)制

發(fā)布時間:2020-07-12 10:24:19 來源:網(wǎng)絡(luò) 閱讀:992 作者:riran 欄目:編程語言

        C#中的委托事件機(jī)制是這種語言的一大亮點(diǎn),以一種更加安全和高效的方式可以實(shí)現(xiàn)類似C語言中的函數(shù)指針,Qt中的信號槽機(jī)制和委托事件機(jī)制在實(shí)際運(yùn)用中頗為相似,但是,C#使用上更加方便。下面,我先貼個圖來展示一個事件機(jī)制的原理:

詳解C#事件機(jī)制

        上述Publisher類的作用就是定義委托、定義事件以及定義觸發(fā)事件的方法;

        Subscriber類的作用注冊事件,并且定義具體的事件處理方法。(好像Subscriber類不需要注冊事件,注冊事件是在運(yùn)行的模塊進(jìn)行)

        這種思想本人以為就是:還沒想好怎么做就先搭個框架(寫個函數(shù)聲明),以后那些客戶誰想具體怎么做,以后他自己想辦法去,我們只把函數(shù)簽名聲明好就夠了,免得客戶對我們細(xì)致的定義不滿意。


        【上圖我感覺解釋事件還是有點(diǎn)兒不好理解,我認(rèn)為理解事件其實(shí)就是通過注冊事件將事件和事件處理函數(shù)聯(lián)系起來,當(dāng)事件發(fā)生時,我們將我們需要的事件處理函數(shù)注冊到該事件中,使得我們滿意的處理過程發(fā)生?!?br />

舉個例子(例子是借鑒別人的博文 《C# 事件機(jī)制》)

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace Delegate_And_Event
{
    public delegate void SalaryComputeEventHander(object sender, MyEventArgs e);
    public class Employee
    {
        public event SalaryComputeEventHander SalaryCompute;
        public virtual void OnSalaryCompute(MyEventArgs e) //觸發(fā)事件的函數(shù)
        {
            if(SalaryCompute != null)
            {
                SalaryCompute(this,e);
            }
        }
    }
    public class MyEventArgs : EventArgs
    {
        public readonly double _salary;
        public MyEventArgs(double salary)
        {
            this._salary = salary;
        }
    }
    public class HumanResource
    {
        //具體的事件處理函數(shù)
        public void SalaryHandler(object sender, MyEventArgs e)
        {
            Console.Write("Salary is {0}",e._salary);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Employee ep = new Employee ();
            HumanResource hr = new HumanResource ();
            MyEventArgs e = new MyEventArgs (20000.5);
            ep.SalaryCompute += new SalaryComputeEventHander(hr.SalaryHandler);   //將具 體事件處理函數(shù)注冊到事件中
            while (true)
            {
                Thread.Sleep(1000);
                ep.OnSalaryCompute(e);                   
            }

        }        
    }
}


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI