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

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

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

原文地址:https://www.cnblogs.com/xinzhyu/p/1545630.html