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


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

    早就接触过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,不要以为很神奇,微软偷偷的给我们做了很多事情,只是我们不知道而已,他已经把这个方法绑定到他提供订阅的事件上去了,不信可以自己去看看

  • 相关阅读:
    记录下首次开通流量主,开心开心
    微信小程序之本地缓存
    在使用ef的情况下,有Migrations文件,想要直接生成数据库
    CSS 设置圆角div和阴影效果
    小程序UI库(UI组件)
    没有找到可以构建的 NPM 包---小程序开发
    php 接口参数对象转数组方法
    tp5框架获取随机n条
    php图片上传base64接口上传
    php如何实现定时任务,php定时任务方法,最佳解决方案,php自动任务处理
  • 原文地址:https://www.cnblogs.com/xinzhyu/p/1545630.html
Copyright © 2020-2023  润新知