16.8 事件访问器
事件是特殊的多路广播委托,事件默认有一个私有的委托类型变量,用以保存对订阅事件的事件处理方法的引用,此委托类型的变量仅能从声明该事件的类中调用。事件订阅者通过提供对事件处理方法的引用来订阅事件,这些方法通过默认的事件访问器添加到委托的调用列表中。这里的事件访问器类似于属性访问器,不同之处在于,事件访问器被命名为add和remove,而不是属性的get和set。在大多数情况下都不需要提供自定义的事件访问器。如果没有提供,则编译器会自动添加事件访问器。如果需要自定义事件访问器,以支持某些自定义行为,可以使用如下语法,如代码清单16-7所示。
代码清单16-7 事件访问器
public event MyEventHandler PrintComplete
{
add
{
//……
}
remove
{
//……
}
}
在声明了事件访问器以后,编译器将不会提供私有的委托对象,此时对于订阅者事件处理方法引用的管理需要我们自己去实现,接下来,我们使用一个例子进行阐述。
首先,定义一个委托类型的变量:
public delegate void MyEventHandler(Object sender,EventArgs e);
接下来,声明一个此委托类型的私有变量:
private MyEventHandler myEventHandler;
然后,在事件访问器中对之前声明的变量进行操作,注意,和属性一样,事件访问器也有一个叫做value的隐式值参数,见代码清单16-8。
代码清单16-8 事件访问器示例
public event MyEventHandler PrintComplete
{
add
{
myEventHandler+=value;
}
remove
{
myEventHandler-=value;
}
}