《C Sharp 3.0从基础到项目实战》课件第10章类型参数化-泛型.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《C Sharp 3.0从基础到项目实战》课件第10章类型参数化-泛型.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C Sharp 3.0从基础到项目实战 C Sharp 3.0从基础到项目实战课件第10章 类型参数化泛型 3.0 基础 项目 实战 课件 10 类型 参数 泛型
- 资源描述:
-
1、 泛型(泛型(Generic)是)是CLR 2.0相对于相对于CLR 1.0新增的一个特新增的一个特性。在此前的性。在此前的CLR 1.0中,如果要创建一个灵活的类或方中,如果要创建一个灵活的类或方法,并且该类或方法需要在代码编译后才能确定类型,那法,并且该类或方法需要在代码编译后才能确定类型,那么就必须以么就必须以Object类为基础。但是类为基础。但是Object类在编译期间类在编译期间是无法保证类型安全的,这是因为任何类型都可以转换为是无法保证类型安全的,这是因为任何类型都可以转换为Object类。然而类。然而Object类转换为其他类型都将使用强制类转换为其他类型都将使用强制类型转换的
2、方法,这就容易造成类型转换错误,且将值类类型转换的方法,这就容易造成类型转换错误,且将值类型转换为型转换为Object类会为造成性能损失。类会为造成性能损失。针对上述问题,针对上述问题,CLR 2.0提供了泛型。有了泛型,就不需提供了泛型。有了泛型,就不需要使用要使用Object类了。泛型类可以根据需要,使用特定类型类了。泛型类可以根据需要,使用特定类型替换泛型类型,从而保证了类型安全性。当某个类型不支替换泛型类型,从而保证了类型安全性。当某个类型不支持泛型类时,编译器就会生成错误代码。持泛型类时,编译器就会生成错误代码。章节内容章节内容10.1 泛型概述泛型概述10.2 泛型类泛型类10.3
3、 泛型方法泛型方法10.4 泛型类的特性泛型类的特性10.5 小结小结10.1.1 泛型的概念泛型是对泛型是对CLR类型系统的一种扩展,用于定义某些细节类型系统的一种扩展,用于定义某些细节未指定的类型,通过参数化类型来实现在同一段代码上未指定的类型,通过参数化类型来实现在同一段代码上操作多种数据类型。操作多种数据类型。10.1.2 泛型的优点1性能性能2类型安全性类型安全性3二进制代码的重用二进制代码的重用4代码的扩展代码的扩展10.1.3 泛型的参数命名准则 务必使用具有描述性的名称为泛型类型参数命名,除非单个字母务必使用具有描述性的名称为泛型类型参数命名,除非单个字母的名称即可表示其含义,
4、而描述性名称不会包含更多含义。的名称即可表示其含义,而描述性名称不会包含更多含义。public interface ISessionChannel /*.*/public delegate TOutput Converter(TInput from);public class List /*.*/可以考虑以可以考虑以T作为具有单个字母类型参数的类型的类型参数名,作为具有单个字母类型参数的类型的类型参数名,例如下列代码。例如下列代码。public int IComparer()return 0;public delegate bool Predicate(T item);/定义了一个泛型委托定义
5、了一个泛型委托public struct Nullable where T:struct /*.*/使用泛型约束,使用泛型约束,参见参见10.4.2节节 通常将通常将“T”作为描述性类型参数名的前缀,代码如下。作为描述性类型参数名的前缀,代码如下。public interface ISessionChannel TSession Session get;10.2.1 泛型类的定义与实例化 定义泛型类的语法形式如下:定义泛型类的语法形式如下:访问修饰符访问修饰符 class类名类名 类体类体 其中,尖括号中是类型参数列表,类型参数列表可以由多个类型参数构成,其中,尖括号中是类型参数列表,类型参数
6、列表可以由多个类型参数构成,多个类型参数之间用逗号隔开。类型只是占位符,一般使用大写的多个类型参数之间用逗号隔开。类型只是占位符,一般使用大写的“T”、U”、“V”等作为类型参数。等作为类型参数。例如:例如:class Node private T data;public Node next;/省略其他代码省略其他代码10.2.1 泛型类的定义与实例化 在实例化泛型类时,需要使用具体的类型(如在实例化泛型类时,需要使用具体的类型(如int、double、string或者一个自定义类等)来代替类型参数,这样就可以在或者一个自定义类等)来代替类型参数,这样就可以在实例化泛型类时指定不同类型,生成具
7、有不同类型的实例。实例化泛型类时指定不同类型,生成具有不同类型的实例。泛型类的实例化语法形式如下:泛型类的实例化语法形式如下:类名类名 实例名实例名=new 类名类名(构造构造函数的实参函数的实参);对于上面定义的泛型类对于上面定义的泛型类Node,实例化时的代码如下。,实例化时的代码如下。class program public static void Main()Node MyNode=new Node();/省略其他代码省略其他代码 10.2.2 常用的泛型集合类泛型集合类非泛型集合类泛型举例ListArrayListList dinosaurs=new List();Dictionar
8、yHashtableDictionaryopenWith=new Dictionary();openWith.Add(txt,notepad.exe);QueueQueueQueue numbers=new Queue();number.Enqueue(one);StackStackStack numbers=new Stack();numbers.Push(one);numbers.Pop();SortedListSortdListSortedListopenWith=new SortedLst();openWith.Add(txt,notepad.exe);openWith.TryGetV
9、alue(tif,out value);10.3 泛型方法泛型方法是使用类型参数声明的方法。定义泛型方法的泛型方法是使用类型参数声明的方法。定义泛型方法的语法形式如下。语法形式如下。static void Swap(ref T lhs,ref T rhs)T temp;temp=lhs;lhs=rhs;rhs=temp;10.3 泛型方法下列代码演示一种使用下列代码演示一种使用int作为类型参数的方法调用方作为类型参数的方法调用方式。式。static void TestSwap()int a=1;int b=2;Swap(ref a,ref b);System.Console.WriteLin
10、e(a+b);10.4.1 默认关键字 在泛型类和泛型方法中会产生一个问题,在如下情况未知时,如何将默认值分配给参数化类型T?T是引用类型还是值类型。如果T为值类型,则它是数值还是结构。给定参数类型T的一个变量t,只有当T为引用类型时,语句t=null才会有效;只有当T为数值类型而不是结构时,语句t=0才会有效。解决方案为,使用default关键字。【例例10-4】default关键字演示关键字演示public class GenericList public T GetNext()T temp=default(T);/使用使用default关键字来给关键字来给temp初始化初始化 Node
展开阅读全文