一、委托概述
1、什么是委托
委托和类一样,是一种用户定义类型(即是一种类,所以也是一个引用类型)。在它们组成的结构方面区别是,类表示的是数据和方法的集合,而委托则持有一个或多个方法。
可以把 delegate 看作是一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型。
-
(1)方法的列表称为调用列表。
-
(2)委托持有的方法可以来自任何类或结构,只要它们在下面两方法匹配:
- 委托的返回类型;
- 委托的签名(包括 ref 和 out 修饰符)
-
(3)调用列表中的方法可以是实例方法也可以是静态方法。
-
(4)在调用委托的时候,会执行其调用列表中的所有方法。
2、声明委托类型
声明委托代码:
delegate void MyDel(int x);
//delegate:关键字
//void:返回类型
//MyDel:委托类型名称
//MyDel(int x):签名
委托与方法在声明时有两点不同:
- 以 delegate 关键字开头;
- 没有方法主体。
说明: 虽然委托类型声明看上去和方法的声明一样,但它不需要在类内部声明,因为它是类型声明。
3、创建委托对象
委托类型的变量声明:
MyDel delVar;
//MyDel:委托类型
//delVar:变量
有两种创建委托对象的方法:
(1)使用带 new 运算符的对象创建表达式。
new 运算符的操作数的组成:
- 委托类型名。
- 一组圆括号,其中包含作为调用列表中第一个成员的方法的名称,该方法可以是实例方法或静态方法。
假设 myInstObj 是类对象,MyM1 是 myInstObj 的一个实例方法。 SCLass 是类,OtherM2 是 SCLass 的静态方法。
//创建委托并保存引用
delVar = new MyDel(myInstObj.MyM1);
delVar = new MyDel(SCLass.OtherM2);
(2)快捷语法
仅由方法说明符构造。这种快捷语法能够工作是因为在方法名称和其相应的委托类型之间存在隐式转换。
//创建委托并保存引用
delVar = myInstObj.MyM1;
delVar = SClass.OhterM2;
以下是创建委托对象的完整代码:
delegate void MyDel(int x);
//使用 new 运算符方式
MyDel delVar,dVar;
delVar = new MyDel(myInstObj.MyM1);
dVar = new MyDel(SClass.OtherM2);
//快捷语法方式
MyDel delVar = myInstObj.MyM1;
MyDel dVar = SClass.OhterM2;
除了为委托分配内存,创建委托对象还会把第一个方法放入委托的调用列表。