《Illustrated C# 2012, 4th Edition》Daniel M. Solis 第14章 事件 笔记

事件是为发布者/订阅者模式(publisher/subscriber pattern)设计的。

不包含事件访问器的事件与自动实现属性类似,封装了一个委托,外部无法直接访问这个委托。执行事件,就是执行它封装的委托。
包含事件访问器的事件与属性类似,add访问器对应+=运算符,remove访问器对应-=运算符。两个访问器都包含一个名为value的隐式值参数,对应+=和-=运算符的右操作数,都不能包含return语句。

事件使用event关键字声明。
事件只能作为类或结构的成员,不能作为本地变量。
不包含事件访问器的事件,如果声明时不显式初始化,则隐式初始化为null,即委托的调用列表为空。

事件不能转换为对应的委托,因此不能出现在赋值运算符的右边。
事件在所属的类或结构外部,只支持作为+=和-=运算符的左操作数。
不包含事件访问器的事件,在所属的类或结构内部,还支持作为=运算符的左操作数。

BCL在System命名空间中声明了EventHandler委托类型,使用这个委托类型声明的事件,称为标准事件。

public delegate void EventHandler(object send, EventArgs e);
  • sender用于保存触发事件的引用。
  • e用于传递参数,但EventArgs本身并不能传递参数,因此需要自定义EventArgs的派生类用于传递参数。
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
  • 当需要传递参数时,通常使用EventHandler的泛型版本,TEventArgs通常是EventArgs的派生类。