规范的.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}
posted @ 2008-11-27 21:13  Aquarius' Web Tech  阅读(413)  评论(1编辑  收藏  举报