利用委托自定义事件

事件,这个大家都非常熟悉的名词,代码里几乎离不开它。但是我们平时都是用现成的事件,如果满足不了我们的需求怎么办?那就只能咱自己写了,那么问题就来了,如何自定义事件呢?

在这之前,我们就必须先了解事件与委托的干系是什么,只有弄清楚事物的本质,我们才能掌握住事物的灵魂。

 

我们先看看最常用的一个事件:Form_Load()

public Form1()

{

    InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

    MessageBox.Show("窗体加载了");

}

这个事件平时是自动发生的,那么我们现在来手动发生这个事件,来研究一下事件的底层。

 

public Form1()

{

    InitializeComponent();

   this.Load += new EventHandler(form_load);

}

public void form_load(object sender, EventArgs e)

{

    MessageBox.Show("窗体加载了");

}

this.Load其实.net还是为你自动封装了,那么我们进一步手动发生这个事件。

 

public event EventHandler load;

public Form1()

{

    InitializeComponent();

   load += new EventHandler(form_load);

   load(this,new EventArgs());

}

public void form_load(object sender, EventArgs e)

{

    MessageBox.Show("窗体加载了");

}

那么到这里是不是就完了呢?不知道有没有人问,form_load的方法还是很像Form1_Load,那个要是自己定义的话,那才叫完全的手动实现呢。那么我们接着往下看:

 

private delegate void FormLoadEvent(string msg);

private event FormLoadEvent load;

public Form1()

{

    InitializeComponent();

   load += new FormLoadEvent(form_load);

   load("窗体加载了");

}

public void form_load(string msg)

{

    MessageBox.Show(msg);

}

这下终于明白事件的本质了吧,事件是委托的最终表现形式,也就是说事件就是委托的一种高级用法,事件就是利用委托实现的。

 

但是事件和委托还有一定区别,委托是一个类,而事件是依赖于类的,所以委托可以声明在类的外面,而事件必须写在类的里面。

事件必须建立在委托的基础上才能得以实现,即先声明委托再定义事件,所以格式一般比较固定,例如:

private delegate void FormLoadEvent(string msg);

private event FormLoadEvent load;

由于事件是可连续触发的,所以对于事件的赋值要采用“+=”和“-=”运算,“+=”代表累积事件,“-=”代表移除某一事件,例如:

load += new FormLoadEvent(form_load);

在实例化委托【new FormLoadEvent】时把form_load当做参数写入。这样就将事件与自己写的方法进行了关联。

 

这里就为大家介绍了利用委托自定义事件的基础了,只要理解到位,日后熟能生巧,再遇上复杂的事件代码相信也会迎刃而解!但要想很好的掌握自定义事件,就必须先学好委托,关于委托的介绍,可以参见我的博文“委托(Delegate)简介”。

原文地址:https://www.cnblogs.com/opop/p/5276544.html