若要写一个事件:首先要明确:一个完整的事件模型由五部分组成:事件拥有者、事件、事件响应者、事件处理器、订阅。
用前面的例子:顾客Customer去餐馆点餐Order然后Waiter来服务这个事件。
第一步:事件拥有者和事件响应者
用C#来写,从简单的入手。首先写自己有把握的,比如。先定义两个对象类:一个Customer类,一个Waiter类。其他信息我们啥也不知道。但是我们知道肯定要有这两个人来做这事。
public class Customer
{
}
public class Waiter
{
}
并且去主函数中实例化对象备用:
static void Main(string[] args)
{
//实例化对象:事件拥有者、事件响应者
Customer customer = new Customer();
Waiter waiter = new Waiter();
}
这都是C#最基础的,直接写。成不成,草稿要划一划嘛。
第二步:事件
其次我们要明确一点,点餐这个Order事件拥有者是谁?谁点餐,顾客点餐,所以事件拥有者就是顾客。事件响应者就是Waiter。
那么我们就可以在Customer里面就可以写上一个事件:Order。
不论是以字段式声明的写法还是在class平级中以委托类型的自定义声明都可以。字段式写法简单,一会看。如果是委托类型的自定义事件声明,就需要在Customer类内声明一个事件类型的字段。并且为事件写上事件处理器的添加器和移除器。注意命名方式:后缀是EventHandler和EventArgs,其中EventArgs基类继承。是最复杂的。在上一篇文章中,已经有了完整过程。非必要不写完整声明。这里咱们只是简单的看看哈。
咱们还是从简单的开始:字段式声明,直接用DotNet给我们准备好的EventHandler方法。
public event EventHandler Order;
按住Ctrl点进去看看定义。

本质还是基于委托。注意其委托方法的参数类型,一个是object,一个EventArgs。要知道这俩参数干啥用的。一会讲。现在不管。(对应下文,VS智能提示补全的事件处理器Action的参数。其实这个委托就是要委托这个事件处理器。所以跟事件处理器的参数类型相同)

我们在Customer类中写上事件:至此五部分就有了三个。
namespace Event07默写一遍
{
class Program
{
static void Main(string[] args)
{
//实例化对象:事件拥有者、事件响应者
Customer customer = new Customer();
Waiter waiter = new Waiter();
}
}
public class Customer
{
// 事件声明好了
public event EventHandler Order;
}
public class Waiter
{
}
}
第三步:硬写事件处理器以及订阅
硬写,这个词,就是为了搭起主要架构。在主函数中写事件的订阅。事件的订阅是通过事件订阅操作符+=完成。左边必须是事件,右边是响应者的事件处理器。


写的时候没注意到用的类方法,实例化对象Tab没用上,用类定义的事件处理器,所以导致方法是静态的。最后面有重构。不影响。请继续阅读。
using System;
namespace Event07默写一遍
{
class Program
{
static void Main(string[] args)
{
//实例化对象:事件拥有者、事件响应者
Customer customer = new Customer();
Waiter waiter = new Waiter();
customer.Order += Waiter.Action;
}
}
public class Customer
{
public event EventHandler Order;
}
public class Waiter
{
internal static void Action(object sender, EventArgs e)
{
throw new NotImplementedException();
}
}
}
通过硬写用VS的智能提示,补全了我们的事件处理器方法体。
至此主要的框架搭起来了,主干有了。后面开始补全。
事件的委托类型定义: public delegate void EventHandler(object sender, EventArgs e);
事件处理器的定义: internal static void Action(object sender, EventArgs e)
第一句来源我们在Customer类内声明事件时,查看EventHandler方法时。发现是一个委托类型。
第二句是我们在Waiter类中生成的事件处理器;两者参数相同。提出委托的对象找到了。
所以隐藏在事件处理器背后的是委托。
响应者通过委托把处理器传递给事件。供事件去跨类之间调用。
事件处理器本质就是一个

本文详细解析了C#中的事件机制,包括事件的定义、触发、响应等关键环节,并通过一个具体的餐馆点餐示例,逐步展示了如何在C#中实现事件的全过程。
最低0.47元/天 解锁文章
1770

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



