您的位置:首页 > 其它

.net知识和学习方法系列(二十)CLR-委托

2008-09-29 12:59 501 查看
[align=left]delegate void DL(int i);[/align]
[align=left]上面是一个委托的定义,委托向外提供了一种回调函数的机制,在.net中的委托是类型安全的,一个委托能实现对一类方法的回调,这个统一是通过委托的参数和返回值来实现的。[/align]
[align=left]上面代码如果用IL来解释,是这个样子[/align]
[align=left] [/align]
[align=left][/align]
[align=left] [/align]



[align=left]如果用C#来表示,一个委托就成了下面的代码[/align]
[align=left] class DL:System .MulticastDelegate[/align]
[align=left] {[/align]
[align=left] public DL(Object object,IntPtr method);[/align]
[align=left] public virtual void Invoke(Int32 i);[/align]
[align=left] public virtual IAsyncResult BeginInvoke(Int32 i,AsyncCallback callback,Object object);[/align]
[align=left] public virtual void EndInvoke(IAsyncResult result); [/align]
[align=left] }[/align]
[align=left]当然,上面代码是通不过编译的,只是对应IL代码的表现。[/align]
[align=left]在上面的类中,有一个构造函数,和三个方法,同时还有三个继承至MulticastDelegate的三个非公有字段_target,_methodPtr,_invocationList。[/align]
[align=left]在构造函数中有两个参数,第一个是object类型,这里指的是被回调方法的对象,如果该方法是静态的,那么这个值就是null,第二个参数是个IntPtr,这个参数是回调方法。并且在构造器中,会把object赋给_target,IntPtr赋给_methodPtr来保存。[/align]
[align=left]另外一个字段_invocationList是一个存放回调方法的链表。[/align]
[align=left]static void Main(string[] args)[/align]
[align=left] {[/align]
[align=left] Program p = new Program();[/align]
[align=left] DL dl = new DL(p.FF);[/align]
[align=left] dl += p.FF;[/align]
[align=left] dl += FF1;[/align]
[align=left] dl(1);[/align]
[align=left] }[/align]
[align=left] public static void FF1(int i)[/align]
[align=left] {[/align]
[align=left] Console.WriteLine("d");[/align]
[align=left] }[/align]
[align=left] public void FF(int i)[/align]
[align=left] {[/align]
[align=left] Console.WriteLine(DateTime .Now .ToString ());[/align]
[align=left] }[/align]
[align=left]上面代码的+=的过程,其实就是向_invocationList添加委托的过程。[/align]
[align=left]还有代码中,我们调用了dl(1),这个代码其实是dl.Invoke(1)。[/align]
[align=left]后两个方法的使用,可参看/article/5096034.html。[/align]本文出自 “桂素伟” 博客,请务必保留此出处http://axzxs.blog.51cto.com/730810/149959
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: