大白话系列之C#委托与事件讲解(二)
什么是事件?EVENT?點(diǎn)擊事件?加載事件?一連串的模糊的概念沖擊著我們?nèi)跣〉哪X袋
那我們首先來(lái)看一下比較正統(tǒng)的感念吧:
事件是類(lèi)在發(fā)生其關(guān)注的事情時(shí)用來(lái)提供通知的一種方式。
事件的發(fā)生一般都牽扯2個(gè)角色
事件發(fā)行者(Publisher):一個(gè)事件的發(fā)行者,也稱作是發(fā)送者(sender),其實(shí)就是個(gè)對(duì)象,這個(gè)對(duì)象會(huì)自行維護(hù)本身的狀態(tài)信息,當(dāng)本身狀態(tài)信息變動(dòng)時(shí),便觸發(fā)一個(gè)事件,并通知說(shuō)有的事件訂閱者。
事件訂閱者(Subscriber):對(duì)事件感興趣的對(duì)象,也稱為Receiver,可以注冊(cè)感興趣的事件,在事件發(fā)行者觸發(fā)一個(gè)事件后,會(huì)自動(dòng)執(zhí)行這段代碼。
為了更好的讓大家理解上面的概念,我先什么都不講,我們先來(lái)看一段簡(jiǎn)單的代碼:
代碼
????//發(fā)布者(Publiser)
????public?class?Publisher
????{
????????//聲明一個(gè)出版的委托
????????public?delegate?void?PublishEventHander();
????????//在委托的機(jī)制下我們建立以個(gè)出版事件
????????public?event?PublishEventHander?OnPublish;
????????//事件必須要在方法里去觸發(fā),出版社發(fā)布新書(shū)方法
????????public?void?issue()
????????{
????????????//如果有人注冊(cè)了這個(gè)事件,也就是這個(gè)事件不是空
????????????if?(OnPublish?!=?null)
????????????{
????????????????Console.WriteLine("最新一期的《火影忍者》今天出版哦!");
????????????????OnPublish();
????????????}
????????}
????}
????//Subscriber?訂閱者,無(wú)賴小明
????public?class?MrMing
????{
????????//對(duì)事件感興趣的事情,這里指對(duì)出版社的書(shū)感興趣
????????public?static?void?Receive()
????????{
????????????Console.WriteLine("嘎嘎,我已經(jīng)收到最新一期的《火影忍者》啦!!");???????
????????}
????}
????
????//Subscriber?訂閱者,悲情人物小張
????public?class?MrZhang
????{
????????//對(duì)事件感興趣的事情
????????public?static?void?Receive()
????????{
????????????Console.WriteLine("幼稚,這么大了,還看《火影忍者》,SB小明!");
????????}
????}
????class?Story
????{
????????public?static?void?Main(string[]?args)
????????{
????????????//實(shí)例化一個(gè)出版社
????????????Publisher?publisher?=?new?Publisher();
????????????//給這個(gè)出火影忍者的事件注冊(cè)感興趣的訂閱者,此例中是小明
????????????publisher.OnPublish?+=?new?Publisher.PublishEventHander(MrMing.Receive);
????????????//另一種事件注冊(cè)方式
????????????//publisher.OnPublish?+=?MrMing.Receive;
????????????//發(fā)布者在這里觸發(fā)出版火影忍者的事件
????????????publisher.issue();
????????????Console.ReadKey();
????????}
????}
?
編譯結(jié)果如下
?
?
如果童靴們,從上到下仔細(xì)看一邊的話,我想應(yīng)該知道什么是發(fā)布者,什么是訂閱者了吧,那至于事件呢
我們先看這句
publisher.OnPublish?+=?new?Publisher.PublishEventHander(MrMing.Receive);
這就是小明向出版社訂閱他喜歡看的火影忍者,小張沒(méi)有訂閱所以小張沒(méi)有收到書(shū),
?
我們?cè)僮屑?xì)看看這個(gè)賦值語(yǔ)句,是不是似曾相識(shí)過(guò)呢?是的就是我們?cè)谏弦恢v,在講委托聲明的時(shí)候,簡(jiǎn)直就是一個(gè)眸子里刻出來(lái)的嘛
委托賦值:
BugTicketEventHandler?myDelegate?=?new?BugTicketEventHandler(MrZhang.BuyTicket);
所以,大家不要對(duì)事件有什么好怕的,其實(shí)事件的本質(zhì)就是一個(gè)委托鏈,
我們看一下事件的聲明:
??????? //聲明一個(gè)出版的委托
????????public?delegate?void?PublishEventHander();
????????//在委托的機(jī)制下我們建立以個(gè)出版事件
????????public?event?PublishEventHander?OnPublish;
在我們使用事件的時(shí)候,必須要聲明對(duì)應(yīng)的委托,而觸發(fā)事件,其實(shí)就是在使用委托鏈。
好了大家先消化消化這講的內(nèi)容,我們?cè)谙乱恢v里,我們會(huì)講到我們期盼已久的Sender,e兩個(gè)神秘的參數(shù)了
?
from:?https://www.cnblogs.com/wudiwushen/archive/2010/04/20/1703763.html
總結(jié)
以上是生活随笔為你收集整理的大白话系列之C#委托与事件讲解(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linq 多表连接查询join
- 下一篇: 大白话系列之C#委托与事件讲解(三)