C#中的事件(event)

本文详细介绍了事件模型的五个组成部分:事件拥有者、事件、事件响应者、事件处理器和事件订阅,并通过实例解析了事件模型的工作流程。讨论了事件与属性的区别,并展示了自定义事件的完整和简化实现。事件模型的核心在于安全地触发和响应事件,确保正确传递信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事件模型(event model)

事件模型的5个组成部分
  • 事件拥有者(event source)(类对象)(有些书将其称为事件发布者)
  • 事件成员(event)(事件拥有者的成员)(事件成员就是事件本身,事件不会主动发生,其只会在事件拥有者的内部逻辑的触发下发生。)
  • 事件响应者(event subscriber)(类对象)(有些书将其称为事件订阅者)
  • 事件处理器(event handler)(事件的响应者的成员)(根据拿到的事件参数/信息对事件进行处理)
  • 事件订阅(委托类型)

举个栗子:“裁判员开枪,运动员开始跑步。”

在上面这个例子中,事件拥有者是裁判员,事件成员是开枪,事件响应者是运动员,事件处理是开始跑步

至于事件订阅,它不是具体的对象或成员,其作用是将事件和事件处理器关联到一起,其代表了事件拥有者与事件响应者之间的联系,比如裁判员开枪,他所在的比赛现场上的运动员会起跑,但几百里外的其他运动员不会起跑,在现场看比赛的观众也不会起跑,因为他们与裁判员之间没有联系,即没有订阅裁判员的事件。

除此之外,事件订阅还能够约束事件成员能够把什么样的事件参数传递给事件处理器、事件处理器应该拥有什么样的签名和返回值类型(方法的签名由方法名称和参数列表组成,不包括返回值类型)。我们不能随随便便地拿任何事件处理器来处理事件,就像当裁判员开枪时,运动员应该起跑而不是坐下来喝杯茶。

从发生到响应的5个动作

事件拥有者拥有一个事件→②事件响应者订阅了这个事件→③事件拥有者触发了事件→④事件响应者会被依次通知到(按照订阅的顺序)→⑤事件响应者根据拿到的事件参数对事件进行处理

事件模型组成部分的3种组合方式

1、事件拥有者和事件响应者分别属于不同的类:

namespace TestConsole
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            Form myForm = new Form(); //事件拥有者:myForm
            Test myTest = new Test(myForm); //事件响应者:myTest
            myForm.ShowDialog(); //显示窗体
        }
    }

    class Test
    {
   
        private Form form;
        public Test(Form form)
        {
   
            if (form != null)
            {
   
                this.form = form;
                this.form.Click += FormClicked; //鼠标点击事件
                //事件:Click;事件处理器:FormClicked;事件订阅:+=
            }
        }
        //事件处理器:(可由编译器自动生成)
        private void FormClicked(object sender, EventArgs e)
        {
   
            form.Text = DateTime.Now.ToString(); //将当前时间作为窗体的标题
        }
    }
}

//发生事件:鼠标点击窗体;
//谁拥有这个事件:窗体myForm,鼠标点击的是它;
//谁响应了这个事件:myTest,当窗体被点击时,其要做出处理;
//做出什么处理:为窗体添加当前时间。

2、事件拥有者和事件响应者是同一个对象

namespace TestConsole
{
   
    class Program
    {
   
        static void Main(
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值