c#入门详解之事件的定义与声明和事件与委托的关系

什么是事件?

事件的定义:是使对象或类具有通知功能的成员。
事件的作用:用于对象或类之间的动作协调与信息传递。
类(或对象)的成员包含三个最主要类别,分别是 字段(或属性),方法和事件。他们的作用分别是 【存储数据】,【处理数据】以及【通知事件订阅者(即类或对象)】。

事件的事件模型

事件模型的5个组成部分:

  • 事件的拥有者(event source事件源)----对象
  • 事件成员(event)
  • 事件的响应者(订阅者)--------------------对象
  • 事件处理器----------------------------------本质上是一个回调方法
  • 时间订阅------把事件处理器与事件关联在一起,本质上是一种以委托为基础的“约定”。

c#入门详解之事件的定义与声明和事件与委托的关系_第1张图片这个是最基础的事件模型,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;
}
}
上面代码就是,事件的完整声明方式
简略设革命方式:
vc#入门详解之事件的定义与声明和事件与委托的关系_第2张图片
运行结果不变。

EventHandler和EventArgs

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);
        }
    }

c#入门详解之事件的定义与声明和事件与委托的关系_第3张图片
c#入门详解之事件的定义与声明和事件与委托的关系_第4张图片

总结

  1. 事件的本质----是委托字段包装器,这个包装器用来保护委托不被滥用;包装器永远都不可能是被他包装的东西,所以事件不是委托字段。
  2. 属性不是字段–很多时候属性是字段的包装器,用来保护字段不被滥用。

你可能感兴趣的:(入门,热门,编程语言,c#)