Welcome 微信登录

首页 / 网页编程 / ASP.NET / Mcad学习笔记之委托再理解

Mcad学习笔记之委托再理解2012-01-22 博客园 aierong(delegate的构造器,MulticastDelegate,BeginInvoke,EndInvoke,Invoke4个方法的探讨)

先定义一个委托如下:

public delegate void myEventHandler(int i,out string o);

再用MSIL反汇编程序(Ildasm.exe)来观看反汇编代码

其实CLR为我们做了4件事情

1.定义一个构造器

2.定义一个虚方法BeginInvoke

3.定义一个虚方法EndInvoke

4.定义一个虚方法Invoke

(1)在反汇编代码中我看到如下片断:

.class auto ansi sealed nested public myEventHandler    extends [mscorlib]System.MulticastDelegate{} // end of class myEventHandler
由此可以知道其实我们声明的委托myEventHandler就是一个密封类

它的父类是System.MulticastDelegate

看到这里,我的一个疑惑被解除了

以前我也自己定义过委托,总是感觉好像在程序中到处都可以定义委托,在类里面和类的外部都可以定义,一直不知道为什么?

现在我基本明白了,其实委托是一个类,类可以在哪里定义,委托就可以在哪里定义。

(2)我们现在再来看看构造器

在这之前,有必要搞清楚委托的继承关系

System.Delegate

---System.MulticastDelegate

------ConsoleApplication1.myEventHandler

现在我们实例化一个委托:

myEventHandler my=new myEventHandler(staticCall);

实际上它是在调用这个委托的构造器

下面的是这个构造器的代码:

public myEventHandler(object @object, IntPtr method);

第一个参数应该是类实例的实例

第二个参数应该是委托的方法信息

这个构造器会再调用它父类的构造器,父类构造器代码如下:

protected MulticastDelegate(object target, string method) : base(target, method){}