初识C#事件

news2024/11/18 15:23:30

文章目录

  • 一 事件
    • 1 抛砖引玉·案例
      • 1.1工具人下楼案例
        • 1.1.1 ToolMan.cs
        • 1.1.2 LazyMan.cs
        • 1.1.3 Program.cs
        • 1.1.4 测试结果
        • 1.1.5 升级到事件
  • 二 委托和事件的区别和联系

一 事件

在这里插入图片描述

1 抛砖引玉·案例

  • 订阅和发布机制
    • 比如说,我要下楼去吃饭,正常情况下我会问一下室友是否需要我带饭。我每个人问一遍的情况,很浪费时间。
    • 现在,我提前放好纸和笔,要求别人列好需要我帮忙的事情,我到时候直接拿着单子下楼。这就是订阅和发布机制。

1.1工具人下楼案例

1.1.1 ToolMan.cs

 public delegate void DownStairDelegate();
    public class ToolMan
    {
        public string Name { get; set; }
        //事件--受限制的委托--event本质上还是委托
        //限制一:只能出现在+=、-=的左侧
        //限制二:只能在内部调用
        public DownStairDelegate DoList = null;

        public ToolMan(string name)
        {
            Name = name;
        }

        public void DownStair()
        {
            Console.WriteLine("工具人"+Name+"下楼了");
            if (DoList != null)
            {
                DoList();
            }
        }
    }

1.1.2 LazyMan.cs

using System;

namespace test06
{
    public class LazyMan
    {
        public string Name { get; set; }

        public LazyMan(string name)
        {
            Name = name;
        }

        public void TakeFood()
        {
            Console.WriteLine("给"+Name+"外卖");
        }

        public void TakePackage()
        {
            Console.WriteLine("给"+Name+"快递");
        }
    }
}

1.1.3 Program.cs

using System;

namespace test06
{
    internal class Program
    {
        //工具人下楼案例
        public static void Main(string[] args)
        {
            var toolMan = new ToolMan("小明");
            var lazyMan = new LazyMan("小李");
            var lazyMan1 = new LazyMan("小王");
            var lazyMan2 = new LazyMan("小空");
            //注意 +=:添加委托 
            toolMan.DoList += lazyMan.TakeFood;
            toolMan.DoList += lazyMan1.TakePackage;
            toolMan.DoList += lazyMan2.TakeFood;
            toolMan.DoList();
            Console.WriteLine("===========");
            toolMan.DoList -= lazyMan2.TakeFood;//取消了小空的拿外卖的委托。
            toolMan.DoList();
            //=:覆盖之前的所有委托【但委托的总数变为1】
            Console.WriteLine("===========");
            toolMan.DoList = lazyMan2.TakeFood;
            toolMan.DoList();
            
            //工具人并准备没有下楼,但消息已经发布出去了
            //意思就是消息只有发布者去发布,其他人无权发布,只能订阅这些消息--不适合外部调用
            //解决
            //toolMan.DoList();
        }
    }
}

1.1.4 测试结果

在这里插入图片描述

1.1.5 升级到事件

在这里插入图片描述

 internal class Program
    {
        //工具人下楼案例
        public static void Main(string[] args)
        {
            var toolMan = new ToolMan("小明");
            var lazyMan = new LazyMan("小李");
            var lazyMan1 = new LazyMan("小王");
            var lazyMan2 = new LazyMan("小空");
            //注意 +=:添加委托 
            toolMan.DoList += lazyMan.TakeFood;
            toolMan.DoList += lazyMan1.TakePackage;
            toolMan.DoList += lazyMan2.TakeFood;
            //toolMan.DoList();
            Console.WriteLine("===========");
            toolMan.DoList -= lazyMan2.TakeFood;//取消了小空的拿外卖的委托。
            //toolMan.DoList();
            //=:覆盖之前的所有委托【但委托的总数变为1】
            Console.WriteLine("===========");
            //toolMan.DoList = lazyMan2.TakeFood;
            //toolMan.DoList();
            
            //工具人并准备没有下楼,但消息已经发布出去了
            //意思就是消息只有发布者去发布,其他人无权发布,只能订阅这些消息--不适合外部调用
            //解决
            //toolMan.DoList();
            //事件情况下只有发布者发布了消息,才会执行委托
            toolMan.DownStair();
        }
    }

