一:前言

本小节,我们需要停一停我们的小游戏开发,虽然它现在还不完美,还很简单,甚至还有BUG。但是,为了更好的理解C#,现在到了该深入了解一些基础知识的时候了。

当然,实际上,本小节内容对于零基础入门的初学者来说,还是有点难了。委托与事件,如果只是泛泛的说一下,可能就是一两句话。但是,我们的课程要遵循一个原则:知其然,知其所以然。所以,本小节的内容实际上有点多,但是我希望大家细细品味,争取彻底消化委托和事件这两个概念。

同时,本课程还要教会大家使用一个工具,分析代码。

二:委托的现实场景:卖家委托快递去送货?

任何事情,首先都要问一个为什么。这里的问题是:为什么卖家要委托快递去送货?

因为他干不了。他在北京卖一个壶到上海,他不应该、也没能力自己跑到上海交给人家。所以他要“委托”给别人来做这件事情。

在代码的世界中,也是这样,我们的打老鼠游戏中,现在所有的逻辑代码都在窗体的后台中,随着我们学习面向对象,对代码进行重构之后,业务逻辑代码就会放到别的类中,这个“别的类”要负责“游戏开始”的逻辑,其中“游戏开始”的逻辑中有一个环节就是要在界面上显示”游戏开始“。因为业务类不拥有窗体,所以它就不能显示“游戏开始”,这个时候“委托”就派上用场了。也就是业务类不应该、也没能力直接对窗体显示“游戏开始”,于是,它“委托”窗体显示“游戏开始”。

三:委托是什么?

我们还是先回到卖家卖壶的例子来描述:“委托是什么”。实际上,卖家委托快递送货,需要如下一些代码:

“委托是什么”这个问题是表象,实际上它还隐藏着5个小问题:

1:委托声明是什么?

2:委托变量是什么?

3:什么是委托变量赋值?

4:什么是委托处理器?

5:如何调用委托?

在上图代码中,这5个小问题的序号正好对应了图中的数字部分,

首先,程序得有一个地方声明委托;

其次,卖家自己还得定义一个委托变量;

再次,通过某种形式给卖家的委托变量赋值,这个值是什么呢,就是一个委托处理器的“引用”。委托处理器就是一个方法,所以,赋值的过程,就是将方法的引用赋值给委托变量。

最后,调用委托,实际上,就是使用委托变量。

备注,要注意的是,委托声明和委托处理器的返回值和参数必须保持一致。

四:委托本质上是什么?

上文我们阐述了委托是什么,实际我们仅仅阐述的是委托的表象是什么,那么,委托本质上是什么呢?

到现在为止,我们已经学过了两个类型的概念:类和枚举。我们在这里要强调的是,上文代码的委托声明中的”SendProductHandler“实际上,是一个类,我们应该将其看为:

internal class SendProductHandler : System.MulticastDelegate
    {
        public SendProductHandler(object @object, IntPtr method)
        {
        }

public virtual IAsyncResult BeginInvoke(string product, AsyncCallback callback, object @object)
        {
        }

public virtual void EndInvoke(IAsyncResult result)
        {
        }

public virtual void Invoke(string product)
        {
        }
    }

为什么是这样的呢,相信你看了下面的视频就会明白。

五:视频

非公开部分,请联系最课程(www.zuikc.com)观看。

六:事件是什么?

知道了委托,我们来看事件,将小节”二:委托是什么“中的代码2和3处,修改为:

“委托”就变成“事件”了。

使用事件后,你可以为你的委托变量_sendProduct,增加多个方法,你看,代码中的位置3处,不再是个“=”号,而是一个“+=”号了。

.NET零基础入门05:委托与事件的更多相关文章

  1. 080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则

    080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则 本文知识点:单一职责原则 说明:因为时间紧张,本人写博客过程中只是 ...

  2. 073 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 05 综合案例-数组移位-主方法功能1和2的实现

    073 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 05 综合案例-数组移位-主方法功能1和2的实现 本文知识点:综合案例-数组移位-主方法功能1和2的实现 说 ...

  3. 067 01 Android 零基础入门 01 Java基础语法 08 Java方法 05 数组作为方法参数

    067 01 Android 零基础入门 01 Java基础语法 08 Java方法 05 数组作为方法参数 本文知识点:数组作为方法参数 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  4. 058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值

    058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值 本文知识点:求数组元素的最大值 案例:求数组元素的最大值 程序代码及其执行过程 ...

  5. 053 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 15 流程控制知识总结

    053 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 15 流程控制知识总结 本文知识点: 流程控制知识总结 流程控制知识总结 选择结构语句 循环结构语句 ...

  6. 052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序

    052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试--debug2 多断点调试程序 本文知识点: Eclipse下程序调 ...

  7. 051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试--debug入门1 本文知识点: 程序调试--debug入门1 程序 ...

  8. 050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句

    050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句 本文知识点:continue语句 continue语句 continue ...

  9. 049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句

    049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句 本文知识点:break语句 break语句 break语句前情回顾 1.swi ...

随机推荐

  1. 洛谷P2017 [USACO09DEC]晕牛Dizzy Cows [拓扑排序]

    题目传送门 晕牛Dizzy Cows 题目背景 Hzwer 神犇最近又征服了一个国家,然后接下来却也遇见了一个难题. 题目描述 The cows have taken to racing each o ...

  2. 011.Zabbix的拓扑创建

    一 Map简介 Map的作用是将各种设备用网络拓扑图的方式展示,在Zabbix中,拓扑的展示通过手动方式添加. 二 Map的添加 2.1 添加Map的背景图 #在添加Map之前可谓Map添加一个背景图 ...

  3. 那些年我们踩过的坑之表单reset

    开发者往往是在一个又一个的坑中成长起来的,自学的开发者尤其如此,刚刚填完一个坑,转身又掉进另一个坑.有些坑很容易就跳出来了,也有些坑能整了一天都没头绪,第二天早上一来发现后面就有一架通往坑外的梯子,坑 ...

  4. UICollectionView 常用操作

    1 iOS开发 - UICollectionView点击展开收起

  5. bzoj 2753: [SCOI2012]滑雪与时间胶囊 -- 最小生成树

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MB Description a180285非常喜欢滑雪.他来到一座雪山,这 ...

  6. 一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?

    分为4个步骤: 1)  当发送一个 URL 请求时,不管这个 URL 是 Web 页面的 URL 还是 Web 页面上每个资源的 URL,浏览器都会开启一个线程来处理这个请求,同时在远程 DNS 服务 ...

  7. mysql|表row_format的静态与动态,Compact

    innodb 一般对应 Compact  ,MyISAM 一般对应静态与动态 mysql中若一张表里面存在varchar.text以及其变形.blob以及其变形的字段的话,那么这个表其实也叫动态表,即 ...

  8. 何时调用C++复制构造函数和拷贝构造函数(转)

    1. 何时调用复制构造函数 复制构造函数用于将一个对象复制到新创建的对象中.也就是说,它用于初始化过程中,而不是常规的赋值过程中.类的复制构造函数原型通常如下: class_name(const cl ...

  9. mui选择器和dom获取元素的区别(记得把mui对象转为dom对象才能调用用dom方法)

    <!DOCTYPE html><html> <head><meta charset="UTF-8"><meta name=&q ...

  10. 阿里云esc云服务器IP不能访问的解决办法

    问题:阿里云服务器,专有网络,web设置完毕,在服务器中localhost能够访问,并且关闭防火墙,但是使用公网ip无法访问. 解决:找到本实例安全组,配置规则,按照要求填入80或其他端口.配置完成后 ...