规范的.net 事件原理
<接著上一篇事件委托講解>
.net framework 事件設計準則
1 聲明delegate時,使用void 類型當作返回值,EventName事件的事件委托是
EventNameEventHandler,事件接受兩個傳入參數,一律命名為sender和e。
2 定義一個提供事件數據的類。對類以EventNameEventArgs進行命名,從system.EventArgs派生該
類,然后添加所有事件特定的成員
public delegate void EventNameEventHandler(object sender,EventNameEventArgs e);
EventNameEventArgs用于封裝事件的多個參數,這個類可以自己寫但必須繼承EventArgs
class EventNameEventArgs:EventArgs
{
?...
}
3 在引發事件的類中提供一個手保護的方法,以OnEventName進行命名。在該方法中引發事件
protected virtual void OnEventName(EventArgs e)
{
?if(EventName!=null)
?{
??EventName(this,e);
?}
}
?
?1using?System;?2using?System.Collections.Generic;
?3
?4namespace?event3
?5{
?6????class?PubEventArgs:EventArgs//提供事件所需要的數據
?7????{
?8????????private?readonly?string?m_magazineName;
?9????????private?readonly?DateTime?m_pubDate;
10????????public?PubEventArgs(string?magazineName,DateTime?pubDate)
11????????{
12????????????this.m_magazineName=magazineName;
13????????????this.m_pubDate=pubDate;
14????????}
15????????public??string?magazineName
16????????{
17????????????get{return?m_magazineName;}
18????????}
19????????public?DateTime?pubDate
20????????{
21????????????get{return?m_pubDate;}
22????????}
23????}
24????
25????class?Publisher?//出版社
26????{
27????????public?delegate?void?PubComputerEventHandler(object?sender,PubEventArgs?e);?//事件所需的代理?委托是種類
28????????public?delegate?void?PubLifeEventHandler(object?sender,PubEventArgs?e);
29????????public?event?PubComputerEventHandler?PubComputer=null;//事件的聲明
30????????public?event?PubLifeEventHandler?PubLife=null;
31????????
32????????protected?virtual?void?OnPubComputer(PubEventArgs?e)
33????????{
34????????????PubComputerEventHandler?handler=PubComputer;?//臨時委托變量
35????????????if(handler!=null)
36????????????{
37????????????????handler(this,e);
38????????????}
39????????}
40????????
41????????protected?virtual?void?OnPubLife(PubEventArgs?e)
42????????{
43????????????PubLifeEventHandler?handler=PubLife;?//臨時委托變量
44????????????if(handler!=null)
45????????????{
46????????????????handler(this,e);
47????????????}
48????????}
49????????
50????????public?void?issuComputer(string?magazineName,DateTime?pubDate)?//觸發訂閱電腦雜志事件的方法
51????????{
52????????????Console.WriteLine("發行"+magazineName);
53????????????OnPubComputer(new?PubEventArgs(magazineName,pubDate));
54????????????Console.ReadLine();
55????????}
56????????
57????????public?void?issuLife(string?magazineName,DateTime?pubDate)?
58????????{
59????????????Console.WriteLine("發行"+magazineName);
60????????????OnPubLife(new?PubEventArgs(magazineName,pubDate));
61????????????Console.ReadLine();
62????????}
63????}
64????
65????class?Subscriber?//訂閱者
66????{
67????????private?string?name;
68????????public?Subscriber(string?name)
69????????{
70????????????this.name=name;
71????????}
72????????public?void?Receive(object?sender,PubEventArgs?e)//在事件訂閱者中定義事件處理程序
73????????{
74????????????Console.WriteLine(e.pubDate+"?"+name+"已經收到了"+e.magazineName);
75????????}
76????}
77????
78????class?Story?//故事發生在訂閱者和出版社之間
79????{
80????????static?void?Main()
81????????{
82????????????Publisher?Pub=new?Publisher();
83????????????Subscriber?zs=new?Subscriber("張三");
84????????????Pub.PubLife+=new?Publisher.PubLifeEventHandler(zs.Receive);//張三訂閱生活雜志
85????????????Subscriber?ls=new?Subscriber("李四");//李四也訂閱了電腦、生活雜志
86????????????Pub.PubComputer+=new?Publisher.PubComputerEventHandler(ls.Receive);
87????????????Pub.PubLife+=new?Publisher.PubLifeEventHandler(ls.Receive);
88????????????Pub.issuComputer("《電腦》雜志",Convert.ToDateTime("2008-11-28"));?//收到事件后做出的處理
89????????????Pub.issuLife("《生活》雜志",Convert.ToDateTime("2008-11-28"));
90????????????//一年后李四由于經濟危機取消了《生活》雜志的訂閱
91????????????Console.WriteLine("一年后李四由于經濟危機取消了《生活》雜志的訂閱");
92????????????Pub.PubLife-=new?Publisher.PubLifeEventHandler(ls.Receive);
93????????????Pub.issuComputer("《電腦》雜志",Convert.ToDateTime("2009-11-28"));?
94????????????Pub.issuLife("《生活》雜志",Convert.ToDateTime("2009-11-28"));
95????????}
96????}
97}
轉載于:https://www.cnblogs.com/hemood/archive/2008/11/27/1342639.html
總結
以上是生活随笔為你收集整理的规范的.net 事件原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决windows7您当前无权访问该文件
- 下一篇: 63. Unique Paths II