在这里插入图片描述

二 委托和事件的区别和联系

在这里插入图片描述

  • 事件是一种特殊的委托,或者说是受限制的委托,是委托一种特殊应用,只能施加±,-二操作符。二者本质上是一个东西。
  • event ActionHandler Tick;//编译成创建一个私有的委托示例,和施加在其上的add,remove方法.
  • event只允许用add,remove方法来操作,这导致了它不允许在类的外部被直接触发,只能在类的内部适合的时机触发。委托可以在外部被触发,但是别这么用。
  • 使用中,委托常用来表达回调,事件表达外发的接口。
  • 委托和事件支持静态方法和成员方法,delegate(void* pthis,f_ptr)支持静态返回方法时,pthis传null.支持成员方法时pthis传被通知的对象.
  • 委托对象里的三个重要字段是,pthis、f_ptr、pnext,也就是被通知对象引用,函数指针\地址,委托链表的下一个委托节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式之适配器模式

设计模式之适配器模式 文章目录设计模式之适配器模式1. 定义2. 类型3. 场景4. 优点5. 缺点6. 适配器扩展6. 相关适配器模式7. coding7.1 被 适配者方法7.2 接口7.3 接口的实现7.4 适配者适配被适配者达到Target 目标7.5 类适配器的实现方式,其他的都不变8. 源码解析…

【Django】REST_Framework框架——序列化器serializers源码解析

一、序列化器类——Serializer 1、序列化器的作用 序列化器的使用分两个阶段: 1、在客户端请求时,使用序列化器可以完成对数据的反序列化(将字典格式的数据转化为模型对象)。 2、在服务器响应时,使用序列化器可以完…

网络原理——No.4 传输层_TCP协议中的延迟应答, 捎带应答, 面向字节流与TCP的异常处理

JavaEE传送门JavaEE 网络原理——No.2 传输层_TCP的连接管理 网络原理——No.3 传输层_TCP的滑动窗口, 流量控制与拥塞控制 目录延迟应答捎带应答面向字节流粘包问题TCP 中的异常处理(连接异常)TCP 和 UDP 的应用场景延迟应答 一种提高传输效率的机制, 又是基于流量控制, 来引…

Appinventor——蓝牙app(蓝牙遥控器、串口助手、温湿度显示、切换界面蓝牙依旧保持连接)

App Inventor由谷歌实验室开发,移交麻省理工学院,是一款图形化编程环境,不需要复杂的变成语言,采用搭积木的方式编程,只需将组件拖入即可,简直就是不爱编程党的超级福音 本文搭建了一个蓝牙app&#xff0c…

【CSS】CSS基础认知【CSS基础知识详解】

🌸大家好,我是花无缺,一枚热爱生活的新时代青年,感谢你的阅读🥰~ 👨‍💻个人主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专…

女朋友说她累了之后依然在线,于是20行代码写了个小工具康康发生了什么

近发现女朋友一到晚上总是很忙的样子, 每晚匆匆忙忙道过晚安就说自己累了去睡觉。 是我哪里做的不对吗… 睡就睡了,可是,QQ头像却会偶尔亮起来, 我非常担心,是不是账号被盗了呢? 然后,就想帮…

Django全家桶

Django框架从入门到高级 (一)Django入门 Web应用 详细地址见:https://blog.csdn.net/DiligentGG/article/details/126606099?spm1001.2014.3001.5501 Web框架本质 web框架本质上可以看成是一个功能强大的socket服务端,用户的…

Android专有GitHook完结篇,发布到npm

系列文章目录 Android打造专有hook,让不规范的代码扼杀在萌芽之中 Android打造专有hook第二篇,走进规范第一步 Android打造专有Hook第三篇,实战全量代码规范检查 Android打造专有Hook第四篇,实战增量代码规范检查 Hello啊各位…

