事件的定义:是使对象或类具有通知功能的成员。 事件的作用:用于对象或类之间的动作协调与信息传递。 类(或对象)的成员包含三个最主要类别,分别是 字段(或属性),方法和事件。他们的作用分别是 【存储数据】,【处理数据】以及【通知事件订阅者(即类或对象)】。
事件模型的5个组成部分:
事件的拥有者(event source事件源)----对象事件成员(event)事件的响应者(订阅者)--------------------对象事件处理器----------------------------------本质上是一个回调方法时间订阅------把事件处理器与事件关联在一起,本质上是一种以委托为基础的“约定”。这个是最基础的事件模型,MVP,MVC便是采用这种事件模型为基础总结的。
介绍:
事件的拥有者—Customer顾客
事件成员-------Order
事件的订阅者----Waiter服务员
事件处理器----waiter.Action
任务:当顾客点菜时,服务员需要记录菜名和价格, 定义Customer成员:【事件Order】,【委托字段OrderEventArs】,【方法PayBill】,【属性Bill】,【点菜触发事件的方法OnOrder】 定义Waiter成员:【事件处理器Action】 namespace ConsoleApp1 { class Program { static void Main(string[] args) { Customer customer = new Customer();//事件拥有者 Waiter waiter = new Waiter();//事件订阅者 //给事件成员挂载事件处理器(方法) customer.Order += waiter.Action; //触发事件 customer.OnOrder(); //付款 customer.PayBill(); Console.ReadKey(); } }/// /// 自定义委托,用来关联事件处理器 /// /// 事件拥有者 /// 事件消息,事件传递给时间订阅者的信息 public delegate void OrderEventHandler(Customer customer, DishEventArgs e);
/// /// 事件拥有者 /// public class Customer { //委托字段 private OrderEventHandler orderEventHandler; //自定义事件 public event OrderEventHandler Order { add { this.orderEventHandler += value; } remove { this.orderEventHandler -= value; } } /// /// ///需要支付的金钱 /// public double Bill { get; set; } /// /// 埋单 /// public void PayBill() { Console.WriteLine(“i will pay {0}”, this.Bill); } /// /// 点菜方法,即触发事件的方法 /// public void OnOrder() { //有人订阅事件 if(this.orderEventHandler !=null) { DishEventArgs e = new DishEventArgs(); e.DishName = “宫保鸡丁”; e.Size = “small”; e.Price = 30; //启动事件 this.orderEventHandler.Invoke(this, e); } } } /// /// 事件的订阅者 /// public class Waiter { internal void Action(Customer customer, DishEventArgs e) { Console.WriteLine(“i will server you {0}”, e.DishName); double price = e.Price; switch(e.Size) { case “small”: price = price * 0.5;break; case “large”: price = price * 1.5;break; } customer.Bill += price; } }
/// /// 菜,事件消息,事件传递给事件订阅者的信息 /// public class DishEventArgs { public string DishName { get; set; } public string Size { get; set; }
public double Price { get; set; }} } c#拥有一些默认规则: 如果事件名为:order 相应的:【事件消息OrderEventArgs】、【与事件绑定的委托OrderEventHandler】、【触发事件的方法命名OnOrder】
public event OrderEventHandler Order { add { this.orderEventHandler += value; } remove { this.orderEventHandler -= value; } } 上面代码就是,事件的完整声明方式 简略设革命方式: v 运行结果不变。
c#类库给我们提供了一个创建好的委托类型来创建事件,EventHandler,他是所有用于声明事件的委托的父类,他的参数时(Object sender,EventArgs e),第一个参数是事件拥有者,第二个参数是事件消息。EventArgs类也是系统提供用来装载事件消息的类。因此我们可以这么做。 public event EventHandler Order ; public void OnOrder() { //有人订阅事件 if(this.Order!=null ) { DishEventArgs e = new DishEventArgs(); e.DishName = “宫保鸡丁”; e.Size = “small”; e.Price = 30; //启动事件
this.Order.Invoke(this, e); } }