C#的委托(Delegates in C#)- part one
什么是委托(what's a delegate)?
计算机中的名词术语大部分都是借自日常生活,所以我们先来看看日常生活中“delegate”是什么意思。
Merriam-Webster Unabridged Dictionary对“delegate”的定义:
A person sent and empowered to act for another.
派遣并授权代表某人行事的人。
由此可见,“delegate”有委托、代理、代表之意,就是代替(代表)别人去做事(的人)。那么,“delegate”在C#中又是什么意思呢?
The C# Programming Language对"delegate"的定义:
A delegate type represents references to methods with a particular parameter list and return type.
委托类型表示方法引用,这些方法可以带有特定参数表和返回类型。
此定义非常简洁地定义了“delegate”,可以从三个方面来理解:
1、delegate是一个类型(type),是一个语言级的构造;
2、delegate表示的是方法引用,delegate实际上是对方法的封装(wrapper);
3、delegate所引用的方法可以有自己特定的参数表和返回类型,也就是说,不同的delegate其引用的方法可以有不同的参数表和返回类型。
既然delegate是C#的语言构造,那么如何声明一个delegate呢?
委托的声明(declare a delegate)
delegate是C#中易于使人迷惑的语言构造,尤其是其声明语法,很不自然。
例:
public delegate string MyDelegate(int n);// 声明MyDelegate是一个委托
我们熟悉的是方法和类的声明,如:
public class MyClass// class
{
public string ToString();// method
}
delegate的声明语法之所以使人困惑,是因为在一个语句中综合了类的声明和方法的声明。
1、public delegate ...,这个不完全语句更像一个class的声明;
2、string MyDelegate(int n); 这个不完全声明是delegate所引用的方法的声明,表明MyDelegate所引用的方法必须具有string XXX(int n)这样的签名(signature)。
C#中的delegate是一级语言构造,准确地说,是一个类。而且C#编译器在遇到如上的delegate声明语句之时,会生成如下所示的类声明代码:
public class MyDelegate : System.MultiCastDelegate
{
public MyDelegate(Object object, IntPtr method);
public virtual string Invoke(int32 value);
public virtual IAsyncResult BeginInvoke(int32 value, AsyncCallback callback, Object object);
public virtual string EndInvoke(IAsyncResult result);
}
如下图所示: