Delegate (CLI)

维基百科,自由的百科全书
跳转至: 导航搜索

代理(delegate)是一种类型安全的函数指针,用于通用语言运行库(CLI)。在C#中,delegate是一种class,包装了一个或多个函数指针及绑定的类实例。Delegate用来实现函数回调与事件接收(event listener)。Delegate对象可以作为参数传递给其他函数,以引用(referenced)封装在delegate对象中的函数,而无需在编译时刻就绑定被调用函数。 [1]

一旦为委托分配了函数方法,委托将与该函数方法具有完全相同的行为。 与委托的签名(由返回类型和参数组成)匹配的任何方法都可以分配给该委托。

C#例子[编辑]

声明一个delegate类型,称作SendMessageDelegate, 以一个Message为参数,返回类型为void:

delegate void SendMessageDelegate(Message message);

下述代码定义了一个函数,以一个实例化的delegate作为形参:

void SendMessage(SendMessageDelegate sendMessageDelegateReference)
{
  // call the delegate and any other chained delegates synchronously
  sendMessageDelegateReference(new Message("hello this is a sample message"));
}

封装入delegate中的函数的定义:

void HandleSendMessage(Message message)
{
  // the implementation for the Sender and Message classes are not relevant to this example
  Sender.Send(message);
}

函数SendMessage,以实例化的delegate作为参数:

SendMessage(new SendMessageDelegate(HandleSendMessage));

delegate实例可以是封装多个函数:

delegateType de1=fun1;
delegateType de2=fun2;
delegateType de3=de1+de2;//de3中有fun1、fun2两个函数的引用

技术实现细节[编辑]

Delegate作为类,可以认为包含一个类对象的地址,该类的一个方法的地址,以及另一个delegate的引用(reference)。因此引用一个delegate对象,可能实际上引用了多个delegate实例。delegate对象被调用时,依次调用里面的多个delegate。这对于事件驱动的程序比较有用。

如果delegate封装了一个静态函数,则其内部的绑定的类对象地址为null。

参考文献[编辑]

  1. ^ Sturm, Oliver. Delegate calls vastly sped up in .NET 2. 2005-09-01 [2007-09-09]. 

外部链接[编辑]