事件与委托的一点概念理解
早就接触过delegate和event,但是始终是一知半解,今天刚好有机会就好好研究一下!
Delegate 顾名思义就是委托,委托的意思就是麻烦别人帮我干些事情.比如,我要看场足球比赛凌晨3点开始,但是现在才晚上10点,我准备睡一会,为了不错过比赛,我就给准备通宵打游戏的同学说声,凌晨3点一到就开始叫我起床.在这里同学会叫我起床,是我委托给同学的事情,而触发这个事情的因素就是到了凌晨3点.
就是需要以下几个条件:
- 有一个可以接受我请求的事件(我要订阅这个事件)
- 事件发生了,就触发我的委托
关于委托和时间定义在哪个类内,是同学的类里,还是我的类里.这里想一下,我们每个人都可以帮别人做点事情,就是我们可以接受别人的委托,如果我们不接受别人的委托,那就不帮他办事情,所以这个委托应该是在帮别人做事情的人体内,就是我同学的体内.同样,他既然愿意帮我干事情,那他就要知道在什么时候干事情了,这里他也要提供一个事件.
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("该起床看球赛啦~");
}
}
这里有几个还不太容易理解的地方,我重点说下:
-
我以前的想法是,这样不是很麻烦吗,我直接在同学A的体内写个判断语句,i==3的时候就执行me.WakeUp(),不久可以了吗?
确实很多情况下,我们也是这么做的.其他的先不说,首先要求的就是这2个class,都是你拥有绝对控制权的,你可以任意更改.但是有些情况下是不可以的.比如你在调用一个第三方的控件,你希望他在一些特别情况下,能按你的要求做一些事情.这时你就不能直接去修改他的代码了.所以只有他提供一些委托和时间给我们,我们来调用才可以.
-
非要i==3的时候,他才能看看有没什么事情要做吗,不能改成4点,5点什么的?
同样,这个事情是那个同学答应3点的时候干些事情,他不乐意4点5点干事情,那就没办法了.他不提供这样的服务.
也就是说我这个同学,只接受3点的时候帮别人干些事情,其他时间他要打游戏不让我们烦他.
这个同学就提供了一个事件,将会在3点的时候去看看有没别人委托他干的事情.同样他也不是什么事情都干的,他有要求的必须是没有参数的无返回值的事情他才干,就是void WakeUpEventHandle()了.我们要他干的事情必须满足这约定!
这个最常用到的就是,我们做页面上面放一个按钮,一点这个就会执行方法比如btnAction_Click,不要以为很神奇,微软偷偷的给我们做了很多事情,只是我们不知道而已,他已经把这个方法绑定到他提供订阅的事件上去了,不信可以自己去看看