无私分享(C#高级编程第6版doc)第09章 泛型

无私分享(C#高级编程第6版doc)第09章 泛型

ID:42405747

大小:204.50 KB

页数:21页

时间:2019-09-14

无私分享(C#高级编程第6版doc)第09章 泛型_第1页
无私分享(C#高级编程第6版doc)第09章 泛型_第2页
无私分享(C#高级编程第6版doc)第09章 泛型_第3页
无私分享(C#高级编程第6版doc)第09章 泛型_第4页
无私分享(C#高级编程第6版doc)第09章 泛型_第5页
资源描述:

《无私分享(C#高级编程第6版doc)第09章 泛型》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、目录第9章泛   型29.1 概述29.1.1 性能29.1.2 类型安全39.1.3 二进制代码的重用39.1.4 代码的扩展49.1.5 命名约定49.2 创建泛型类49.3 泛型类的特性89.3.1 默认值99.3.2 约束99.3.3 继承119.3.4 静态成员129.4 泛型接口129.5 泛型方法139.6 泛型委托159.6.1 执行委托调用的方法159.6.2 对Array类使用泛型委托179.7 Framework的其他泛型类型199.7.1 结构Nullable199.7.2 EventHandler

2、rgs>209.8 小结21第9章泛   型CLR2.0的一个新特性是泛型。在.CLR1.0中,要创建一个灵活的类或方法,但该类或方法在编译期间不知道使用什么类,就必须以Object类为基础。而Object类在编译期间没有类型安全性,因此必须进行强制类型转换。另外,给值类型使用Object类会有性能损失。CLR2.0(.NET3.5基于CLR2.0)提供了泛型。有了泛型,就不再需要Object类了。泛型类使用泛型类型,并可以根据需要用特定的类型替换泛型类型。这就保证了类型安全性:如果某个类型不支持泛型类,编译器就会生成错误。泛型是一个很强大的特

3、性,对于集合类而言尤其如此。.NET1.0中的大多数集合类都基于Object类型。.NET从2.0开始提供了实现为泛型的新集合类。泛型不仅限于类,本章还将介绍用于委托、接口和方法的泛型。本章的主要内容如下:● 泛型概述● 创建泛型类● 泛型类的特性● 泛型接口● 泛型方法● 泛型委托● Framework的其他泛型类型9.1 概述泛型并不是一个全新的结构,其他语言中有类似的概念。例如,C++模板就与泛型相当。但是,C++模板和.NET泛型之间有一个很大的区别。对于C++模板,在用特定的类型实例化模板时,需要模板的源代码。相反,泛型不仅是C#语言

4、的一种结构,而且是CLR定义的。所以,即使泛型类是在C#中定义的,也可以在VisualBasic中用一个特定的类型实例化该泛型。下面介绍泛型的优点和缺点,尤其是:● 性能● 类型安全性● 二进制代码重用● 代码的扩展● 命名约定9.1.1 性能泛型的一个主要优点是性能。第10章介绍了System.Collections和System.Collections.Generic命名空间的泛型和非泛型集合类。对值类型使用非泛型集合类,在把值类型转换为引用类型,和把引用类型转换为值类型时,需要进行装箱和拆箱操作。注意:装箱和拆箱详见第6章,这里仅简要复习

5、一下这些术语。值类型存储在堆栈上,引用类型存储在堆上。C#类是引用类型,结构是值类型。.NET很容易把值类型转换为引用类型,所以可以在需要对象(对象是引用类型)的任意地方使用值类型。例如,int可以赋予一个对象。从值类型转换为引用类型称为装箱。如果方法需要把一个对象作为参数,而且传送了一个值类型,装箱操作就会自动进行。另一方面,装箱的值类型可以使用拆箱操作转换为值类型。在拆箱时,需要使用类型转换运算符。下面的例子显示了System.Collections命名空间中的ArrayList类。ArrayList存储对象,Add()方法定义为需要把一个

6、对象作为参数,所以要装箱一个整数类型。在读取ArrayList中的值时,要进行拆箱,把对象转换为整数类型。可以使用类型转换运算符把ArrayList集合的第一个元素赋予变量i1,在访问int类型的变量i2的foreach语句中,也要使用类型转换运算符:ArrayListlist=newArrayList();list.Add(44);  //boxing-convertavaluetypetoareferencetypeinti1=(int)list[0];  //unboxing-convertareferencetypetoavaluety

7、peforeach(inti2inlist){Console.WriteLine(i2);  //unboxing}装箱和拆箱操作很容易使用,但性能损失比较大,迭代许多项时尤其如此。System.Collections.Generic命名空间中的List类不使用对象,而是在使用时定义类型。在下面的例子中,List类的泛型类型定义为int,所以int类型在JIT编译器动态生成的类中使用,不再进行装箱和拆箱操作:Listlist=newList();list.Add(44);  //noboxing-valuetyp

8、esarestoredintheListinti1=list[0];  //nounboxing,nocastneededforeach(i

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

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

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