委托、匿名方法
一、委托
为了实现方法的参数化,提出了委托的概念。委托是一种引用方法的类型,即委托是方法的引用,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。
C#中的委托(Delegate)是一种引用类型,该引用类型与其他引用类型有所不同。在委托对象的引用中存放的表示对数据的引用,而是存放对方法的引用,即在委托的内部包含一个指向某个方法的指针。通过使用委托把方法的引用封装在委托对象中,然后将委托对象传递给调用引用方法的代码。委托对象的声明语法格式为:
修饰符 delegate 返回类型 委托名称(参数列表)。
其中,修饰符是可选项;返回类型、关键字delegate和委托名称是必需项;参数列表用来指定委托所匹配的方法的参数列表,所以是可选项。
一个与委托类型相匹配的方法必须满足以下两个条件。
1、这二者具有相同的签名,即具有相同的参数数目,并且类型相同,顺序相同,参数的修饰符也相同。
2、这二者具有相同的返回值类型。
委托是方法的类型安全的引用,之所以是委托是安全的,是因为委托和其他所有的C#成员一样,是一种数据类型,并且任何委托对象都是System.Delegate的某个派生类的一个对象,任何自定义委托类型都继承自System.Delegate类型,并且该类型封装了许多委托的特性和方法。下面通过一个具体的例子来说明委托的定义和应用。
上面代码中的MyDelegate自定义委托类型继承自System.MulticastDelegate,并且该自定义委托类型包含一个名为Invoke的方法,该方法接受两个整型参数并返回一个整数值,由此可见Invoke方法的参数及返回值类型与Add方法完全相同。实际上程序在进行委托调用时就是调用了Invoke方法,所以上面的委托调用完全可以写成下面的形式:int intSum=md.Invoke(2,3);
总结:(1)委托是一种引用类型,虽然在定义委托时与方法有些相同,但不能将其称为方法。
(2)委托在使用时遵守三步走原则:定义声明委托,实例化委托以及调用委托。
(3)委托从数据结构上看和类引用是一种用户自定义类型。
(4)调用委托时,委托的所有方法都将被调用。
(5)委托是方法的抽象,它存储的就是一系列具有相同签名和返回类型的方法的地址。
(6)定义声明委托:修饰符 delegate 返回值类型 委托名(参数列表)。
(7)实例化委托:委托名 委托对象名 = new 委托名(方法名);
(8)委托中传递的方法名既可以是静态方法的名称,也可以是实例方法的名称。且委托中的方法名必须与委托定义时的返回值类型和参数列表相同。
(9)调用委托:委托对象名(参数列表);(参数列表中传递的参数要与委托定义的参数列表相同)
二、匿名方法
为了提高委托的可操作性,C#中提出了匿名方法的概念,它在一定程度上减少了代码量,并简化了委托引用方法的过程。
匿名方法允许一个与委托关联的代码被内联地写入使用委托的位置,这使得代码对于委托的实例很直接。除了这种便利之外,匿名方法还共享了对本地语句包含的函数成员的访问。匿名方法的语法格式如下:
delegate(参数列表)
{
代码块
};
例如:
程序运行结果为:
匿名方法被调用
命名方法被调用
三、匿名委托
匿名委托是指在使用匿名方法注册在委托上,实际上是在委托中通过定义代码块来实现委托的作用。匿名委托也有三步走原则:(1)定义声明委托(2)定义匿名委托(3)调用匿名委托
(1)定义声明委托
修饰符 delegate 返回值类型 委托名(参数列表)
(2)定义匿名委托
委托名 委托对象=delegate
{
代码块
};
(3)调用匿名委托
委托对象名(参数列表);