zoukankan      html  css  js  c++  java
  • 事件与委托的一点概念理解

    事件与委托的一点概念理解

    早就接触过delegate和event,但是始终是一知半解,今天刚好有机会就好好研究一下!

        Delegate 顾名思义就是委托,委托的意思就是麻烦别人帮我干些事情.比如,我要看场足球比赛凌晨3点开始,但是现在才晚上10点,我准备睡一会,为了不错过比赛,我就给准备通宵打游戏的同学说声,凌晨3点一到就开始叫我起床.在这里同学会叫我起床,是我委托给同学的事情,而触发这个事情的因素就是到了凌晨3点.

        就是需要以下几个条件:

    1. 有一个可以接受我请求的事件(我要订阅这个事件)
    2. 事件发生了,就触发我的委托

    关于委托和时间定义在哪个类内,是同学的类里,还是我的类里.这里想一下,我们每个人都可以帮别人做点事情,就是我们可以接受别人的委托,如果我们不接受别人的委托,那就不帮他办事情,所以这个委托应该是在帮别人做事情的人体内,就是我同学的体内.同样,他既然愿意帮我干事情,那他就要知道在什么时候干事情了,这里他也要提供一个事件.

    class Program

    {

    static void Main(string[] args)

    {

    Me m = new Me();

    StudentA a = new StudentA();

    a.Time += m.WakeUp;

    a.Play();

    Console.ReadLine();

    }

    }

    ///<summary>

    /// 同学A(他很牛,他只干他愿意干的事情)

    ///</summary>

    public class StudentA

    {

            //委托约定,只帮别人干不带参数无返回值的事情

    public delegate void WakeUpEventHandle();

            

            //提供供别人订阅的事件,但是要满足我上面的那个约定才行

    public event WakeUpEventHandle Time;

    public void Play()

    {

    for (int i = 1; i <= 24; i++)

    {

    Console.WriteLine("{0}点在打游戏",i);

    //到3点的时候,才看有没别人委托我干事情

    if (i == 3)

    {

    //如果有事情就做

    if (Time != null)

    Time();

    }

    }

    }

    }

    ///<summary>

    ///

    ///</summary>

    public class Me

    {

    public void WakeUp()

    {

    Console.WriteLine("该起床看球赛啦~");

    }

    }

    这里有几个还不太容易理解的地方,我重点说下:

    1. 我以前的想法是,这样不是很麻烦吗,我直接在同学A的体内写个判断语句,i==3的时候就执行me.WakeUp(),不久可以了吗?

      确实很多情况下,我们也是这么做的.其他的先不说,首先要求的就是这2个class,都是你拥有绝对控制权的,你可以任意更改.但是有些情况下是不可以的.比如你在调用一个第三方的控件,你希望他在一些特别情况下,能按你的要求做一些事情.这时你就不能直接去修改他的代码了.所以只有他提供一些委托和时间给我们,我们来调用才可以.

    2. 非要i==3的时候,他才能看看有没什么事情要做吗,不能改成4点,5点什么的?

      同样,这个事情是那个同学答应3点的时候干些事情,他不乐意4点5点干事情,那就没办法了.他不提供这样的服务.

    也就是说我这个同学,只接受3点的时候帮别人干些事情,其他时间他要打游戏不让我们烦他.

    这个同学就提供了一个事件,将会在3点的时候去看看有没别人委托他干的事情.同样他也不是什么事情都干的,他有要求的必须是没有参数的无返回值的事情他才干,就是void WakeUpEventHandle()了.我们要他干的事情必须满足这约定!

    这个最常用到的就是,我们做页面上面放一个按钮,一点这个就会执行方法比如btnAction_Click,不要以为很神奇,微软偷偷的给我们做了很多事情,只是我们不知道而已,他已经把这个方法绑定到他提供订阅的事件上去了,不信可以自己去看看

  • 相关阅读:
    LAMP----linux+apache+mysql+php详细安装步骤之一APACHE篇(openldap等)
    Apache2 httpd.conf 配置详解
    Apache+php+mysql的安装与配置
    linux PHP 安装及 GD库安装
    Linux下安装PHP的GD支持库
    linux下tar.gz、tar、bz2、zip等解压缩、压缩命令
    Android中Context详解 ---- 你所不知道的Context(转)
    Android简单文件浏览器源代码 (转)
    Android入门之文件系统操作(一)简单的文件浏览器 (转)
    Android入门之文件系统操作
  • 原文地址:https://www.cnblogs.com/xinzhyu/p/1545630.html
Copyright © 2011-2022 走看看