【NLP】词向量

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

阿里巴巴面试题- - -多线程并发篇(三十)

前言:七月末八月初的时候,秋招正式打响,公司会放出大量的全职和实习岗位。为了帮助秋招的小伙伴们,学长这里整理了一系列的秋招面试题给大家,所以小伙伴们不用太过焦虑,相信你们一定能超常发挥,收到心仪公司的Offer~~ 内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elast…

窥一斑而知全豹,从五大厂商看MCU国产化的机遇和挑战

👆👆👆 #电巢直播10月26日(周三)扫码参与 前言 近年来,MCU在各领域的应用大幅度增加。2021年全球MCU的总出货量仍旧增长12%,使去年全球MCU的交付量达到了309亿片的历史新高。根据IC Insights…

工业控制系统安全评估流程系统评定与分类

综述 随着计算机和网络技术的发展,特别是信息化与工业化## 综述 随着计算机和网络技术的发展,特别是信息化与工业化深度融合以及物联网的快速发展,工业控制 系统产品越来越多地采用通用协议、通用硬件和通用软件,网络威胁正在由传…

Linux文件属性与权限

目录 前言 文件权限类 文件属性 rwx 作用文件和目录的不同解释 chmod 改变权限 1)基本语法 2)经验技巧 3)案例实操 chown 改变所有者 1)基本语法 2)选项说明 3)实操案例 chgrp 改变所属组 …

康为世纪科创板上市破发:跌幅超10% 公司市值41亿

雷递网 雷建平 10月25日江苏康为世纪生物科技股份有限公司(简称:“康为世纪”,股票代码为“688426”)今日在科创板上市。康为世纪此次发行价为48.98元,发行2329万股,募资总额为11.4亿元。康为世纪开盘价为4…

【单片机毕业设计】【mcuclub-jj-048】基于单片机的水表的设计

最近设计了一个项目基于单片机的水表系统,与大家分享一下: 一、基本介绍 项目名:水表 项目编号:mcuclub-jj-048 单片机类型:STC89C52 具体功能: 1、通过继电器控制水泵,将水抽出经过流速传感器…

Redis实战篇一 (短信登录)

Redis企业实战(黑马点评)项目整体架构项目部署后端部署前端部署短信登陆基于Session实现登录集群的Session共享问题基于Redis实现共享session登录解决状态登录刷新的问题——登录拦截器的优化本期学习路线短信登陆: Redis的共享session应用 商户查询缓存…

jar包突然过大解决方法,解决ffmpeg剪辑视频导致jar过大

jar包突然过大解决方法 缘由: ​ 项目中要需要用到视频文件,为了方便用户使用,那么页面中就需要增加视频剪辑的相关功能,让用户上传视频后能够自定义的进行剪辑,对自己的视频做出相应的更改 结果: ​ 打jar…

Vue复刻华为官网 (二)

文章目录1 推荐信息1.1 思路1.2 代码1.3 知识补充1.4 效果图2 宣传海报2.1 思路2.2 代码2.3 效果图3 新闻与活动3.1 思路3.2 代码3.3 效果图1 推荐信息 1.1 思路 看了这个gif后,可以清楚的看到产生了三个动画效果:图片"拉近","…

js 实现页面隐藏、关闭、刷新给出对应的提示

我们在做项目的时候经常会遇到一些需求,比如在某些页面当点击浏览器刷新 或者关闭的时候会有对应的提示,是否离开或者重新加载此网站。比如csdn写文章的时候就有这个弹窗,这功能就是用onbeforeunload实现的。 注意:如果你加载下面…

学会用Linux用户管理命令

目录 useradd 添加新用户 1)基本语法 2)案例实操 passwd 设置用户密码 1)基本语法 id 查看用户是否存在 1)基本语法 2)案例实操 cat /etc/passwd 查看创建了哪些用户 1)案例实操 su 切换用户 1…