C# 委托与事件——白话解释

C# 委托与事件——白话解释

引言

在了解zed的unity插件的时候,发现里面有多处用了委托和事件,然后上网查找了一下相关资料,发现说的都不是人话,各种程序语言的专业术语,一个接一个,什么回调、发部-订阅模式还有委托这个词本身,都是翻译过来的,光看字面看不出它是什么意思,看了半天也是迷迷糊糊,后来用白话想明白,特意写出来,科班程序员不要喷。

程序语言、程序语言,不能离开后面的语言两字,说白了就是写给机器看的文字。 对于不同程序语言,定义的规范等等,说白了就是在做文字工作,例如如何把字组成句,把句组成段,把段组成文章, 好的文章需要规划结构。好的文章不仅要有好的内容和素材,也需要有好的架构规划。 而内容对应了程序的功能算法,而架构规划则对应程序的组织性。

文章可以想杂想一样完全自己从0写到成文,也可以像写思想汇报一样,东抄一点,西抄一点,然后自己添加一点。
而目前的程序更偏向写思想汇报,里面很多内容是别人写好的(python中对应"包",就是import 后面接的,C++、C里面对应开头引用的using的内容, C#同样的, 以及各种动态链接库)。
所以总而言之,言而总之,写程序要面临的一个问题,就是怎么把不同代码整合到一起(不仅是搬砖的意思)。那么看程序组织的问题,可以看是怎么来拼接不同的代码块。就好比一篇文章,哪个段落在前,哪个在后,哪个地方需要重新插入一段,哪个地方需要删除,哪个地方需要反复提起。

小代码——>把人话讲成机器话。
工程量大的代码——>怎么把多个人的人话理清楚前后顺序,翻译成机器话。

委托

委托是啥呢?
可以理解为一个快递箱子。 谁家的箱子呢, 顺丰的(委托的类型),寄给谁呢,寄给小明吧(委托的名称)
顺丰明确规定了箱子里面能放的物品的种类(参数类型),能被拿出来的东西种类(输出参数类型)(定义委托) 。
那么当你要寄东西的时候,你就知道按照要求往里面放东西了(符合输入输出的函数,放的过程相当于实例化委托的过程)
顺丰同样把规定告知了小明,小明看到箱子上写的是自己的名字,就知道是自己的箱子了,不用管里面装了什么东西(调用委托就可以,不用管具体实例化的函数叫什么名称),同时知道可以往这个箱子里面装什么东西,可以拿出什么东西(函数的输入,函数的输出)。 啰里啰唆写不下去了,大概就这么回事把,下面的事件写的比较详细。

为什么要有事件

为什么要有事件这个东西呢。
可以这么来理解,比如我们在纸上写红楼梦这部小说,一开始写的时候并不能写得很详细,考虑的东西比较不周。例如写到了贾宝玉死了,但是此时还不能完整刻画在他死的时候,身边的人的反应细节。那么在明知道事后还要填充内容的前提下,我们如何让纸张的使用具有合理性,我是在这个后面空出10行呢,还是20行呢,还是不空呢,如果不空的话显然后面要改动的地方就多了,但是具体空多少行我们又不知道。 那么解决方案来了, 我直接留出一页好了,不够再加一页呗,改页码还不容易。而且因为是全新的一页,你来写,我来写,他来写,都不需要原来的那张纸。
这和C#语言里面事件有毛关系啊? 有的, 事件就是贾宝玉死了,事件引发的问题,就是其他人的反应。 在其他页里面写,指的就是事件的订阅(订阅这个词用的很不好,会让人觉得主角是看报的人,其实不是),就是这件事发生了之后,需要执行的代码。不需要再原来的那张纸上写,说的就是不需要在原来的类里面写代码,可以在其他的类里面写代码,然后插入到事件的那个类里面。

下面以具体的代码来做解释:
代码博客来源

    class Program  // 红楼梦这部小说
    {
        static void Main(string[] args)
        {
            
            Judgment judgment = new Judgment(); //实例化对象,  相当于构建了一个贾宝玉这个人物
         
            RunSporters runsporter = new RunSporters(); //实例化对象,构建了薛宝钗、林黛玉等人
            // 贾宝玉死了,身边人什么反应?   在这边的+= 可以理解为,作者1写林黛玉哭了,加到这个事件的后面,  作者2写薛宝钗笑了,也加在这个后面,  可以理解为一个列表的append(),的功能,只是里面的元素是函数
            judgment.eventRun += new Judgment.delegateRun(runsporter.Run);
            judgment.eventRun += runsporter.RunFail; 

            judgment.Begin(); //执行,贾宝玉死了这段代码,  他会在里面依次执行后面的林黛玉和薛宝钗的代码

            Console.ReadKey();
        }
    }




    class Judgment  //写贾宝玉死了的那张纸
    {

        public delegate void delegateRun();


        public event delegateRun eventRun;


        public void Begin() // 贾宝玉死了
        {
            if (eventRun != null)  // 判断身边有没有人
            {
                //被引发的事件
                eventRun(); //有人的话,他们各自的反应,可以理解为,这个事件是一个列表,里面的元素是不同的函数,这个语句执行的时候,会依次把里面的函数都调用一遍,就是把代码都跑一边
            }

        }
    }


    public class RunSporters  // 写身边人反应的那张纸
    {
        //事件处理程序
        public void Run()   //林黛玉哭了
        {
            Console.WriteLine("林黛玉哭了");
        }

        //事件处理程序
        public void RunFail()  //薛宝钗笑了
        {
            Console.WriteLine("薛宝钗笑了");
        }
    }

update

  1. 把事件变量称之为 插入函数列表 更容易理解和操作。 就是把想要运行的代码加到这个列表里面。从代码的语法上也说的过去 。 添加列表函数元素的操作 为 函数列表+= 函数
    ,删除函数的操作为 函数列表-=函数。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值