C#事件event

这篇具有很好参考价值的文章主要介绍了C#事件event。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

举个栗子:妈妈喊儿子回家吃饭,儿子听到立马跑回家。

在上面这个例子中,事件拥有者是妈妈(Mother),事件成员是喊(Say),事件响应者是儿子(Son),事件处理是跑步回家(Gohome)

接下来我们尝试去写这个过程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp5event
{
    //事件拥有者(event source)(类对象)(有些书将其称为事件发布者)
    //事件成员(event)(事件拥有者的成员)(事件成员就是事件本身,事件不会主动发生,其只会在事件拥有者的内部逻辑的触发下发生。)
    //事件响应者(event subscriber)(类对象)(有些书将其称为事件订阅者)
    //事件处理器(event handler)(事件的响应者的成员)(根据拿到的事件参数/信息对事件进行处理)
    //事件订阅(委托类型 delegate)
    //举个栗子1:“裁判员开枪,运动员开始跑步。”
    //1.1事件拥有者是裁判员,
    //1.2事件成员是开枪,
    //1.3事件响应者是运动员,
    //1.4事件处理是开始跑步。
    //举个栗子2:这是WinForm编程中常用的一种方式,比如在一个窗体中,存在一个文本框和按钮,现在要通过点击按钮让文本框上显示出文字“Hello World”。
    //2.1发生的事件是:鼠标点击;
    //2.2事件拥有者是:按钮(Button),鼠标点击的是它,它是窗体对象的一个字段成员;
    //2.3事件响应者是窗体对象;
    //2.4事件处理是:窗体对象让自己的字段成员文本框(TextBox)显示出文字“Hello World”。

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

    //下面的示例是:你妈妈喊“回家吃饭”,你(儿子)跑步回家。
    //事件拥有者是妈妈,
    //事件成员是喊话,
    //事件响应者是儿子,
    //事件处理是跑步回家。

    //在声明事件之前,需要先声明一个委托类型来作为约束,即事件订阅,其约束了事件(喊话)能够发送什么事件参数给事件响应者(儿子),以及当事件响应者(儿子)的事件处理器(跑步回家)符合规定时(即符合委托类型指定的签名和返回值类型),事件订阅要将其保存起来(即委托字段引用方法)。根据命名规范,该委托应该命名为“事件名+EventHandler”。
    //可以将事件标记为public、private、protected、internal、protected internal 或 private protected。 这些访问修饰符定义该类的用户访问该事件的方式。 

    internal class Program
    {
        static void Main(string[] args)
        {
            Mother mother = new Mother();//事件的拥有者
            Son son = new Son();//事件的相应者
            mother.Say += son.Gohome; //事件Say,事件处理器gohome,事件订阅+= 也就是只要妈妈说话了,儿子就时时刻刻接收妈妈说的话
            mother.SayingProcess(); //触发事件,模拟妈妈喊儿子回家过程
            Console.ReadKey();
        }
    }


    //用于传递事件参数(事件信息)的类,该例子中主要用于将妈妈的话传递给儿子
    public class SayEventArgs : EventArgs
    {
        public String sentence { get; set; } //说了什么话
    }

    //声明委托类型(事件订阅)
    //第1个参数为事件拥有者(妈妈),第2个参数是用来存储喊儿子回家的相关信息(事件参数) 
    public delegate void SayEventHandler(Mother mother, SayEventArgs e);

    //妈妈类:事件拥有者
    public class Mother
    {
        //根据前面声明的委托类型来创建一个委托类型字段,用来触发事件处理器(儿子回家)
        private SayEventHandler sayEventHandler;

        //声明事件:
        //event为事件关键字,SayEventHandler表示用此委托来约束该事件
        public event SayEventHandler Say
        {
            //添加事件处理器
            add
            {
                sayEventHandler += value;
            }
            //删除事件处理器
            remove
            {
                sayEventHandler -= value;
            }
        }
        //下面的Say就相当于上面的Say(事件和儿子的动作进行绑定)和SayEventArgs(事件传输参数,用于将妈妈的话传给儿子)
        //public void Say(string sentence)
        //{
        //    Console.WriteLine("妈妈说:"+sentence);
        //}
        //模拟妈妈喊儿子的过程:
        public void SayingProcess()
        {
            Console.WriteLine("输入回车后开始模拟:妈妈做好饭喊儿子回家");
            Console.ReadLine();
            Console.WriteLine("妈妈已经做好饭了");
            Thread.Sleep(1000);
            Console.WriteLine("妈妈走向窗户边");
            Thread.Sleep(1000);
            Console.WriteLine("妈妈准备喊话");
            Thread.Sleep(1000);
            //触发事件:
            if (sayEventHandler != null) //若不存在任何事件处理器则无法触发事件
            {
                //准备好事件参数(即准备好妈妈想说的话)
                SayEventArgs e = new SayEventArgs();
                e.sentence = "儿子回家吃饭了";
                Console.WriteLine("妈妈说:“"+e.sentence+"”");
                Thread.Sleep(1000);
                //调用事件处理器(就是)
                sayEventHandler(this, e);
                e.sentence = "儿子买点盐去,家里没有盐了";
                Console.WriteLine("妈妈说:“" + e.sentence + "”");
                Thread.Sleep(1000);
                sayEventHandler(this, e);
            }
        }
    }
    //儿子类:事件响应者
    public class Son
    {
        //想儿子要回家的话,首先得有妈妈约束(所以第一个参数是事件的拥有者),其次是妈妈做了什么(喊吃饭,所以第二个参数是事件)才能让儿子回家
        //此处的参数必须与SayEventHandler一样
        public void Gohome(Mother mother, SayEventArgs e)
        {
            Thread.Sleep(1000);
            Console.WriteLine("儿子接收到妈妈的话:"+e.sentence);
            Thread.Sleep(1000);
            if (e.sentence.Contains("回家"))
            {
                Console.WriteLine("儿子说:“好的,妈妈,我马上回家吃饭”");
            }
            else {
                Console.WriteLine("儿子说:“妈妈,自己去买呗,我还想在外面玩会”");
            } 
        }
    }

}

