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); } } } }