C#委托基础

委托、匿名方法

一、委托 

为了实现方法的参数化,提出了委托的概念。委托是一种引用方法的类型,即委托是方法的引用,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。

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)调用匿名委托

委托对象名(参数列表);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值