委托

来源:互联网 发布:知乎日报 api 编辑:程序博客网 时间:2024/05/16 07:31

我们先像我们常规的去编写一段代码(我们就从这代码也能体现出委托的作用)

       //------------------先定义一个委托类型-------------------------------

Delegate void  DgSayHelo(string  name);

//-----------------------再声明一个委托类型的对象-----------------------------------------------

DgSayHelo Sayhello=null;

//---------------------然后定义一些方法--------------------------------------------------

Void  USstring name

{

 Console.Write("Hello"+name)

}

Void  Cstring name

{

 Console.Write("您好"+name)

}

Void  Jstring name

{

 Console.Write("OHaU"+name)

}

//-------------------------在委托里注册以上方法-----------------------------------------------------

 Sayhello=new DgSayHelo (US);

Sayhello+=C;

Sayhello+=J;

//-------------------------------现在我们来执行委托----------------------------

Sayhello"Ms.Wen";

在这里我们不讨论出现了什么;

我只想说这些语法的来路(也就是所谓的原理)

当我们的声明一个委托时候

   Delegate void  DgSayHelo(string  name);

那我们有问题了 ?

delegate 关键字用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法。------摘自別文;

那么当编译器遇到关键字的时候为我做了什么呢; 当然为真实我们应该去用 反汇编

以上图所示:

我们看到的是

1.生成一个类: 并继承了MultcastDelegate

 2. 构造函数;

3EndInvoke() ,BeginInvoke(),Invoke()等方法

这样也就说明了、

class DGHello:System.MulticastDelegate 
{
  public DelegateForFun();

     void Invoke(string value); 

     IAsyncResult BeginInvoke(string value,AsyncCallback callback,Object object);

     void EndInvoke(IAsyncResult result);

}

下面我们再来看其中MultcastDelegate这个类

 

    借助.Net Reflector工具来查看类库中的 MulticastDelegate 类

public abstract class MulticastDelegate : Delegate

由此我们可以看出继承关系:DGSayHi –> MulticastDelegate –> Delegate

MulticastDelegate类中有3个重要的成员,其中两个继承自 Delegate  :

a.三者的作用:

_methodPtr 里保存的就是 方法指针。

_target 里用来保存方法所在的对象。

_invocationList 其实使用时是个object数组,在注册多个方法时,其他方法就保存在此成员中,而它也就是 委托链 的关键容器。