日期:2014-05-17  浏览次数:20872 次

C#学习笔记——委托

委托

委托包含具有相同签名和返回类型的有序方法列表。

??? 方法的列表称为调用列表。

???????? 当委托被调用时,它调用列表中的每一个方法。

????????

包含单个方法的委托和C++的函数指针相似。然而,与函数指针不同的是,委托是面向对象的并且是类型安全(type-safe)的。

?

调用列表中的方法

??? 由委托保存的方法可以来自任何类或结构,只要它们同时匹配委托的如下两点:

??? 返回值

??? 签名(包括refout修饰符)

??? 调用列表中的方法可以是实例方法或是静态方法。

????????

????????

声明委托类型

??? 委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型的对象之前声明。如下示例代码声明了委托类型。

??? 委托类型声明和所有类型声明一样,不需要在类内部声明。

?

关键词??????? 委托类型名

delegate void MyDel(int x);

?

委托类型的声明看上去与方法的声明很相似,有返回类型和签名。返回类型和签名指定了委托接受的方法的形式。

?

委托类型声明在两个方面与方法声明不同。委托类型声明:

delegate关键词开头。

没有方法主体。

?

?

?

创建委托对象

??? 委托是引用类型,因此有引用和对象。在委托类型声明之后,我们可以声明变量并创建类型的对象。如下代码演示了委托类型的变量的声明:

委托类型 变量

MyDel delVar;

?

有两种创建委托对象的方式,第一种是使用带new运算符的对象创建表达式,如下面代码所示。

new运算符的操作数的组成如下:

??? 委托类型名。

??? 一组圆括号,其中包含作为调用列表中第一个成员的方法的名字。方法可以是实例方法或静态方法。

????????

?

??????????????????? 实例方法

delVar = newMyDel(myInstObj.MyM1);? //创建委托并保存引用

dVar = new MyDel(SClass.OtherM2);?? //创建委托并保存引用

??????????????????? 静态方法

??????????????????????????????????????????????

??? 我们还可以使用快捷语法,它仅由方法说明符构成,如下面代码所示。这段代码和之前的代码是等价的。使用快捷语法是因为在方法名称和其相应的委托类型之间有隐式转换。

?

delVar = myInstObj.MyM1;//创建委托并保存引用

dVar = SClass.OthertM2;//创建委托并保存引用

?

??? 例如,下面的代码创建了两个委托对象——一个具有实例方法,而另外一个具有静态方法。这段代码假设有一个叫做nlylnstObj的类对象,它有一个叫做MyM1的方法,该方法接受一个int作为参数,不返回值。还假设有一个名为SClass的类,它有一个OtherM2静态方法,该方法具有与MyDel委托相匹配的返回类型和签名。

delegate void MyDel(int x);? //声明委托类型

MyDel delVar,d