C#学习笔记(十七)事件(四)事件个人总结

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

若要写一个事件:首先要明确:一个完整的事件模型五部分组成:事件拥有者、事件、事件响应者、事件处理器、订阅。

用前面的例子:顾客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类中生成的事件处理器;两者参数相同。提出委托的对象找到了。

所以隐藏在事件处理器背后的是委托。

响应者通过委托把处理器传递给事件。供事件去跨类之间调用。


事件处理器本质就是一个

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值