在本章前面介绍的实例中,委托实例的方法都具有相同的名称。C#支持匿名方法的方式,即允许委托的关联代码以内联方式写入使用委托的位置,从而方便直接将代码块绑定到委托实例中。
通过使用匿名方法,可以将代码块直接作为创建委托的参数,而不需要预先定义一个处理方法,并且匿名方法还能够对包含它的函数成员的局部状态进行共享访问。使用委托匿名方法的语法格式如下:
其中,委托参数列表和返回类型都必须和匿名方法相兼容,这样才能进行从匿名方法到委托类型的隐式转换。
如果一个局部变量或参数的作用域内包含一个匿名方法,那么这个局部变量或参数被称为该匿名方法的外层变量。一个局部变量生存周期仅限于该变量所关联的代码块,或此语句的执行过程中。但是被捕获的外层变量的生存周期将被延长到匿名方法的委托被执行垃圾回收处理为止。
实例55:使用匿名方法创建委托
下面通过一个具体的实例来说明使用匿名方法创建委托的具体流程。本实例保存在“光盘:\daima11”文件夹内,项目名为niming。实例的功能是分别使用命名方法和匿名方法来创建委托。实例文件的主要代码如下:
上述实例代码的设计流程如下。
1)定义名为mm的委托,设置其参数为s。
2)使用匿名方法来创建委托对象p。(www.xing528.com)
3)将匿名委托p的信息输出。
4)使用关键字new,创建命名方法的委托p。
5)命名委托p调用方法chuli(),将对应的信息输出。
上述实例代码执行后,将分别输出显示对应的结果,具体如图12-3所示。
图12-3 实例执行结果
多学一招
在C#1.1里,声明和使用委托时要求有委托和一个在委托被触发时具有匹配签名的能够执行的方法,以及一个将命名方法与委托关联的分配语句。匿名方法基本上能够提供与先前命名方法相同的功能,但是它已经不再需要一个在关联到委托之前就明确创建的方法了。
可以把匿名方法想象为一个实现与委托进行关联这项功能的便捷途径。如果同时看一下匿名方法实现和命名方法实现所取得IL结果,会发现这两者之间的差别非常小。当编译器碰到匿名方法的时候,它会在类中创建一个命名方法,并将它与委托进行关联。所以匿名方法在运行期间与命名方法的性能非常类似—性能的增加体现在开发人员的生产效率上,而不是运行期间的执行上。
使用匿名方法很简单。只需要把匿名方法放在通常放命名方法的关联语句里。任何在匿名方法里声明的变量的范围都不会超出匿名方法的代码块。但是,匿名方法确实具有访问它们代码块之外的变量的能力,只要这些变量在匿名方法所使用的范围内。这些变量被微软称为外部变量。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。