15.3 委托的声明和实例化
既然委托是引用类型,那么要使用它,就必须像其他引用类型一样,需要先声明,然后实例化。需要注意的是:类实例化后叫做对象,而委托实例化后仍然叫做委托,因此,当我们看到“委托”这个词的时候,无法立即判断它是类型还是实例,需要结合上下文来判断。
接下来,我们先来看如何声明一个委托类型,语法如下所示:
关于委托的声明,有以下几点需要注意:
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-4所示。
图 15-4 委托的实例化并调用