关于Delegate 和 MulticastDelegate的实现

在C#中,我们使用关键字delegate来定义委托,如:
  public delegate void MyDelegate(object obj, int x);
在进行编译时,以上的代码将产生一个类定义:
  public class MyDelegate : System.MulticastDelegate {
       public MyDelegate(Object target, IntPtr methodPtr);
       public void virtual Invoke(object obj, int x);     // 和委托中的参数一样.
       public virtual IAsyncResult BeginInvoke(object obj, int x, 
            AsyncCallback callback, object o);
       public virtual void  EndInvoke(IAsyncResult result);
 }
在以上代码中,构造函数中的参数:target 为对象实例的引用,methodPtr为用来标识回调方法。MulticastDelegate继承自Delegate,实际上
Delegate类有四个私有字段:
1、private Object _target;
2、private IntPtr _methodPtr;
3、private IntPtr _methodPtrAux;
4、private RuntimeMethodInfo _method;
其中_target是调用方法的对象实例的引用,如果调用方法是static的,那么就不存在对象实例的引用,这时target为null。_methodPtr是用来标识要调用的方法。
在上面的MyDelegate委托中,MyDelegate的构造构数就是将_taget和_methodPtr进行初始化。

而在MulticastDelegate类中,增加了一个私有字段:private MulticastDelegate _prev;这个_prev字段指向的是一个MulticastDelegate类型的引用,也就是说利用指向另一个MutlicastDelegate类型的_prev字段来组成一个委托链表。
如果要向委托链表中增加和删除委托,C#中使用以下语法实现:
 MyDelegate myDelegate = new MyDelegate(DelegateMethod1);
 myDelegate += new MyDelegate(DelegateMethod2); //添加(Delegate.Combine)
myDelegate -= new MyDelegate(DelegateMethod2); // 删除(Delegate.Remove)

在新增一个委托到委托链表时,MyDelegate类的构造函数将调用基类MulticastDelegate的构造函数,将字段_target 和 _methodPtr初始化,并将MulticastDelegate的_prev字段初始化为null.在调用Remove方法时,它也会构造一个MyDelegate的实例,也会初始化基类的_target、_methodPtr、和_prev字段。构造完后,Remove方法会先扫描委托链表,如发现有和新创建的委托对象相等的委托对象,则将它从链表中删除,如没有找到,则不作做任何操作。

  问题是那么_method和_methodPtrAux有何作用呢?72_72.gif

转载于:https://www.cnblogs.com/afxucamd/archive/2004/02/17/1306.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值