Delegate (CLI)

委托（delegate）是一种类型安全的函数指针，用于通用语言运行库(CLI)。在C#中，delegate是一种class，包装了一个或多个函数指针及绑定的类实例。Delegate用来实现函数回调与事件接收（event listener）。Delegate对象可以作为参数传递给其他函数，以引用（referenced）封装在delegate对象中的函数，而无需在编译时刻就绑定被调用函数。 
一旦为委托分配了函数方法，委托将与该函数方法具有完全相同的行为。 与委托的类型特征（由返回类型和参数组成）匹配的任何方法都可以分配给该委托。

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。

用途

一个常用的用途是事件处理。CLI定义了控件的事件处理函数是一个Delegate，声明如下：

public delegate void EventHandler(object sender, EventArgs e)
这里第一个参数是发出该事件的控件的基类型object；后一个参数是事件数据的基类型EventArgs。以Button控件类为例，它有一个属性Click，定义为一个EventHandle类型的delegate:

public event EventHandle Click;
至此，我们对一个具体的button实例变量，可以给它的Click事件追加上一个或多个事件处理函数：

this.button1.Click += new System.EventHandler(this.button1_click);
对于Visual Basic，上述语句的写法是：

AddHandler button1.click, AddressOf button1_Click