最近一直在回想C#中的委托和事件机制,突然觉得其实C#中的委托和时间机制其实真的和C++中的函数指针就是一样一样,可能因为
C#中没有指针所以就弄出了支持委托和事件的机制。C#中它将方法做为特殊的对象进行封装起来,从而实现了将方法名做为变量来使用和进行赋值
操作,C#中定义“函数指针”要用delegate关键字进行修饰。之后就可以直接可以用“函数指针”定义对象或者对象数组并进行赋值,赋值操作完成后就可以直接做为
相应的函数名使用,例如:
----------------------------YYC
public delegate int Func();
static int fun1()
{
return 1;
}
static int fun2()
{
return 2;
}
Func fc;
fc = fun1;
MessageBox.Show("fun1: "+ fc());//输出1
fc = fun2;
MessageBox.Show("fun2: "+ fc());//输出2
其中C#对委托对象估计采用的是一种队列的储存结构,所以委托对象是可以进行加减操作的,
例如:
public delegate int Func();
static int fun1()
{
MessageBox.Show("fun1:");
return 1;
}
static int fun2()
{
MessageBox.Show("fun2:");
return 2;
}
Func fc;
fc = (Func )fun1 + (Func)fun2 ;
fc();
当此时再调用fc()函数fun1()和函数fun2()都会被依据加载的顺序被执行一遍。
但此时应当注意由于委托对象可以进行加减操作,所以再使用任何一个异常是应当先判断该委托是否为空.
当然C#中除了委托外其次很重要的另外一个机制就是事件及事件的发布。C#中出现事件类型的主要目的是由于为了
防止程序员的疏忽或恶意使用=直接再给对托类型对象赋值,从而破坏委托的加载,所以就出现了在使用函数指针定
义对象时要用event关键字进行修饰。
同时在C#的时间发布和订阅过程中为了减少做重复性的工作和提高效率,C#已经为我们定义好了EventHandler委托类型
publuc delegate void EventHandler(oblect sender ,EventArgs e);
其中object类是所有类的基类,用来传递引发事件的对象即为发布者,如果发布者为静态类,则直接传递null即可。一般在发布者类中直接使用this即可。
要注意此时传输时是属于数据的装箱操作,接收该对象后还要进行相应的拆箱操作。
EventArgs时间数据类,主要用于传递事件数据,只要该数据继承了EventArgs即可传输。
总之说白了C#中的委托机制就是和C++中的函数指针是一样的,可以类比的这样去想。而后来的所谓订阅者和发布者机制
也是基于此原理的。