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;

}

}