C#中委托和方法学习心得

来源:互联网 发布:免费淘宝装修生成 编辑:程序博客网 时间:2024/05/16 08:54

                最近一直在回想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++中的函数指针是一样的,可以类比的这样去想。而后来的所谓订阅者和发布者机制

也是基于此原理的。


2 0