- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C#泛型详解
2009年03月28日 星期六 15:41
我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理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来实现这个栈:public class Stack??? {??????? private object[] m_item;??????? public object Pop(){...}??????? public void Push(object item){...}??????? public Stack(int i)??????? {??????????? this.m_item = new[i];??????? }????? ??? }这个栈写的不错,他非常灵活,可以接收任何数据类型,可以说是一劳永逸。但全面地讲,也不是没有缺陷的,主要表现在:当Stack处理值类型时,会出现装箱、折箱操作,这将在托管堆上分配和回收大量的变量,若数据量大,则性能损失非常严重。 在处理引用类型时,虽然没有装箱和折箱操作,但将用到数据类型的强制转换操作,增加处理器的负担。 在数据类型的强制转换上还有更严重的问题(假设stack是Stack的一个实例):Node1 x = new Node1();??????????? stack.Push(x);???????? Node2 y = (Node2)stack.Pop();上面的代码在编译时是完全没问题的,但由于Push了一个Node1类型的数据,但在Pop时却要求转换为Node2类型,这将出现程序运行时的类型转换异常,但却逃离了编译器的检查。针对object类型栈的问题,我们引入泛型,他可以优雅地解决这些问题。泛型用用一个通过的数据类型T来代替object,在类实例化时指定T的类型,运行时(Runtime)自动编译为本地代码,运行效率和代码质量都有很大提高,并且保证数据类型安全。使用泛型下面是用泛型来重写上面的栈,用一个通用的数据类型T来作为一个占位符,等待在实例化时用一个实际的类型来代替。让我们来看看泛型的威力:public class StackT??? {??????? private T[] m_item;??????? public T Pop(){...}??????? public void Push(T item){...}??????? public Stack(int i)??????? {??????????? this.m_item = new T[i];??????? }}类的写法不变,只是引入了通用数据类型T就可以适用于任何数据类型,并且类型安全的。这个类的调用方法://实例化只能保存int类型的类Stackint a = new Stackint(100);????? a.Push(10);????? a.Push(8888); //这一行编译不通过,因为类a只接收int类型的数据????? int x = a.Pop();//实例化只能保存string类型的类Stackstring b = new Stackstring(100);b.Push(10);??? //这一行编译不通过,因为类b只接收string类型的数据????? b.Push(8888);string y = b.Pop
您可能关注的文档
- 对C和C++语言内存的理解.doc
- 对体育教学中运动技能教学的看法与实地练习心得.doc
- 对外贸易案例分析.doc
- 对未来社会发展趋势的畅想.doc
- 对学生音乐学习评价的建议1.doc
- 对移动医疗未来市场的十大预测.doc
- 对引用和指针使用以及函数返回引用和指针类型的理解.doc
- 对英语学习的建议.doc
- 多叉树结合JavaScript树形控件实现无限级树形结构(一种构建多级有序树形结构JSON(或XML)数据源的方法).doc
- 多核编程-考前复习.doc
- 2024年黔南布依族苗族自治州公务员考试行测试卷历年真题带答案详解.docx
- 2025年兰州市公务员考试行测真题及完整答案详解.docx
- 2024年江西省公务员考试行测试卷历年真题附答案详解(实用).docx
- 2025年酉阳土家族苗族自治县公务员考试行测试卷历年真题及答案详解1套.docx
- 互联网金融平台资金存管安全性能评估与合规监管报告.docx
- 餐饮行业食品安全监管现状调研报告:2025年行业监管能力提升路径.docx
- 2025新能源汽车充电基础设施建设投资策略研究:充电桩市场占有率预测分析.docx
- 铁路货场改扩建项目2025年社会稳定风险评估与风险控制方法研究.docx
- 2025年新能源汽车充电设施建设资金申请报告:充电基础设施投资回报分析.docx
- 社交媒体平台在2025年文化传播与舆论引导中的网络暴力与心理健康报告.docx
文档评论(0)