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”,可以从三个方面来理解:

1delegate是一个类型(type),是一个语言级的构造;

2delegate表示的是方法引用,delegate实际上是对方法的封装(wrapper);

3delegate所引用的方法可以有自己特定的参数表和返回类型,也就是说,不同的delegate其引用的方法可以有不同的参数表和返回类型。

 

 

既然delegateC#的语言构造,那么如何声明一个delegate呢?

 

委托的声明(declare a delegate

 

delegateC#中易于使人迷惑的语言构造,尤其是其声明语法,很不自然。

例:

public delegate string MyDelegate(int n);// 声明MyDelegate是一个委托

 

 

我们熟悉的是方法和类的声明,如:

public class MyClass// class

{

public string ToString();// method

}

 

 

delegate的声明语法之所以使人困惑,是因为在一个语句中综合了类的声明和方法的声明。

1public delegate ...,这个不完全语句更像一个class的声明;

2string 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);

}

 

如下图所示:

 

 

原文地址:https://www.cnblogs.com/prowyh/p/2399473.html