.NET零基础入门05:委托与事件

简介:

一:前言

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

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

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

 

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

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

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

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

 

三:委托是什么?

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

wps_clip_image-27023

“委托是什么”这个问题是表象,实际上它还隐藏着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处,修改为:

wps_clip_image-27310

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

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


本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/p/4352981.html,如需转载请自行联系原作者

相关文章
|
数据中心
Google Earth Engine(GEE)最全632个数据集在哪里找?文章末含名称!
Google Earth Engine(GEE)最全632个数据集在哪里找?文章末含名称!
978 0
Google Earth Engine(GEE)最全632个数据集在哪里找?文章末含名称!
|
JavaScript 前端开发 Go
【智能合约】Go语言调用以太坊 | geth
目录 1. geth 简介 1.1 下载地址: 1.2 安装: 1.3 查看是否安装成功 2. geth命令介绍 3. geth常用命令 3.1 指定数据目录 --datadir 3.2 账户相关 3.3 控制台console: 3.4 删除数据: 3.5 help 3.6 常见错误 4. Go语言调用合约 4.1 启动rpc端口 4.2 Go调用以太坊 4.3 调用接口 net_version net_listening net_peerCount eth接口 personal接口 db接口 最后
1247 0
【智能合约】Go语言调用以太坊 | geth
|
机器学习/深度学习 移动开发 数据挖掘
如何用CSharpOpenCv集成Yolov3的模型
如何用CSharpOpenCv集成Yolov3的模型
458 0
如何用CSharpOpenCv集成Yolov3的模型
|
存储 Python
【Python 基础教程】彻底解决python round函数的四舍五入不精确的问题
【Python 基础教程】彻底解决python round函数的四舍五入不精确的问题
【Python 基础教程】彻底解决python round函数的四舍五入不精确的问题
|
安全 Java 调度
Python 异步多线程协程初探
Python 异步多线程协程初探
434 0
Python 异步多线程协程初探
|
机器学习/深度学习 存储 分布式计算
从Hadoop1.0到Hadoop2.0架构的优化和发展探索详解
从Hadoop1.0到Hadoop2.0架构的优化和发展探索详解
671 0
从Hadoop1.0到Hadoop2.0架构的优化和发展探索详解
|
Linux iOS开发 Windows
iphone14手机投屏到mac电脑最新教程
AirServer 是我最早接触到的 iOS 投电脑的软件。现在 AirServer 产品线已经丰富到“吓人”的地步,包含了投屏电脑(Windows、Surface、Mac)、游戏机(XBox)、电视(PhilipsTV)、嵌入式Linux设备对应版本的应用,甚至还提供了类似盒子 / AppleTV 的硬件解决方案 AirServer Connect。
767 0
|
Web App开发 安全
利用chrome进行阿里云多工作环境切换
场景:境外银行作为第一家云上银行,不同区域和环境采用阿里云主账号进行隔离,不同的子账号登录态无法共存或者切换,工作中需要频繁进行工作环境切换时就需要先退出再重新登录,非常繁琐,且容易造成混乱,引起不必要的误操作问题。经安全大佬 @先本 指导,利用chrome的多身份功能,完美解决~分享给大家,希望可以帮助大家提高工作效率启用chrome多身份:1、打开chrome浏览器,点击用户头像,点击添加按钮
648 0
|
人工智能 物联网 云计算
Gartner发布了最新全球物联网竞争报告,阿里云等10家企业最具竞争力
近日,知名调研机构Gartner发布最新全球物联网平台竞争格局报告,阿里云入选全球最具竞争力的10家企业之一。可以说,全球物联网市场格局延续了云计算3A(AWS、Azure 和阿里云)的鼎立之势
1048 1
Gartner发布了最新全球物联网竞争报告,阿里云等10家企业最具竞争力
|
消息中间件 SQL 缓存
2万字聊聊什么是秒杀系统(中)
大家好,我是Leo 之前我们介绍了秒杀系统的五大原则,动静分离方案,二八原则,冷热处理的一些理论方案。今天我们接着上一篇,继续介绍一下大并发流量打过来之后,我们如何做一些削峰处理以及服务端的一些优化技巧。
2万字聊聊什么是秒杀系统(中)