一、事件的感性认识:

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

事件的发送方称作为发布者(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: }附件:http://down.51cto.com/data/2362519