Visual C# 2010程序设计教程 教学课件 ppt 作者 978-7-302-28609-7 ch09

上传人:E**** 文档编号:89362749 上传时间:2019-05-24 格式:PPT 页数:15 大小:207.50KB
返回 下载 相关 举报
Visual C# 2010程序设计教程 教学课件 ppt 作者 978-7-302-28609-7 ch09_第1页
第1页 / 共15页
Visual C# 2010程序设计教程 教学课件 ppt 作者 978-7-302-28609-7 ch09_第2页
第2页 / 共15页
Visual C# 2010程序设计教程 教学课件 ppt 作者 978-7-302-28609-7 ch09_第3页
第3页 / 共15页
Visual C# 2010程序设计教程 教学课件 ppt 作者 978-7-302-28609-7 ch09_第4页
第4页 / 共15页
Visual C# 2010程序设计教程 教学课件 ppt 作者 978-7-302-28609-7 ch09_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《Visual C# 2010程序设计教程 教学课件 ppt 作者 978-7-302-28609-7 ch09》由会员分享,可在线阅读,更多相关《Visual C# 2010程序设计教程 教学课件 ppt 作者 978-7-302-28609-7 ch09(15页珍藏版)》请在金锄头文库上搜索。

1、第9章 泛型编程 本章要点: 泛型的概念 泛型方法 泛型约束 使用泛型,9.1 泛型概述,9.1.1 泛型的引入 开发人员在编写程序时,经常遇到两个模块的功能非常相似,只是处理的数据类型不同,如一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,针对这种情况,可以分别写多个类似的方法来处理每个数据类型,只是方法的参数类型不同;在C#中也可以定义存储的数据类型为Object类型,这样就可以通过装箱和拆箱操作来变相实现上述需求。同时C#还提供了更适合的泛型机制,专门用来解决这个问题。,9.1 泛型概述,9.1.2 什么是泛型 通过泛型可以定义类型安全类,而不会损害类型安全

2、、性能或工作效率。开发人员只须一次性地将服务器实现为一般服务器,同时可以用任何类型来声明和使用它。为此,需要使用“”括号,以便将一般类型参数括起来。泛型格式如下: public class Stack private T data; public T Pop(). public void Push(T item). public Stack(int i) this.data = new Ti; ,9.1 泛型概述,9.1.2 什么是泛型 泛型类的格式与一般类一致,只是引入了通用数据类型T就可以适用于任何数据类型,并且类型安全的。泛型类的调用方法如下: /实例化处理int类型数据的类对象 Sta

3、ck a = new Stack(100); a.Push(10); /这一行编译不通过,因为类a只接收int类型的数据 a.Push(“8888“); /不需要进行类型转换 int x = a.Pop();,9.1 泛型概述,9.1.2 什么是泛型 这个类与使用object实现的类的区别: 它是类型安全的。如果实例化为int类型的栈,就不能处理string及其他类型的数据。 无需装箱和折箱。这个类在实例化时,按照所传入的数据类型生成本地代码,本地代码数据类型已确定,所以无需装箱和折箱。 无需类型转换。,9.1 泛型概述,9.1.3 泛型的实现 泛型在IL(中间语言)和CLR本身中具有本机支持

4、。在编译一般C#服务器端代码时,编译器会将其编译为IL,就像其他任何类型一样。但是,IL只包含实际特定类型的参数或占位符。此外,一般服务器的元数据包含一般信息。 客户端编译器使用该一般元数据来支持类型安全。当客户端提供特定类型而不是一般类型参数时,客户端的编译器将用指定的类型实参来替换服务器元数据中的一般类型参数。这会向客户端的编译器提供类型特定的服务器定义,就好像从未涉及到泛型一样。这样,客户端编译器就可以确保方法参数的正确性,实施类型安全检查。,9.1 泛型概述,9.1.3 泛型的实现 如果客户端指定引用类型,则JIT编译器将服务器IL中的一般参数替换为Object,并将其编译为本机代码。

