C#学习笔记(十六)事件(三)自定义事件+事件不是委托

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

一、自定义事件的完整声明方式

餐馆点餐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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值