第15章 委托

委托是C#中一个很棒的特性,它既有一定的灵活性,同时又是类型安全的。委托是事件的基础,而事件的应用非常广泛,因此,委托对于学习C#来说非常重要,希望大家在阅读的过程中多动手练习,同时多思考。

15.1 什么是委托

既然委托这么重要,那么究竟什么是委托呢?委托类似于C/C++中的函数指针。它能够引用函数,只不过在C#中,委托是一个对象,并且是类型安全的,避免了函数指针的不安全性。一个委托类型的变量可以引用一个或多个方法,这些方法由委托存放于一个调用列表中,当调用一个委托类型的变量(后文我们会解释为何委托类型的变量可以被“调用”)即相当于依次调用它的“调用列表”中的方法,如图15-1所示。

第15章 委托 - 图1

图 15-1 委托和它引用的方法

委托的定义和方法的定义类似,只是在返回值类型的前面多了一个delegate关键字,虽然形式上很像方法,但委托并不是方法,它是一种引用类型。下面就是一个委托示例:


public delegate void PrintDelegate(string content);


委托能引用的方法也是有限制的,这种限制体现在委托的签名里。前面定义的委托类型PrintDelegate可以引用的方法需要满足以下条件:

❑方法的返回类型为:void(虽然返回类型不是方法签名的一部分,但在这里返回类型也是委托对引用方法定义的要求因素之一);

❑方法有1个参数,为string类型。

这说明,可以被引用的方法必须要满足如下规则:

❑方法的签名要和委托一致,比如方法参数的个数和类型;

❑方法的返回值要和委托一致。

第15章 委托 - 图2

图 15-2 委托签名和它引用的方法

使用图示阐述上述规则,如图15-2所示。