5、在以后的任何针对引用类型而不是一般类型参数的请求中,都将使用该代码。请注意,采用这种方式,JIT编译器只会重新使用实际代码。实例仍然按照它们离开托管堆的大小分配空间,并且没有强制类型转换。,9.1 泛型概述,9.1.4 泛型方法 泛型方法是使用类型参数声明的方法。C#泛型机制不支持在除方法外的其他成员(包括属性、事件、索引器、构造器、析构器)的声明上包含类型参数,但这些成员本身可以包含在泛型类型中,并使用泛型类型的类型参数。泛型方法既可以包含在泛型类型中,也可以包含在非泛型类型中。 .NET中的泛型机制使开发人员可以重用代码。类型和内部数据可以在不导致代码膨胀的情况下更改,而不管使用的是值类型

6、还是引用类型。开发人员可以一次性地开发、测试和部署代码,通过任何类型(包括将来的类型)来重用它,并且全部具有编译器支持和类型安全。,9.2 泛型约束,C#泛型要求对“所有泛型类型或泛型方法的类型参数”的任何假定,都要基于“显式的约束”,以维护C#所要求的类型安全。“显式约束”并非必须,如果没有指定“显式约束”,范型类型参数将只能访问System.Object类型中的公有方法。在C#中通过where关键字来指定类型参数必须满足的约束条件,约束的语法格式一般为: class class-name where type-param:constraints 其中constraints是一个逗号分割的约

7、束列表。,9.2 泛型约束,9.2.1 基类约束 使用基类约束可以指定某个类型实参必须继承的基类,基类约束有两个功能: 它允许在泛型类中使用由约束指定的基类所定义的成员。例如,可以调用基类的方法或者使用基类的属性。如果没有基类约束,编译器就无法知道某个类型实参拥有哪些成员。通过提供基类约束,编译器将知道所有的类型实参都拥有由指定基类所定义的成员。 确保类型实参支持指定的基类类型参数。这意味着对于任意给定的基类约束,类型实参必须要么是基类本身,要么是派生于该基类的类,如果试图使用没有继承指定基类的类型实参,就会导致编译错误。,9.2 泛型约束,9.2.1 基类约束 基类约束使用下面形式的wher

8、e子句: where T:base-class-name 其中,T是类型参数的名称,base-class-name是基类的名称,这里只能指定一个基类。,9.2 泛型约束,9.2.2 接口约束 接口约束用于指定某个类型参数必须应用的接口。接口的两个主要功能和基类约束完全一样。 接口约束的语法格式为: where T:interface-name interface-name是接口的名称,可以通过使用由逗号分割的列表来同时指定多个接口。可以对泛型同时进行基类约束和接口约束,如果某个约束同时包含基类和接口,则先指定基类列表,再指定接口列表。,9.2 泛型约束,9.2.3 构造函数约束 new()构造

9、函数约束允许开发人员实例化一个泛型类型参数的对象。通常开发人员无法创建一个泛型类型参数的实例。然而,new()约束改变了这种情况,他要求类型参数必须提供一个无参数的构造函数。 在使用构造函数约束时,可以通过调用该无参构造函数来创建对象。构造函数约束的语法格式如下: Where T : new() 使用构造函数约束时应注意两点: 它可以与其他约束一起使用,但是必须位于约束列表的末端。 构造函数约束仅允许开发人员使用无参构造函数来构造一个对象,即使同时存在其他的构造函数。换句话说,不允许给类型参数的构造函数传递实参。,9.2 泛型约束,9.2.4 值/引用类型约束 如果引用类型和值类型之间的差别对于泛型代码非常重要,那么这些约束就非常有用,值/引用类型约束的基本形式为: where T : class where T : struct 若同时存在其他约束,class或struct关键字必须位于列表的开头。,9.3 使用泛型,泛型提高了代码的重用性,为编程提供了极大的方便,请参考书中示例理解泛型的使用。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号