运行结果如下 

C#事件event,C#,c#,开发语言

参考文献

event - C# 参考 - C# | Microsoft Learn

C# 事件(event)_c# event_熊思宇的博客-CSDN博客

C#中的事件(event)_c# event_香芋派丶的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-699272.html

到了这里,关于C#事件event的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 开发 DNF手搓按键。keybd_event 模拟键盘操作(重点是方向键模拟)

    一、开发目标:使用keybd_event和键盘HOOK实现一个按键模拟DNF中的技能指令。操作角色是红眼。 二、项目进度:初步实现技能指令释放,没有对键盘连按做处理,会有N多重复命令,导致角色会抽搐。没有做自定义按键,所有指令都是写到程序中的,不够灵活。 三、开发环境:

    2024年02月09日
    浏览(36)
  • Tkinter Event事件处理方法

    在Tkinter中,事件处理方法是指在用户与GUI交互时,程序响应用户的操作并执行相应的操作。以下是一些常用的事件处理方法: Button-Click事件处理方法:当用户单击按钮时,执行相应的操作。 Key-Press事件处理方法:当用户按下键盘上的某个键时,执行相应的操作。 Mouse-Click事

    2024年02月09日
    浏览(45)
  • C#开发winform&wpf后台捕获鼠标移动事件

    做 WPF和winform的时候,可以在界面上设置鼠标移动事件来检测鼠标移动,如果项目为后期改造这样做的话改动量很大,今天通过另外一种后台调用windows api的方式进行快速捕获和触发,提高开发效率分享给大家。

    2024年02月16日
    浏览(47)
  • JS 之 事件Event对象详解(属性、方法、自定义事件)

    一、Event对象 1、简介 ​ 事件 event 对象是指在浏览器中触发事件时,浏览器会自动创建一个 event 对象,其中存储了本次事件相关的信息,包括事件类型、事件目标、触发元素等等。浏览器创建完 event 对象之后,会自动将该对象作为参数传递给绑定的事件处理函数,我们可以

    2024年02月09日
    浏览(64)
  • Node内置模块 【Event事件模块】

    哈喽小伙伴们,新的专栏 Node 已开启;这个专栏里边会收录一些Node的基础知识和项目实战;今天我们带领大家初识

    2023年04月23日
    浏览(36)
  • 【Spring源码】Spring Event事件

    目录 1、前言 2、什么是Spring Event? 3、基本使用 3.1、定义事件 3.2、发布事件 3.3、监听事件 3.3.1、继承ApplicationListener 3.3.2、使用@EventListener注解 4、Spring Event是同步还是异步? 4.1、源码实现 4.2、如何实现异步 4.2.1、使用@Async注解 4.2.2、手动实现异步线程池 4.2.3、自定义Appli

    2024年02月04日
    浏览(35)
  • GameFramework框架详解之 Event事件系统

    GameFramework是一种基于Unity3D引擎的游戏开发框架,其中包括了强大的事件系统。该系统使用了观察者设计模式,允许游戏对象之间的松耦合通信和交互。 传统的事件系统,一般都是由一个EventManager管理着所有的Event集合,每个Event包括一个EventId+EventHandler。 GameFramework的事件系

    2024年02月03日
    浏览(42)
  • 浏览器事件循环Event Loop

    引言: 事件循环不是浏览器独有的,从字面上看,“循环”可以简单地认为就是重复,比如for循环,就是重复地执行for循环体中的语句,所以事件循环,可以理解为重复地处理事件,那么下一个问题是,处理的是什么事件,事件的相关信息从哪里获取。 因为我没有用nodejs做

    2024年02月05日
    浏览(52)
  • 【unity实战】事件(Event)的基本实战使用

    之前我们介绍过委托的用法,具体可以跳转:【unity小技巧】委托(Delegate)的基础使用和介绍 这期来讲讲事件,使用你会发现它和委托真的很像,那么他们具体有什么区别呢? 在Unity中,事件(Event)和委托(Delegate)是两种不同的概念,它们之间有一些区别: 委托(Deleg

    2024年04月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包