• C# 在线培训之零基础入门 05:委托与事件


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

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

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

    备注:本文是课程《.NET C# 零基础入门》的免费部分,详细请参见TMJ .NET在线培训

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

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

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

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

    二:委托是什么?

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

    image

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

    1:委托声明是什么?

    2:委托变量是什么?

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

    4:什么是委托处理器?

    5:如何调用委托?

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

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

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

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

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

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

    三:委托本质上是什么?

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

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

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

            public virtual IAsyncResult BeginInvoke(int progress, AsyncCallback callback, object @object)
            {
            }

            public virtual void EndInvoke(IAsyncResult result)
            {
            }

            public virtual void Invoke(string product)
            {
            }
        }

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

    Lesson5.wmv(我已在线发送给你)。

    四:事件是什么?

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

    image

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

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

    TMJ .NET在线培训”本节知识点:

    1:委托;

    2:事件;

    3:快速打开文件所在的硬盘位置;

    4:什么是IL中间语言(视频教学文件中);

    5:如何查看IL语言(视频教学文件中);

    6:委托的本质;

    --------------------------------------

    欢迎您,进入 我系程序猿 的cnBlog博客。

    你不能改变你的过去,但你可以让你的未来变得更美好。一旦时间浪费了,生命就浪费了。

    You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.

    --------------------------------------

    分享到QQ空间  

  • 相关阅读:
    用mobiscroll.js如何简单使用日期控件
    Easyui的datagrid的行编辑器Editor中添加事件(修改某个单元格带出其他单元格的值)
    运行网站项目时,有时出现Bad Request,该怎么解决?
    Easyui的datagrid的editor(行编辑器)如何扩展datetimebox类型
    JQuery对象和DOM对象的区别与转换
    【转发】Cookie存储的值大小限制和个数问题
    【转发】centos 7开启FTP以及添加用户配置权限,只允许访问自身目录,不能跳转根目录
    Vim 保存和退出命令
    CentOS下防御或减轻DDoS攻击方法(转)
    CentOS 7 firewalld vsftpd开放端口
  • 原文地址:https://www.cnblogs.com/jqmtony/p/2910838.html
Copyright © 2020-2023  润新知