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

delegate void DL(int i);
上面是一个委托的定义,委托向外提供了一种回调函数的机制,在.net中的委托是类型安全的,一个委托能实现对一类方法的回调,这个统一是通过委托的参数和返回值来实现的。
上面代码如果用IL来解释,是这个样子
 
 
如果用C#来表示,一个委托就成了下面的代码
   class DL:System .MulticastDelegate
   {
       public DL(Object object,IntPtr method);
       public virtual void Invoke(Int32 i);
       public virtual IAsyncResult BeginInvoke(Int32 i,AsyncCallback callback,Object object);
       public virtual void EndInvoke(IAsyncResult result);    
   }
当然,上面代码是通不过编译的,只是对应IL代码的表现。
在上面的类中,有一个构造函数,和三个方法,同时还有三个继承至MulticastDelegate的三个非公有字段_target,_methodPtr,_invocationList。
在构造函数中有两个参数,第一个是object类型,这里指的是被回调方法的对象,如果该方法是静态的,那么这个值就是null,第二个参数是个IntPtr,这个参数是回调方法。并且在构造器中,会把object赋给_target,IntPtr赋给_methodPtr来保存。
另外一个字段_invocationList是一个存放回调方法的链表。
static void Main(string[] args)
        {
            Program p = new Program();
            DL dl = new DL(p.FF);
            dl += p.FF;
            dl += FF1;
            dl(1);
        }
        public static void FF1(int i)
        {
            Console.WriteLine("d");
        }
        public void FF(int i)
        {
            Console.WriteLine(DateTime .Now .ToString ());
        }
上面代码的+=的过程,其实就是向_invocationList添加委托的过程。
还有代码中,我们调用了dl(1),这个代码其实是dl.Invoke(1)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值