事件,这个大家都非常熟悉的名词,代码里几乎离不开它。但是我们平时都是用现成的事件,如果满足不了我们的需求怎么办?那就只能咱自己写了,那么问题就来了,如何自定义事件呢?
在这之前,我们就必须先了解事件与委托的干系是什么,只有弄清楚事物的本质,我们才能掌握住事物的灵魂。
我们先看看最常用的一个事件: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)简介”。