无私分享(C#高级编程第6版doc)第07章 委托和事件

无私分享(C#高级编程第6版doc)第07章 委托和事件

ID:41037544

大小:185.50 KB

页数:23页

时间:2019-08-14

无私分享(C#高级编程第6版doc)第07章 委托和事件_第1页
无私分享(C#高级编程第6版doc)第07章 委托和事件_第2页
无私分享(C#高级编程第6版doc)第07章 委托和事件_第3页
无私分享(C#高级编程第6版doc)第07章 委托和事件_第4页
无私分享(C#高级编程第6版doc)第07章 委托和事件_第5页
资源描述:

《无私分享(C#高级编程第6版doc)第07章 委托和事件》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、目录第7章委托和事件27.1 委托27.1.1 在C#中声明委托27.1.2 在C#中使用委托37.1.3 简单的委托示例67.1.4 BubbleSorter示例77.1.5 多播委托107.1.6 匿名方法137.1.7  l表达式147.1.8 协变和抗变167.2 事件177.2.1 从接收器的角度讨论事件177.2.2 生成事件197.3 小结23第7章委托和事件回调(callback)函数是Windows编程的一个重要部分。如果您具备C或C++编程背景,应该就曾在许多WindowsAPI中使用过回调。VisualBasic添加了AddressOf关键字后,开发人员就可以利用

2、以前一度受到限制的API了。回调函数实际上是方法调用的指针,也称为函数指针,是一个非常强大的编程特性。.NET以委托的形式实现了函数指针的概念。它们的特殊之处是,与C函数指针不同,.NET委托是类型安全的。这说明,C中的函数指针只不过是一个指向存储单元的指针,我们无法说出这个指针实际指向什么,像参数和返回类型等就更无从知晓了。如本章所述,.NET把委托作为一种类型安全的操作。本章后面将学习.NET如何将委托用作实现事件的方式。本章的主要内容如下:● 委托● 匿名方法● 表达式● 事件7.1 委托当要把方法传送给其他方法时,需要使用委托。要了解它们的含义,可以看看下面的代码:inti=i

3、nt.Parse("99");我们习惯于把数据作为参数传递给方法,如上面的例子所示。所以,给方法传送另一个方法听起来有点奇怪。而有时某个方法执行的操作并不是针对数据进行的,而是要对另一个方法进行操作,这就比较复杂了。在编译时我们不知道第二个方法是什么,这个信息只能在运行时得到,所以需要把第二个方法作为参数传递给第一个方法,这听起来很令人迷惑,下面用几个示例来说明:● 启动线程--在C#中,可以告诉计算机并行运行某些新的执行序列。这种序列就称为线程,在基类System.Threading.Thread的一个实例上使用方法Start(),就可以开始执行一个线程。如果要告诉计算机开始一个新的

4、执行序列,就必须说明要在哪里执行该序列。必须为计算机提供开始执行的方法的细节,即Thread类的构造函数必须带有一个参数,该参数定义了要由线程调用的方法。● 通用库类--有许多库包含执行各种标准任务的代码。这些库通常可以自我包含。这样在编写库时,就会知道任务该如何执行。但是有时在任务中还包含子任务,只有使用该库的客户机代码才知道如何执行这些子任务。例如编写一个类,它带有一个对象数组,并把它们按升序排列。但是,排序的部分过程会涉及到重复使用数组中的两个对象,比较它们,看看哪一个应放在前面。如果要编写的类必须能给任何对象数组排序,就无法提前告诉计算机应如何比较对象。处理类中对象数组的客户机

5、代码也必须告诉类如何比较要排序的对象。换言之,客户机代码必须给类传递某个可以进行这种比较的合适方法的细节。● 事件--一般是通知代码发生了什么事件。GUI编程主要是处理事件。在发生事件时,运行库需要知道应执行哪个方法。这就需要把处理事件的方法传送为委托的一个参数。这些将在本章后面讨论。在C和C++中,只能提取函数的地址,并传送为一个参数。C是没有类型安全性的。可以把任何函数传送给需要函数指针的方法。这种直接的方法会导致一些问题,例如类型的安全性,在进行面向对象编程时,方法很少是孤立存在的,在调用前,通常需要与类实例相关联。而这种方法并没有考虑到这个问题。所以.NETFramework在

6、语法上不允许使用这种直接的方法。如果要传递方法,就必须把方法的细节封装在一种新类型的对象中,即委托。委托只是一种特殊的对象类型,其特殊之处在于,我们以前定义的所有对象都包含数据,而委托包含的只是方法的地址。7.1.1 在C#中声明委托在C#中使用一个类时,分两个阶段。首先需要定义这个类,即告诉编译器这个类由什么字段和方法组成。然后(除非只使用静态方法)实例化类的一个对象。使用委托时,也需要经过这两个步骤。首先定义要使用的委托,对于委托,定义它就是告诉编译器这种类型的委托代表了哪种类型的方法,然后创建该委托的一个或多个实例。编译器在后台将创建表示该委托的一个类。定义委托的语法如下:del

7、egatevoidIntMethodInvoker(intx);在这个示例中,定义了一个委托IntMethodInvoker,并指定该委托的每个实例都包含一个方法的细节,该方法带有一个int参数,并返回void。理解委托的一个要点是它们的类型安全性非常高。在定义委托时,必须给出它所代表的方法签名和返回类型等全部细节。提示:理解委托的一种好方式是把委托当作给方法签名和返回类型指定名称。假定要定义一个委托TwoLongsOp,该委托代表的方法有两个

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。