- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
泛型
什么是泛型
泛型是2.0版C#语言和公共语言运行库(CLR)中的一个新功能。泛型将类型参数的概念引入 .NET Framework ,类型参数使得
设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛 型类型参数T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险
为什么要使用泛型
我感觉泛型的最主要特点是减少了代码的重用性,保护了类型安全,减少了拆装箱的操作从而提高了性能
举例说明
我们在编写程序时,经常遇到两个模块的功能非常相似, 只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,
但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类型不同。有没有一种办法,在方法中传入通用的数据类型,这 样不就可以合并代码了吗?泛型的出现就是便可以轻松解决这个问题。
比如编写一个处理int类型的栈
public class Stack
{
private int [] m_item;
public int Pop(){...}
public void Push( int item){...} public Stack( int i)
this .m_item = new int [i];
上面代码运行的很好,但是,当我们需要一个栈来保存 string类型时,该怎么办呢?很多人都会想到把上面的代码复制一份,把 int改成
string不就行了。当然,这样做本身是没有任何问题的,但一个优秀的程序是不会这样做的,因为他想到若以后再需要 long、Node类型
的栈该怎样做呢?还要再复制吗?优秀的程序员会想到用一个通用的数据类型 object来实现这个栈:
object 类型通用的栈
暨
1
public
class Stack
2
{
3
private
object [] m_item;
4
public
object Pop(){...}
5
public
void Push( object item){...}
6
public
Stack( object i)
7
{
8
this .m」tem = ne^{i];
9
}
10
}
这个栈写的不错,他非常灵活,可以接收任何数据类型,可以说是一劳永逸。但全面地讲,也不是没有缺陷的,主要表现在: 当Stack处理值类型时,会出现装箱、折箱操作,这将在托管堆上分配和回收大量的变量,若数据量大,则性能损失非常严重。 在处理引用类型时,虽然没有装箱和折箱操作,但将用到数据类型的强制转换操作,增加处理器的负担。
在数据类型的强制转换上还有更严重的问题(假设 stack是Stack的一个实例):
Nodel x = newNode1();
2
stack.Push(x);
4
Node2 y = (Node2)stack.Pop();
上面的代码在编译时是完全没问题的,但由于 Push 了一个Nodel类型的数据,但在 Pop时却要求转换为 Node2类型,这将出现程序运 行时的类型转换异常,但却逃离了编译器的检查。
针对object类型栈的问题,我们引入泛型,他可以优雅地解决这些问题。泛型用用一个通过的数据类型 T来代替object ,在类实例化时指
定T的类型,运行时(Run time )自动编译为本地代码,运行效率和代码质量都有很大提高,并且保证数据类型安全。
使用泛型实现这个栈
下面是用泛型来重写上面的栈, 用一个通用的数据类型 T来作为一个占位符,等待在实例化时用一个实际的类型来代替。 让我们来看看泛型
的威力:
public class StackT
{
private T[] m」tem;
public T Pop(){...}
public void Push(T item){...}
public Stack( int i)
{
this .m」tem = newT[i];
}
}
类的写法不变,只是引入了通用数据类型 T就可以适用于任何数据类型,并且类型安全的。这个类的调用方法:
//实例化只能保存int类型的类
Stackvint a = new Stackint(1OO);
a.Push(10);
a.Push(8888); // 这一行编译不通过,因为类 a只接收int类型的数据
int x = a.Pop();
//实例化只能保存string类型的类
Stackvstri ng b = new Stackvstri ng(100);
b.Push(IO); //这一行编译不通过,因为类 b只接收string类型的数据
b.Push(8888);
stri ng y = b.Pop();
这个类和obj
您可能关注的文档
最近下载
- EJA压力变送器说明书.pdf VIP
- ACS800故障代码大全.pdf VIP
- 铁路分公司社会招聘公告.doc VIP
- 第5章过渡金属氧硫化物催化剂及催化作用ppt课件.ppt
- 建筑设计任务书模板.doc VIP
- 一种基于GWO-DBO算法的Web微服务组合优化方法.pdf VIP
- 数学(第七版 下册)(机械建筑类)目录.pptx VIP
- [中国地图出版社初中地理七年级复习提纲.doc VIP
- 税收实务说课稿徐桂峰.doc VIP
- ISO 10009-2024 Quality management. Guidance for quality tools and their application 质量管理. 质量工具及其应用指南.pdf
原创力文档


文档评论(0)