15.3 委托的声明和实例化

既然委托是引用类型,那么要使用它,就必须像其他引用类型一样,需要先声明,然后实例化。需要注意的是:类实例化后叫做对象,而委托实例化后仍然叫做委托,因此,当我们看到“委托”这个词的时候,无法立即判断它是类型还是实例,需要结合上下文来判断。

接下来,我们先来看如何声明一个委托类型,语法如下所示:

15.3 委托的声明和实例化 - 图1

关于委托的声明,有以下几点需要注意:

1)和类一样,委托的声明可以在类的声明外部,委托也可以声明在类中;

2)委托的声明虽然形式上与方法很像,但它没有方法主体,而是直接以分号结尾;

3)修饰符可以是:new、public、protected、internal、private;

4)delegate关键字后是本委托类型可以匹配的方法签名,尤其需要注意的是,它还包括方法的返回类型,但并非必须与方法名完全匹配,稍后我们会介绍委托中的“协变”和“逆变”。

接下来,我们来看看如何实例化一个委托,方法如下:

首先,声明一个委托类型的变量;

然后,使用构造函数或者"="运算符,将要引用的方法赋值给该委托变量。注意,这里的方法只是签名,不带括号和参数列表;或者,使用委托的构造函数,将方法的签名作为参数传给构造函数。

提示 委托不但可以引用实例方法,也可以引用静态方法。

接下来,使用一段代码实例进行说明,如代码清单15-1所示。

代码清单15-1 实例化委托


1 namespace ProgrammingCSharp4

2{

3 public delegate void DoProcess(string msg);

4

5 class DelegateSample

6{

7 void Process(string msg)

8{

9 System.Console.WriteLine(“处理流程:{0}”,msg);

10}

11

12 public static void Main()

13{

14 DelegateSample sample=new DelegateSample();

15 DoProcess process=new DoProcess(sample.Process);

16//和第15行等价

17//DoProcess process=sample.Process;

18 process(“测试数据”);

19}

20}

21}


上述代码的执行结果如下:


处理流程:测试数据


对于上述代码的说明,如表15-1所示。

15.3 委托的声明和实例化 - 图2

上述代码使用图示进行阐述,如图15-4所示。

15.3 委托的声明和实例化 - 图3

图 15-4 委托的实例化并调用