Mydelegate m_delegate;//申明一个委托
event MyDelegate m_myevent;//申明一个事件
很像吧!不是吗?
OK,我们再来看,m_myevent 与m_delegate到底有什么不同的?也就是,事件(非凡委托)到底非凡在什么地方?
1、事件不是一个可以直接把函数当值一样赋给它的委托。而委托可以直接赋函数,而且是在实例化的时候,赋函数名。
2、事件只能把一个实例的委托当值赋给它。也就是说:事件是用来治理委托的,进而来治理函数!因为一个实例化的委托一定有一个函数与之对应。
3、在事件上可以动态的添加与删除委托。而委托上不能动态的添加删除函数。
OK,下面的一个问题,上面事件的申明中,MyDelegate是起什么作用的呢?
还记得前面的委托申明吗?它就是说明了m_myevent在运行时可以动态的以委托的形式赋的函数要与MyDelegate申明的一样!
因此上面的一个实例化是完全合法的。
再理解一下:事件,是用来动态治理委托的,而委托是单一的与一个函数对应的。
现在看第二个问题,运行时,如何知道该“非凡委托”是否已经被赋过函数值?及如何再赋值?
即:如何知道一个事件上已经赋过经过委托过的函数?
前面已经说过,m_myevent没有给它赋值,如何给它赋值呢?它的赋值方法有点怪:
一个实例:
m_myevent = m_delegate;
有点怪吧!这里正好说明了:事件是用来动态治理委托的。把一个委托加在事件上。
当然,你还可以在添加委托的时候直接new一个新的委托:
m_myevent =new MyDelegate(Class1_m_myevent);//后面的函数名由vs2003生动生成
这就是.net下标准的给事件添加委托的方法,也就是给一个事件添加了一个可调用的函数。确切的说,是一个回调函数(C++的概念)。
OK,下面就如何判定一个事件上是否已经被赋过经过委托的函数:
if(m_myevent==null)
就可以知道了!
那么如何知道一个事件上面有多少个委托呢?也就是多少个委托过的函数?
m_ myevent.GetInvocationList();
可以得到所有的委托!这里应该知道:事件本身是一个对象,当实例化一个事件后,它是有自己的一些方法也成员的。可以查阅MSDN得到更多说明,同样的委托也是一个对象,相关的说明也可以在MSDN里找到。
最后的问题:如何删除一个已经添加在事件上的委托?
太轻易而且太有意思了:
m_myevent -= m_delegate;
那么这样的几个问题又来了:
1.假如这个事件上没有该委托,“减掉”以后会出错吗?不会,放心的减吧。
2.如何调用这个事件上的委托呢?上面有多个委托,它是怎样运行呢?
调用事件上的委托与调用委托上的函数是完全一样的:你要给出与委托申明一样的函数参数,并且调用会返回与申明一样的数据类型。
最后再回来看这个问题:
object m_obj = m_isRight?MyWrite("true"):MyWrite("false");
如何解决它呢?把一个函数赋给一个对象:一个例示(仅做演示解决这个问题,个人认为这样的做法没有实用意义)
using System;
namespace ConsoleApplication1
{
public class Class4
{
event System.EventHandler m_obj;
public Class4()
{
System.EventHandler m_f1 = new EventHandler(SomeFunc1);
System.EventHandler m_f2 = new EventHandler(SomeFunc2);
bool m_someCondition = false;
m_obj = m_someCondition?m_f1:m_f1;
m_obj(this,null);
}
private void SomeFunc1(object sender, EventArgs args)
评论加载中…
![]() |