C#笔记进阶篇06 委托
——本系列是基于人民邮电出版社《C#2008 C#图解教程》、清华大学出版社《C#入门经典(第五版)》两本书的自学C#笔记,如果您发现了本文的纰漏,还望不吝指正。
写在前边
*复习:类型是一种模版,C#提供了15种预定义类型,还可以创建自己的用户定义类型,有6种类型:
- 类类型(class)
- 结构类型(struct)
- 数组类型(array)
- 枚举类型(enum)
- 委托类型(delegate)
- 接口类型(interface)
1. 委托的定义
委托(delegate)可以认为是这样的对象,它包含具有相同签名和返回值类型的有序方法列表。
方法的列表称为调用列表
当委托被调用时,它调用列表中的每一个方法——人民邮电出版社《C#2008 C#图解教程》
所有的委托(Delegate)都派生自System.Delegate类
- 委托是一种可以把引用存储为函数的类型
- 委托可以让我们把函数当做变量去使用
- 委托解决了很多代码冗余的问题,也解决了方法回调的问题
2. 委托的声明
委托的声明非常类似于方法,但不带方法体,且要使用delegate关键字。委托的声明指定了一个返回类型和一个参数列表
访问修饰符 delegate 返回类型 委托类型名(参数列表);
<access specifier> delegate <return type> <delegate-name> (<parameter list>)
//访问修饰符 <access specifier>
如:
delegate void MyDel(int x);
3. 实例化委托对象
委托类型名 委托变量名 = new 委托类型(返回类型与参数列表一致方法)
如:
delegate void MyDel(int x); //声明委托
MyDel delVar = new MyDel(myInstObj.MyM1); //实例方法创建委托并保存引用
MyDel dVar = new MyDel(SClass.OtherM2); //静态方法创建委托并保存引用
也可以是用快捷语法,仅由方法说明符构成
delegate void MyDel(int x); //声明委托
MyDel delVar = myInstObj.MyM1; //实例方法创建委托并保存引用
MyDel dVar = SClass.OtherM2; //静态方法创建委托并保存引用
4. 赋值和调用
- 由于委托是引用类型,我们可以通过它的赋值来改变包含在委托变量中的引用。旧的委托对象会被GC回收
- 委托的本质是方法引用的列表,有先后顺序,一旦调用会把列表中所有的方法执行完
例:如下代码中,引用带有一个整型参数的方法,并返回一个整型值
//delegate关键字指定该定义是用于委托的
delegate int NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;