欢迎来到天天文库
浏览记录
ID:39461466
大小:268.50 KB
页数:25页
时间:2019-07-03
《方法类型化——委托》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第9章方法类型化——委托9.1委托9.2事件9.3小结9.1委托在C、C++和Pascal中,如果把函数的指针(地址)作为参数传递给另一个函数,当该指针被用于调用它所指向的函数时,我们就可以称之为回调函数。回调函数是一种功能强大的编程特性,窗口过程、异步过程调用等都需要使用回调函数。但是,函数指针只是一个内存地址,该地址不带任何额外信息,例如函数期望收到的参数个数、参数类型、函数的返回值类型以及函数的调用约定等,所以函数指针是非类型安全的。因此,为了保证程序的安全性,Java不提供任何具有指针函数功能的结构,但是C#提供这
2、种结构,这就是类型安全的委托。9.1.1委托概述在C#中,委托是一种特殊的对象类型(即一种特殊的类),其特殊之处在于之前定义的对象类型都可以包含数据,而委托包含的只是方法的地址。也可以说,委托是对一类方法(参数和返回值类型相似的方法)的类型。和类在使用前要进行实例化一样,委托在使用前也要进行实例化。但需要注意的是,在术语方面,类有两个不同的术语,“类”表示较广义的定义,“对象”表示类的实例。但委托只有一个术语,在创建委托的实例时,所创建的委托的实例也称为委托。9.1.1委托概述(1)确定将要引用方法的签名,声明一个委托类型
3、。一般语法形式如下:[访问修饰符]delegate返回值类型委托类名(形参列表);例如下列代码:publicdelegatevoidDel(stringmessage);委托声明在形式上类似于方法的定义,但是没有方法体,在返回值类型前需要添加delegate关键字。委托声明中的返回值类型、形参类型和形参个数要与被引用的方法匹配(不必完全匹配,委托支持协变与逆变,后面章节将进行详细介绍)。委托的声明实际就是一个类的定义(该类实际定义的是一类方法,而且只有方法,没有数据),所以可以在定义类的任何位置定义委托。9.1.1委托概述
4、(2)实例化一个委托。一般语法形式如下:委托类名委托名=new委托类名(被引用的方法名);或者如下形式:委托类名委托名=被引用的方法名;例如下列代码。Delhandler=newDel(DelegateMethod);或者如下形式。Delhandler=DelegateMethod;第二种语法是第一种语法的缩写,是C#2.0以上版本才支持的语法形式。因为C#2.0支持委托推断,即允许直接为委托实例指派方法名,而不需要先使用委托对象对其进行包装。示例代码中的DelegateMehod是一个被引用的具体方法名,不带“()”。因
5、为handler实际是一个对象,对其进行赋值只是将DelegateMethod的内存单元地址传入handler中。有关委托的本质可参见后续章节。9.1.1委托概述(2)实例化一个委托。一般语法形式如下:委托类名委托名=new委托类名(被引用的方法名);或者如下形式:委托类名委托名=被引用的方法名;例如下列代码。Delhandler=newDel(DelegateMethod);或者如下形式。Delhandler=DelegateMethod;第二种语法是第一种语法的缩写,是C#2.0以上版本才支持的语法形式。因为C#2.0
6、支持委托推断,即允许直接为委托实例指派方法名,而不需要先使用委托对象对其进行包装。示例代码中的DelegateMehod是一个被引用的具体方法名,不带“()”。因为handler实际是一个对象,对其进行赋值只是将DelegateMethod的内存单元地址传入handler中。有关委托的本质可参见后续章节。9.1.1委托概述(3)委托调用。委托调用的目的就是调用委托所封装的方法。委托最主要的用途是实现函数回调.【例9-1】委托实现函数回调publicdelegatevoidDel(stringmessage);classPr
7、ogram{publicstaticvoidDelegateMethod(stringmessage){System.Console.WriteLine(message);}staticvoidMain(string[]args){Delhandler=DelegateMethod;handler("HelloWorld");//传入参数"HelloWorld"}}9.1.1委托概述【例9-2】委托实现函数传递publicdelegatevoidDel(stringmessage);classProgram{publics
8、taticvoidDelegateMethod(stringmessage){System.Console.WriteLine(message);}publicstaticvoidMethodWithCallback(intparam1,intparam2,Delcallback)//Del类委托做参数
此文档下载收益归作者所有