C#中delegate的机制原理

来源:互联网 发布:所罗门矩阵刘少丹违法 编辑:程序博客网 时间:2024/06/01 18:49
C#下的关键字delegate实际上是告诉编译器生成一个继承自MulticastDelegate的密封类。而该类的主要职责是创建函数的回调环境。

而生成的密封类定义如下:
namespace DefineNameSpace{public delegate string DefineDelegate(bool a, bool b, bool c);public class OtherClassOne{     public DefineDelegate myDelegate;}public class OtherClassTwo{}}

编译器实际会生成:
namespace DefineNameSpace{public sealed class DefineDelegate :System.MulticastDelegate{     public  string  Invoke(bool a, bool b, bool c);     public  IAsyncResult BeginInvoke(bool a, bool b, bool c, AsyncCallback cb, object state);     public  string EndInvoce(IAsyncResult result);}public class OtherClassOne{     public DefineDelegate myDelegate;}public class OtherClassTwo{}}



另外,MulticastDelegate类和Delegate类的定义如下:
public abstract class MulticastDelegate : Delegate{      //添加到委托的方法列表      public sealed override Delegate[] GetInvactionList();           //重载操作符      public static bool operator == (MulticastDelegate d1, MulticastDelegate d2);      public static bool operator != (MulticastDelegate d1, MulticastDelegate d2);          //用来在内部管理委托所维护的方法列表     private IntPtr _invocationCount;     private object _invocationList;}

Delegate类的定义如下:
public abstract class Delegate : ICloneable, ISerializeable{       //与函数列表交互的方法       。。。Combine。。。       。。。Remove。。。       。。。RemoveAll。。。    //扩展委托目标的属性    public MethodInfo Method {get;}//反射,委托所维护的静态方法或实例方法的信息    public object Target {get;}//只有委托的方法定义在类实例时不为null,代表委托方法的对象。}


对委托 DefineDelegate 的说明:
  1. 声明一个委托,实际上是创建了一个类,这个类继承自MulticastDelegate。
  2. 需要使用委托,必须在某个类的内部顶一个一个该委托类的委托实例或委托对象。例如OtherClassOne里的实例定义:public DefineDelegate myDelegate;
  3. Invoke为同步调用方法。返回值与参数列表与用delegate关键字定义时一致。由于一个委托对象可以维护一个委托方法列表,并通过操作符+=进行添加,所以Invoke会依次调用添加到委托实例的方法列表。
  4. BeginInvoke和EndInvoke为一对操作,在对委托进行异步调用的时候使用。

对委托 DefineDelegate 异步调用的说明:

  1. 调用一个委托对象的BeginInvoke方法时,系统会为该对象创建一个工作线程,并在该线程内调用委托对象所维护的方法列表。
  2. 主调线程代码应该创建一个AsyncCallback的委托对象传递给BeginInvoke。如以下代码所示:
       
  private void someMethod()         {              ... ...               AsyncCallBack delegateCb = new AsyncCallback(this.invokeComplete);              string completeInfo = "delegate async handle over";              myDelegate.BeginInvoke(ParamsList..., delegateCb, completeInfo);//将会在另一个线程中进行处理              ... ...         }        private void invokeComplete(IAsyncResult result)       {             AsyncResult ar = (AsyncResult)result;             DefineDelegate tmpDelegate = (DefineDelegate)ar.AsyncDelegate;             string delegateResult = tmpDelegate.EndInvoke(result);//获取委托方法的处理结果             string completeInfo = (string)result.AsyncState;//传入BeginInvoke的state参数       }

        
         


















1 0
原创粉丝点击