48. C# -- 事件
C# 事件(Event)
理論:
事件(Event) 基本上說是一個(gè)用戶操作,如按鍵、點(diǎn)擊、鼠標(biāo)移動(dòng)等等,或者是一些出現(xiàn),如系統(tǒng)生成的通知。
應(yīng)用程序需要在事件發(fā)生時(shí)響應(yīng)事件。例如,中斷。
事件是用于進(jìn)程間通信。
通過事件使用委托 事件在類中聲明且生成,且通過使用同一個(gè)類或其他類中的委托與事件處理程序關(guān)聯(lián)。
包含事件的類用于發(fā)布事件。這被稱為 發(fā)布器(publisher) 類。
其他接受該事件的類被稱為 訂閱器(subscriber) 類。
通過事件使用委托
事件在類中聲明且生成,且通過使用同一個(gè)類或其他類中的委托與事件處理程序關(guān)聯(lián)。包含事件的類用于發(fā)布事件。這被稱為 發(fā)布器(publisher) 類。其他接受該事件的類被稱為 訂閱器(subscriber) 類。事件使用 發(fā)布-訂閱(publisher-subscriber) 模型。
發(fā)布器(publisher) 是一個(gè)包含事件和委托定義的對(duì)象。事件和委托之間的聯(lián)系也定義在這個(gè)對(duì)象中。發(fā)布器(publisher)類的對(duì)象調(diào)用這個(gè)事件,并通知其他的對(duì)象。
訂閱器(subscriber) 是一個(gè)接受事件并提供事件處理程序的對(duì)象。在發(fā)布器(publisher)類中的委托調(diào)用訂閱器(subscriber)類中的方法(事件處理程序)。
聲明事件(Event)
在類的內(nèi)部聲明事件,首先必須聲明該事件的委托類型。例如:
public delegate void BoilerLogHandler(string status);
然后,聲明事件本身,使用 event 關(guān)鍵字:
// 基于上面的委托定義事件
public event BoilerLogHandler BoilerEventLog;
上面的代碼定義了一個(gè)名為 BoilerLogHandler 的委托和一個(gè)名為 BoilerEventLog 的事件,該事件在生成的時(shí)候會(huì)調(diào)用委托。
實(shí)例 1
using?System; namespace?SimpleEvent {using?System;public?class?EventTest {//初始化value=0;private?int?value;public?delegate?void?NumManipulationHandler();//初始化ChangeNum=null;public?event?NumManipulationHandler?ChangeNum;protected?virtual?void?OnNumChanged() {if?(ChangeNum?!=?null) {ChangeNum(); }else {Console.WriteLine("Event?fired!"); } }//初始化構(gòu)造函數(shù)public?EventTest(int?n) {SetValue(n); }public?void?SetValue(int?n) {if?(value?!=?n) {value?=?n;OnNumChanged(); } } }public?class?MainClass {public?static?void?Main() {EventTest?e?=?new?EventTest(5);e.SetValue(7);e.SetValue(11);Console.ReadKey(); } } }當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
Event Fired!
Event Fired!
Event Fired!
實(shí)例 2
本實(shí)例提供一個(gè)簡(jiǎn)單的用于熱水鍋爐系統(tǒng)故障排除的應(yīng)用程序。當(dāng)維修工程師檢查鍋爐時(shí),鍋爐的溫度和壓力會(huì)隨著維修工程師的備注自動(dòng)記錄到日志文件中。
using?System; using?System.IO; namespace?BoilerEventAppl{//?boiler?類class?Boiler{private?int?temp;private?int?pressure;public?Boiler(int?t,?int?p){temp?=?t;pressure?=?p;}public?int?getTemp(){return?temp;}public?int?getPressure(){return?pressure;}}//?事件發(fā)布器class?DelegateBoilerEvent{public?delegate?void?BoilerLogHandler(string?status);//?基于上面的委托定義事件public?event?BoilerLogHandler?BoilerEventLog;public?void?LogProcess(){string?remarks?=?"O.?K";Boiler?b?=?new?Boiler(100,?12);int?t?=?b.getTemp();int?p?=?b.getPressure();if(t?>?150?||?t?<?80?||?p?<?12?||?p?>?15){remarks?=?"Need?Maintenance";}OnBoilerEventLog("Logging?Info:\n");OnBoilerEventLog("Temparature?"?+?t?+?"\nPressure:?"?+?p);OnBoilerEventLog("\nMessage:?"?+?remarks);}protected?void?OnBoilerEventLog(string?message){if?(BoilerEventLog?!=?null){BoilerEventLog(message);}}}//?該類保留寫入日志文件的條款class?BoilerInfoLogger{FileStream?fs;StreamWriter?sw;public?BoilerInfoLogger(string?filename){fs?=?new?FileStream(filename,?FileMode.Append,?FileAccess.Write);sw?=?new?StreamWriter(fs);}public?void?Logger(string?info){sw.WriteLine(info);}public?void?Close(){sw.Close();fs.Close();}}//?事件訂閱器public?class?RecordBoilerInfo{static?void?Logger(string?info){Console.WriteLine(info);}//end?of?Loggerstatic?void?Main(string[]?args){BoilerInfoLogger?filelog?=?new?BoilerInfoLogger("e:\\boiler.txt");DelegateBoilerEvent?boilerEvent?=?new?DelegateBoilerEvent();boilerEvent.BoilerEventLog?+=?new?DelegateBoilerEvent.BoilerLogHandler(Logger);boilerEvent.BoilerEventLog?+=?new?DelegateBoilerEvent.BoilerLogHandler(filelog.Logger);boilerEvent.LogProcess();Console.ReadLine();filelog.Close();}//end?of?main}//end?of?RecordBoilerInfo}當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
Logging info:T
emperature 100
Pressure 12
Message: O. K
參考:
http://outofmemory.cn/csharp/tutorial/csharp-event.html?
轉(zhuǎn)載于:https://blog.51cto.com/57388/1656271
總結(jié)
以上是生活随笔為你收集整理的48. C# -- 事件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓程序如何保证低内存下依然存在
- 下一篇: CRC生成多项式应该怎样定