深入解析C#编程中的事件
一个事件是一个使对象或类可以提供公告的成员。用户可以通过提供事件句柄来为事件添加可执行代码。事件使用事件声明来声明:
一个事件声明既可以是一个事件域声明也可以是事件属性声明。在每种情况中,声明都可以由属性集合, new 修饰符,四个访问修饰符的有效组合 和一个静态修饰符组成。
一个事件声明的类型必须是一个代表类型, 而那个代表类型必须至少同事件本身一样可访问。
一个事件域声明与一个声明了一个或多个代表类型域的域声明相应。在一个事件域声明中不允许有readonly 修饰符。
一个事件属性声明与声明了一个代表类型属性的属性声明相应。除了同时包含get访问符和set访问符的事件属性声明,成员名称和访问符声明对于那些属性声明来说都是相同的,并且不允许包含virtual、 override和abstract 修饰符。
在包含一个事件成员声明的类或结构的程序文字中,事件成员与代表类型的私有域或属性相关,而这个成员可以用于任何允许使用域或属性的上下文中。
如果一个类或结构的程序文字外面包含一个事件成员声明,这个事件成员就只能被作为+= 和 -= 操作符 (§的右手操作数使用。这些操作符被用来为事件成员附加或去掉事件句柄,而这个事件成员的访问操作符控制操作在其中被执行的上下文。
由于+= 和 -= 是唯一可以在声明了事件成员的类型外的事件上使用的操作,外部代码可以为一个事件添加或去掉句柄,但是不能通过任何其他途径获得或修改基本事件域或事件属性的数值。
在例子中
public delegate void EventHandler(object sender, Event e);
public class Button: Control
{
public event EventHandler Click;
protected void OnClick(Event e) {
if (Click != null) Click(this, e);
}
public void Reset() {
Click = null;
}
}
对使用Button类中的Click事件域没有限制。作为演示的例子,这个域可以在代表调用表达式中被检验、修改和使用。类Button中的OnClick方法"引起"Click事件。引起一个事件的概念与调用由事件成员表示的代表正好相同-因此,对于引起事件没有特殊的语言构造。注意代表的调用是通过检查保证代表是非空后才进行的。
在类Button的声明外面,成员Click只能被用在+= 和 -= 操作符右手边,如下
b.Click += new EventHandler(...);
它把一个代表附加到事件Click的调用列表中,并且
b.Click -= new EventHandler(...);
它把一个代表从Click事件的调用列表中删除。
在一个形式为x += y 或 x -= y的操作中,当x是一个事件成员而引用在包含x的声明的类型外面发生时,操作的结果就是void(在赋值后与x的数值相反)。这个规则禁止外部代码直接检查事件成员的基本代表。
相关新闻>>
- 发表评论
-
- 最新评论 更多>>