【C#语言入门】17. 事件详解(上)

【C#语言入门】17. 事件详解(上)

一、初步了解事件

  • 定义:单词Event,译为“事件”
    • 通顺的解释就是**“能够发生的什么事情”**,例如,“苹果”不能发生,但是“公司上市”这件事能发生。
    • 在C#中事件是类型的成员,没有公司就没有公司上市这件事。
  • 担任角色:使对象或者类具备通知能力的成员。
    • (中译)事件(event)是一种使对象或者类能够提供通知的成员。
    • (原文)An event is a member that enables an object or class to provide notifications.
    • “对象O拥有一个事件E”想要表达的思想是:当事件E发生的时候,O有能力通知别的对象。
    • 事件的功能——通知 + 可选的事件参数(即详细信息)
  • 使用:用于对象或者类间的动作协调与信息传递(消息推送)
  • 原理:事件模型(event model)中的两个“5”
    • “发生→响应”中的五个部分:闹钟响了我起床,时间到了我下班……隐含着第五个部分“订阅”关系,某关心某的状态。
    • “发生→响应”中的五个动作:(1)我有一个事件 →(2)一个人或者一群人关心我的这个事件 →(3)我的这个事件发生了 →(4)关心这个事件的人会被依次通知到 →(5)被通知到的人根据拿到的事件信息(又称“事件数据”、“事件参数”、“通知”)对事件进行响应(又称“处理事件”)。
  • 术语定义:
    • 事件的订阅者 = 事件消息的接受者,事件的响应者,事件的处理者,被事件所通知的对象。
    • 事件参数 = 事件信息,事件消息,事件数据。
  • 提示:
    • 事件多用于桌面、手机等开发的客户端编程,因为这些程序经常是用户通过事件来驱动的。
    • 各种编程语言对这个机制的实现方法不尽相同。
    • Java语言里面没有事件这种成员,也没有委托这种数据类型。Java的"事件"是使用接口来实现的
    • MVC\MVP\MVVM等模式,是事件模式更高级、更有效的“玩法”
    • 日常开发的时候,使用已有事件的机会比较多,自己声明事件的机会比较少,所以先学会使用。

二、事件的应用

  • 实例演示

    • 派生(继承)与扩展(extends)
  • 事件模型的五个组成部分

    1. 事件的拥有者(event source,对象)
    2. 事件成员(event,成员)
    3. 事件的响应者(event subscriber,对象)
    4. 事件处理器(event hander,成员)——本质上是一个回调方法
    5. 事件订阅——把事件处理器与事件关联在一起,本质上是一种以委托类型为基础的“约定”。
  • 组合方式
    请添加图片描述
    请添加图片描述
    请添加图片描述

  • 注意

    • 事件处理器是方法成员
    • 挂接事件处理器的时候,可以使用委托实例,也可以直接使用方法名,这是个语法糖
    • 事件处理器对事件的订阅不是随意的,匹配与否由声明事件时所使用的委托类型来检测
    • 事件可以同步调用也可以异步调用
internal class Program
{
    static void Main(string[] args)
    {
        Timer timer = new Timer();
        timer.Interval = 1000;//单位毫秒
        Boy boy = new Boy();
        Girl girl = new Girl();
        timer.Elapsed += girl.Action;
        timer.Elapsed += boy.Action;//订阅操作+=,Elapsed是事件成员,timer是事件拥有者,boy是事件响应者
        timer.Start();
        Console.ReadLine();
    }
}

class Boy
{
    internal void Action(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("Jump!");
    }
}

class Girl
{
    internal void Action(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("Sing!");
    }
}
class EventExample1
{
    static void Main(string[] args)
    {
        Form form = new Form();//事件拥有者
        Controller controller = new Controller(form);//事件响应者
        form.ShowDialog();

    }

}

class Controller
{
    private Form form;
    public Controller(Form form)
    {
        if (form != null)
        {
            this.form = form;
            this.form.Click += this.FormClicked;//事件成员,事件订阅
        }

    }

    private void FormClicked(object sender, EventArgs e)
    {
        this.form.Text = DateTime.Now.ToString();//事件处理器
    }
}
class EventExample1
{
    static void Main(string[] args)
    {
        MyForm myForm = new MyForm();
        myForm.Click += myForm.FormClicked;
        myForm.ShowDialog();    
    }

}

class MyForm : Form
{
    internal void FormClicked(object sender, EventArgs e)
    {
        this.Text = DateTime.Now.ToString();
    }
}
class EventExample1
{
    static void Main(string[] args)
    {
         MyForm form = new MyForm();
        form.ShowDialog();
    }

}

class MyForm : Form
{
    private TextBox textBox;
    private Button button;//事件拥有者

    public MyForm()//事件响应者
    {
        this.textBox = new TextBox();
        this.button = new Button();
        this.Controls.Add(this.button);
        this.Controls.Add(this.textBox);
        this.button.Click += this.ButtonClicked;//事件成员,订阅
        this.button.Text = "say Hello";
        this.button.Top = 100;
        this.button.Left = 50;
    }

    private void ButtonClicked(object sender, EventArgs e)
    {
        this.textBox.Text = "Hello,World!!!!!!!!!!!!!!";//事件处理器
    }
}

相关推荐

  1. C#语言入门16. 委托详解

    2024-03-11 02:40:01       19 阅读
  2. C#语言入门13. 表达式、语句详解(3)

    2024-03-11 02:40:01       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-11 02:40:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-11 02:40:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-11 02:40:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-11 02:40:01       18 阅读

热门阅读

  1. 如何在unity中实现倒计时

    2024-03-11 02:40:01       22 阅读
  2. python判断ip是否是本机

    2024-03-11 02:40:01       22 阅读
  3. 3.6作业

    3.6作业

    2024-03-11 02:40:01      26 阅读
  4. uniapp 使用vue-i18n实现传入变量国际化

    2024-03-11 02:40:01       21 阅读
  5. 蓝桥杯2023年-接龙数列(dp)

    2024-03-11 02:40:01       22 阅读