第15章 委托
委托是C#中一个很棒的特性,它既有一定的灵活性,同时又是类型安全的。委托是事件的基础,而事件的应用非常广泛,因此,委托对于学习C#来说非常重要,希望大家在阅读的过程中多动手练习,同时多思考。
15.1 什么是委托
既然委托这么重要,那么究竟什么是委托呢?委托类似于C/C++中的函数指针。它能够引用函数,只不过在C#中,委托是一个对象,并且是类型安全的,避免了函数指针的不安全性。一个委托类型的变量可以引用一个或多个方法,这些方法由委托存放于一个调用列表中,当调用一个委托类型的变量(后文我们会解释为何委托类型的变量可以被“调用”)即相当于依次调用它的“调用列表”中的方法,如图15-1所示。
图 15-1 委托和它引用的方法
委托的定义和方法的定义类似,只是在返回值类型的前面多了一个delegate关键字,虽然形式上很像方法,但委托并不是方法,它是一种引用类型。下面就是一个委托示例:
public delegate void PrintDelegate(string content);
委托能引用的方法也是有限制的,这种限制体现在委托的签名里。前面定义的委托类型PrintDelegate可以引用的方法需要满足以下条件:
❑方法的返回类型为:void(虽然返回类型不是方法签名的一部分,但在这里返回类型也是委托对引用方法定义的要求因素之一);
❑方法有1个参数,为string类型。
这说明,可以被引用的方法必须要满足如下规则:
❑方法的签名要和委托一致,比如方法参数的个数和类型;
❑方法的返回值要和委托一致。
图 15-2 委托签名和它引用的方法
使用图示阐述上述规则,如图15-2所示。