(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) { }