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. 把事件变量称之为 插入函数列表 更容易理解和操作。 就是把想要运行的代码加到这个列表里面。从代码的语法上也说的过去 。 添加列表函数元素的操作 为 函数列表+= 函数
    ,删除函数的操作为 函数列表-=函数。

猜你喜欢

转载自blog.csdn.net/scy261983626/article/details/108267332