一、事件的感性认识:
现实生活中的“事件”无所不在,时刻都在发生,软件层面上的常见事件无非是鼠标事件、键盘事件、操作系统自己发出的事件。
事件的发送方称作为发布者(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<CustomEventArgs> RaiseCustomEvent;
15: //自定义事件访问器,可选
16: event MyEventHandler OnMyEvent;
17: }
18:
19: /// <summary>
20: /// 自定义EventArgs类,用来保存事件信息
21: /// </summary>
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: /// <summary>
40: /// 发布者
41: /// </summary>
42: class Publisher : IPublisher
43: {
44: object objectLock = new Object();
45: //使用EventHandler<T> 声明事件
46: public event EventHandler<CustomEventArgs> RaiseCustomEvent;
47: private event MyEventHandler _myEventHandler;
48:
49: /// <summary>
50: /// 在大多数情况下都不需要提供自定义的事件访问器。
51: /// 如果您在代码中没有提供自定义的事件访问器,编译器会自动添加事件访问器。
52: /// </summary>
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: /// <summary>
88: /// 公开protected virtual方法,允许继承类重写事件调用行为
89: /// </summary>
90: /// <param name="e"></param>
91: protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
92: {
93: EventHandler<CustomEventArgs> 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: /// <summary>
109: /// 订阅者
110: /// </summary>
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: /// <summary>
128: /// 当订阅者接收到事件,该做什么反应
129: /// 也就是常说的事件处理逻辑
130: /// </summary>
131: /// <param name="sender"></param>
132: /// <param name="e"></param>
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: }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。