C#语言知识点整理-事件-创新互联

一、事件的感性认识:

成都网络公司-成都网站建设公司成都创新互联十年经验成就非凡,专业从事成都网站建设、成都网站设计,成都网页设计,成都网页制作,软文营销广告投放等。十年来已成功提供全面的成都网站建设方案,打造行业特色的成都网站建设案例,建站热线:028-86922220,我们期待您的来电!

   现实生活中的“事件”无所不在,时刻都在发生,软件层面上的常见事件无非是鼠标事件、键盘事件、操作系统自己发出的事件。

   事件的发送方称作为发布者(sender),接收事件的一方称作订阅者(receiver),一个事件可以有多个订阅者。 一个订阅者可处理来自多个发布者的多个事件。典型的多对多关系。

   发布者和订阅者互相都不了解,只是通过Delegate委托来在之间交互,委托在这里起到了“媒人”作用。同时.net的事件机制很容易实现设计模式的观察者模式。

二、事件的不严格定义:

   1) 事件是特殊类型的多路广播委托

   2) 向其他类或对象提供通知的一种方式。

三、例子:

   MSDN上有几个例子,我综合了下,作为编写事件的模板吧

1: 
2: using System;
3: using System.Collections.Generic;
4: using System.Linq;
5: using System.Text;
6: 
7: namespace CSharp.Event
8: {
9:     public delegate void MyEventHandler(string s);
10: 
11:     public interface IPublisher
12:     {
13:         // 接口可声明事件。
14:         event EventHandler RaiseCustomEvent;
15:         //自定义事件访问器,可选
16:         event MyEventHandler OnMyEvent;
17:     }
18: 
19:     /// 
20:     /// 自定义EventArgs类,用来保存事件信息
21:     /// 
22:     public class CustomEventArgs : EventArgs
23:     {
24:         private string message;
25: 
26:         public string Message
27:         {
28:             get { return message; }
29:             set { message = value; }
30:         }
31: 
32:         public CustomEventArgs(string s)
33:         {
34:             message = s;
35:         }
36: 
37:     }
38: 
39:     /// 
40:     /// 发布者
41:     /// 
42:     class Publisher : IPublisher
43:     {
44:         object objectLock = new Object();
45:         //使用EventHandler 声明事件
46:         public event EventHandler RaiseCustomEvent;
47:         private event MyEventHandler _myEventHandler;
48: 
49:         /// 
50:         ///  在大多数情况下都不需要提供自定义的事件访问器。
51:         ///  如果您在代码中没有提供自定义的事件访问器,编译器会自动添加事件访问器。
52:         /// 
53:         public event MyEventHandler OnMyEvent
54:         {
55:             add
56:             {
57:                 lock (objectLock)
58:                 {
59:                     _myEventHandler += value;
60:                 }
61:             }
62:             remove
63:             {
64:                 lock (objectLock)
65:                 {
66:                     _myEventHandler -= value;
67:                 }
68:             }
69:         }
70: 
71:         public void DoSomething()
72:         {
73:             //省略。。。
74: 
75:             //自己引发事件
76:             OnRaiseCustomEvent(new CustomEventArgs("Did something"));
77:             //省略。。。
78: 
79:             if (_myEventHandler != null)
80:             {
81: 
82:                 _myEventHandler("你轻轻的走,不带走一片云彩!");
83:             }
84: 
85:         }
86: 
87:         /// 
88:         /// 公开protected virtual方法,允许继承类重写事件调用行为
89:         /// 
90:         /// 
91:         protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
92:         {
93:             EventHandler handler = RaiseCustomEvent;
94: 
95:             //如果没有订阅者,事件为空
96:             if (handler != null)
97:             {
98:                 e.Message += String.Format(" at {0}", DateTime.Now.ToString());
99: 
100:                 //触发事件
101:                 handler(this, e);
102:             }
103:         }
104: 
105:
106:     }
107: 
108:     /// 
109:     /// 订阅者
110:     /// 
111:     class Subscriber
112:     {
113:         private string id;
114:         public Subscriber(string ID, Publisher pub)
115:         {
116:             id = ID;
117:             //多路广播委托实现事件订阅
118:             pub.RaiseCustomEvent += HandleCustomEvent;
119:             pub.OnMyEvent += new MyEventHandler(pub_OnMyEvent);
120:         }
121: 
122:         void pub_OnMyEvent(string s)
123:         {
124:             Console.WriteLine(string.Format("{0} 的开场白:{1}", id, s));
125:         }
126: 
127:         /// 
128:         /// 当订阅者接收到事件,该做什么反应
129:         /// 也就是常说的事件处理逻辑
130:         /// 
131:         /// 
132:         /// 
133:         void HandleCustomEvent(object sender, CustomEventArgs e)
134:         {
135:             Console.WriteLine(id + " received this message: {0}", e.Message);
136:         }
137:     }
138: 
139:     class Program
140:     {
141:         static void Main(string[] args)
142:         {
143:             //实例一个发布者
144:             Publisher pub = new Publisher();
145:             //实例两个订阅者sub1,sub2,他们计划收听pub
146:             Subscriber sub1 = new Subscriber("sub1", pub);
147:             Subscriber sub2 = new Subscriber("sub2", pub);
148: 
149:             //发布者通过DoSomething触发事件,开始发布信息
150:             pub.DoSomething();
151: 
152:             Console.WriteLine("Press Enter to close this window.");
153:             Console.ReadLine();
154:         }
155:     }
156: }

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


当前题目:C#语言知识点整理-事件-创新互联
标题来源:http://scyanting.com/article/idise.html