C#事件 的讲解
一、事件的本質(zhì)
事件是軟件系統(tǒng)里的兩個(gè)子系統(tǒng)之間,或者兩個(gè)模塊之間,或者兩個(gè)對(duì)象之間發(fā)送消息,并處理消息的過程。在面向?qū)ο蟮氖澜缋?#xff0c;就可以統(tǒng)一認(rèn)為是兩個(gè)對(duì)象之間的行為。
兩個(gè)對(duì)象之間發(fā)送的這種消息,對(duì)發(fā)送方來講是產(chǎn)生一個(gè)事件,對(duì)接受方來講是需要處理某個(gè)事件。這種消息可以是用戶操作產(chǎn)生的或者軟件系統(tǒng)里的某個(gè)對(duì)象產(chǎn)生的。
對(duì)象之間的事件處理從上圖可見,對(duì)象一產(chǎn)生一個(gè)事件,這個(gè)事件發(fā)生以后需要對(duì)象二執(zhí)行某種動(dòng)作。這就是事件機(jī)制。對(duì)象一是事件的產(chǎn)生者,或者發(fā)送者;對(duì)象二是事件的接收者或者訂閱者。對(duì)象一產(chǎn)生某種消息,需要對(duì)象二響應(yīng)并處理這給消息,這就是事件的本質(zhì)。
以往的很多軟件系統(tǒng)都在采用事件機(jī)制處理很多問題。例如從最本質(zhì)的計(jì)算機(jī)體系中的軟中斷處理,到masm中的jump,到c/c++中的回調(diào)函數(shù)等等。只不過越高級(jí)的軟件系統(tǒng)處理事件或者其提供的很多處理方法越接近人的思維,而越遠(yuǎn)離機(jī)器思維。構(gòu)建軟件系統(tǒng)的方法從本質(zhì)上就是從機(jī)器思維走向人的思維的過程。
?
二、事件機(jī)制的好處
1、直接調(diào)用
采用事件機(jī)制有什么好處?事件發(fā)送者為什么不直接調(diào)用事件接受者提供的處理函數(shù)呢?
調(diào)用機(jī)制如果所示,兩個(gè)對(duì)象之間的調(diào)用機(jī)制。對(duì)象B調(diào)用對(duì)象A的方法,可以通過函數(shù)指針或者跳轉(zhuǎn)(匯編語(yǔ)言)等實(shí)現(xiàn)。這種方法造成的結(jié)果是A和B的緊密耦合,即B對(duì)A有很強(qiáng)的依賴性??梢钥闯?/span>B是事件的發(fā)布者,A是事件的響應(yīng)和處理者。不過這種機(jī)制用事件機(jī)制解釋從理論上就比較牽強(qiáng)了。同一種事物,其實(shí)現(xiàn)的思想不一樣。
現(xiàn)在假設(shè)有個(gè)對(duì)象C也要響應(yīng)B的事件。那么,按照上面的這種機(jī)制,需求修改對(duì)象B的代碼,調(diào)用對(duì)象C的方法。這樣機(jī)制造成了非常強(qiáng)的依賴關(guān)系。代碼的修改和擴(kuò)展非常麻煩。如果對(duì)象越多,這種關(guān)系越多,整個(gè)系統(tǒng)越復(fù)雜。如果一個(gè)系統(tǒng)里面對(duì)象很多,這種依賴關(guān)系也很多的情況下,這種調(diào)用關(guān)系就會(huì)十分復(fù)雜,對(duì)系統(tǒng)的健壯性和優(yōu)良性會(huì)造成影響。
2、回調(diào)機(jī)制
如果按照c#的委托思想,B需要事先提供對(duì)事件處理函數(shù)的某些回調(diào)指針。這樣,其它對(duì)象,例如A和C就去修改它的回調(diào)指針,把自己的方法聯(lián)系到上面。但是它們之間的耦合關(guān)系就比上面簡(jiǎn)單了。回調(diào)機(jī)制
回調(diào)機(jī)制的思想已經(jīng)比較接近委托的概念。其實(shí)委托在本質(zhì)上也就和回調(diào)指針差不多,只是概念上更加高級(jí)。對(duì)象B作為事件的發(fā)布者,事先定義一些回調(diào)函數(shù)指針,然后在本地合適的地方調(diào)用這些指針指向的函數(shù)。而事件訂閱者或者處理者A和C所作的就是讓給這些空指針賦值,把自己的事件處理方法賦給它,從而實(shí)現(xiàn)B調(diào)用A和C的方法。
在C?或C++?中與委托最為相似的是函數(shù)指針。然而,函數(shù)指針只能引用靜態(tài)函數(shù),而委托可以引用靜態(tài)方法和實(shí)例方法。當(dāng)委托引用實(shí)例方法時(shí),委托不僅存儲(chǔ)對(duì)方法入口點(diǎn)的引用,還存儲(chǔ)對(duì)為其調(diào)用該方法的類實(shí)例的引用。與函數(shù)指針不同,委托是面向?qū)ο?、類型安全并且安全的?/span>
?
轉(zhuǎn)載于:https://www.cnblogs.com/jilodream/archive/2012/11/01/4222776.html
總結(jié)
- 上一篇: vba基本操作 -- 常用功能
- 下一篇: C#获取Windows下光标位置(转)