C#事件记录
看了這么久,對(duì)于C#的事件機(jī)制還是一頭霧水。
最讓我迷惑不解的是事件的處理方法是在什么時(shí)候執(zhí)行的。
看到的文檔都是說是在事件發(fā)生的時(shí)候被調(diào)用。結(jié)合看到的例程,
如果是定時(shí)的事件,我還可以理解,但是如果沒有那么明顯的事件的標(biāo)志,
對(duì)于事件對(duì)于我就變成一只黑匣子了。
后來看了一篇教程,我感覺我對(duì)事件的理解錯(cuò)了。原來事件并不一定是
外來的例如計(jì)時(shí)或者中斷,在C#中事件只是一種模型,使方法之間可以互相交互和
影響,建立一定的關(guān)聯(lián),從而實(shí)現(xiàn)特定的功能。事實(shí)上,事件在生成的時(shí)候調(diào)用委托的。
事件生成是一個(gè)很廣泛的概念,既可以是時(shí)間,按鍵,也可以是方法的調(diào)用。(也許前者就是
方法的調(diào)用)。
下面是引用自http://www.runoob.com/csharp/csharp-event.html的例程
下面的代碼就是一個(gè)以方法調(diào)用作為事件的例子。
其中的事件就是OnBoilerEventLog()方法的調(diào)用
所以我的拙見是任何觸發(fā)包裝在event中的方法的對(duì)象都是事件
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 }對(duì)于一個(gè)問題的認(rèn)識(shí)總是由淺入深的,今天看到了一篇文章,對(duì)事件又有了更深的理解。貼一下這篇文章
“事件驅(qū)動(dòng)機(jī)制”里的事件和c#中的event不是一回事。就像java和c++里沒有event這個(gè)關(guān)鍵字并且不用delegate。但是它們?cè)谔幚鞧UI程序時(shí)卻都是用事件驅(qū)動(dòng)機(jī)制來完成。
從機(jī)制上講,事件就是你干了什么,你點(diǎn)擊了一個(gè)button,選擇了一個(gè)下拉菜單,點(diǎn)擊關(guān)閉按鈕。那么這個(gè)時(shí)候程序該怎么反應(yīng)呢?這就看你的事件(或者說動(dòng)作)有誰關(guān)心和誰關(guān)聯(lián)。
拿button為例,它有一個(gè)事件叫單擊,當(dāng)單擊發(fā)生時(shí),button會(huì)發(fā)布一個(gè)消息“我被單擊了”;在這之前關(guān)心這個(gè)問題的類會(huì)跟這個(gè)事件注冊(cè)一下,就是說我訂閱你的消息,當(dāng)你事件發(fā)生時(shí),這個(gè)消息要給我知道。而當(dāng)訂閱者知道事情發(fā)生了它就會(huì)采取相應(yīng)的處理也就是調(diào)用自己預(yù)先寫好的事件處理方法。
拿現(xiàn)實(shí)為例,出版社會(huì)發(fā)行報(bào)紙,而一個(gè)事件發(fā)生(比方某煤礦瓦斯爆炸)它會(huì)出現(xiàn)在報(bào)紙上,這就是一個(gè)消息;而如果你想知道發(fā)生了什么,你就要訂閱報(bào)紙,這樣每有消息,都會(huì)把報(bào)紙送到你家的郵箱;不同的人收到報(bào)紙他就會(huì)有不同的反應(yīng)做出不同的處理,比方家人在那個(gè)煤礦的人和投資了那個(gè)煤礦的人就會(huì)做不同反應(yīng)。
在實(shí)現(xiàn)上,c#是用委托做的,事件是一個(gè)特殊的委托,不用事件也能完成,但是可能會(huì)出現(xiàn)問題,就是有人可以繞過你這個(gè)事件發(fā)生而使用委托即事件沒發(fā)生卻可以從后臺(tái)調(diào)用你的事件處理方法,為了限制這個(gè)行為采用關(guān)鍵字event來修飾委托或者說創(chuàng)建了一個(gè)“事件”的概念。
而在java中,是用Listener來做的,你一個(gè)事件源負(fù)責(zé)發(fā)布消息,而關(guān)心它的類會(huì)有一個(gè)Listener并在內(nèi)部編寫事件處理方法,而在事件源中addActionListener就是把外部的一個(gè)關(guān)心者注冊(cè)起來,表示別人關(guān)心你訂閱了你的消息。
鏈接:https://zhidao.baidu.com/question/50339292.html
轉(zhuǎn)載于:https://www.cnblogs.com/MalcolmMeng/p/8442975.html
總結(jié)
- 上一篇: grafana 安装配置
- 下一篇: 第八章.设计原则