您好,登錄后才能下訂單哦!
C#中的委托事件機制是這種語言的一大亮點,以一種更加安全和高效的方式可以實現類似C語言中的函數指針,Qt中的信號槽機制和委托事件機制在實際運用中頗為相似,但是,C#使用上更加方便。下面,我先貼個圖來展示一個事件機制的原理:
上述Publisher類的作用就是定義委托、定義事件以及定義觸發事件的方法;
Subscriber類的作用注冊事件,并且定義具體的事件處理方法。(好像Subscriber類不需要注冊事件,注冊事件是在運行的模塊進行)
這種思想本人以為就是:還沒想好怎么做就先搭個框架(寫個函數聲明),以后那些客戶誰想具體怎么做,以后他自己想辦法去,我們只把函數簽名聲明好就夠了,免得客戶對我們細致的定義不滿意。
【上圖我感覺解釋事件還是有點兒不好理解,我認為理解事件其實就是通過注冊事件將事件和事件處理函數聯系起來,當事件發生時,我們將我們需要的事件處理函數注冊到該事件中,使得我們滿意的處理過程發生。】
舉個例子(例子是借鑒別人的博文 《C# 事件機制》)
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) //觸發事件的函數 { if(SalaryCompute != null) { SalaryCompute(this,e); } } } public class MyEventArgs : EventArgs { public readonly double _salary; public MyEventArgs(double salary) { this._salary = salary; } } public class HumanResource { //具體的事件處理函數 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); //將具 體事件處理函數注冊到事件中 while (true) { Thread.Sleep(1000); ep.OnSalaryCompute(e); } } } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。