一、自定义事件的完整声明方式
餐馆点餐Order这样一个事件:服务员拿自己的一个事件处理器来订阅顾客点餐这样一个事件。顾客的点餐这个事件一发生,服务员的事件处理器就会马上执行。
如何自定义一个事件?首先考虑构成事件的五个部分:事件拥有者,事件,事件响应者,事件处理器,订阅。
第一步:定义一个事件拥有者。
Customer类,他会有一个属性:账单Bill。一个方法:PayTheBill。
class Customer
{
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("I will pay ${0}.",this.Bill);
}
}
第二步:定义事件:
上一节提到:
我拿方法订阅你的一个事件,事件发生,执行这个方法。我把这个方法绑定事件。
这个函数方法相当于一个参数传递给某个接受值的对象。
事件是基于委托的:两层含义:
1、事件需要使用委托类型来做一个约束,即规定了事件要发送什么样的消息给事件的响应者,也规定了事件响应者能收到什么样的消息,(这两句话一个意思)。这就决定了事件响应者的事件处理器必须能够跟这个约束匹配上,他才能订阅这个事件。(用类型来限制约束。而声明委托就必须限制函数签名。能完成这个目的。)
2、当事件的响应者向事件的拥有者提供了能够匹配的事件处理器之后,需要将这个事件处理器记录或者保存下来,能够记录或者引用方法的任务,只有委托类型的实例才能够做到。(也就是说)
事件这个成员无论从表层约束来讲,还是底层实现来讲,都是依赖于委托类型的。委托是事件的底层基础,事件是委托的上层建筑。
声明事件类型:如果想要声明事件类型,就必须有一个合适委托类型来供我们使用。先声明一个委托类型。委托是一种类,所以其声明类的位置跟其他类是平级的。
// 委托类型,声明事件所需。
public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);
// 事件拥有者的类
class Customer
{
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("I will pay ${0}.",this.Bill);
}
}
// 传递事件消息的类
class OrderEventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
按照Dotnet的规定,如果委托是为了声明某个事件而准备的,这个委托的命名方式必须是事件名+EventHandler后缀。所以定名为OrderEventHandler。
委托引用的方法参数列表,第一个参数:谁点的菜,事件的拥有者;第二个参数:存储有关点的菜的信息的,也就是要传递事件信息(EventArgs)的。Dotnet规定,这个类型是事件名+EventArgs。
DotNet规定事件的后缀EventHandler有三个用意:
1、标明委托是专门用来声明事件的,这样读到这个代码就知道用途,见名知意。
2、标明委托是用来约束事件处理器的。
3、标明这个委托未来创建出的实例是专门用来存储事件处理器的。可读性增强。
后缀EventArgs同样如此。
DotNet也规定,如果某个类的用途是作为EventArgs来使用,那么应该派生自EventArgs基类。微软准备好的基类。
委托类型的声明如果放入了类体中,编译可以通过,是因为C#支持嵌套类型的。但是只能类内使用。
此时就可以声明委托类型的事件了。Order事件。
Order事件,是Customer的成员。因此将事件写在Customer类中。写之前要提升所有类的访问级别:public。因为所有类最后都要配合在一起使用。
首先用委托类型声明一个委托类型的字段,同时不希望被外界访问到。这个委托字段,就是用来存储或者说引用那些事件处理器的。类似Python中a = fun

本文详细解析了C#中的事件机制,包括自定义事件的完整声明过程、简略声明方式及事件背后的委托类型字段等内容。通过餐馆点餐场景示例,深入浅出地介绍了事件的定义、响应者、处理器及触发等核心概念。
最低0.47元/天 解锁文章
167

被折叠的 条评论
为什么被折叠?



