仓酷云
标题:
ASP.NET教程之浅谈C#泛型的用途仓酷云
[打印本页]
作者:
飘飘悠悠
时间:
2015-1-18 11:16
标题:
ASP.NET教程之浅谈C#泛型的用途仓酷云
捆绑编译器。用户不需要受制于厂家,自己就能将程序在新平台上编译运行。除了牛B轰轰的linux,估计也没有系统捆绑c/c++的编译器,而且许多新平台都无法支持复杂的c/c++编译器在上面直接运行。
为何要利用C#泛型?
为了懂得这个成绩,我们先看上面的代码,代码省略了一些内容,但功效是完成一个栈,这个栈只能处置int数据范例:
publicclassStack{privateint[]m_item;publicintPop(){...}publicvoidPush(intitem){...}publicStack(inti){this.m_item=newint[i];}}
复制代码
下面代码运转的很好,可是,当我们必要一个栈来保留string范例时,该怎样办呢?良多人城市想到把下面的代码复制一份,把int改成string不就好了。固然,如许做自己是没有任何成绩的,但一个优异的程序是不会如许做的,由于他想到若今后再必要long、Node范例的栈该如何做呢?还要再复制吗?优异的程序员会想到用一个通用的数据范例object来完成这个栈:
publicclassStack{privateobject[]m_item;publicobjectPop(){...}publicvoidPush(objectitem){...}publicStack(inti){this.m_item=new[i];}}
复制代码
这个栈写的不错,他十分天真,能够吸收任何数据范例,能够说是与日俱增。但周全地讲,也不是没出缺陷的,次要体现在:
当Stack处置值范例时,会呈现装箱、折箱操纵,这将在托管堆上分派和接纳大批的变量,若数据量年夜,则功能丧失十分严峻。
在处置援用范例时,固然没有装箱和折箱操纵,但将用到数据范例的强迫转换操纵,增添处置器的包袱。
在数据范例的强迫转换上另有更严峻的成绩(假定stack是Stack的一个实例):
Node1x=newNode1();stack.Push(x);Node2y=(Node2)stack.Pop();
复制代码
下面的代码在编译时是完整没成绩的,但因为Push了一个Node1范例的数据,但在Pop时却请求转换为Node2范例,这将呈现程序运转时的范例转换非常,但却逃离了编译器的反省。
针对object范例栈的成绩,我们引进泛型,他能够文雅地办理这些成绩。泛型用用一个经由过程的数据范例T来取代object,在类实例化时指定T的范例,运转时(Runtime)主动编译为当地代码,运转效力和代码质量都有很年夜进步,而且包管数据范例平安。
利用C#泛型
上面是用泛型来重写下面的栈,用一个通用的数据范例T来作为一个占位符,守候在实例化时用一个实践的范例来取代。让我们来看看泛型的能力:
publicclassStack{privateT[]m_item;publicTPop(){...}publicvoidPush(Titem){...}publicStack(inti){this.m_item=newT[i];}}
复制代码
类的写法稳定,只是引进了通用数据范例T就能够合用于任何数据范例,而且范例平安的。这个类的挪用办法:
//实例化只能保留int范例的类Stacka=newStack(100);a.Push(10);a.Push("8888");//这一行编译欠亨过,由于类a只吸收int范例的数据intx=a.Pop();//实例化只能保留string范例的类Stackb=newStack(100);b.Push(10);//这一行编译欠亨过,由于类b只吸收string范例的数据b.Push("8888");stringy=b.Pop();
复制代码
这个类和object完成的类有一模一样的区分:
1.他是范例平安的。实例化了int范例的栈,就不克不及处置string范例的数据,其他数据范例也一样。
2.无需装箱和折箱。这个类在实例化时,依照所传进的数据范例天生当地代码,当地代码数据范例已断定,以是无需装箱和折箱。
3.无需范例转换。
实际常识:
所谓泛型:即经由过程参数化范例来完成在统一份代码上操纵多种数据范例。泛型编程是一种编程范式,它使用“参数化范例”将范例笼统化,从而完成更加天真的复用。
C#泛型付与了代码更强的范例平安,更好的复用,更高的效力,更明晰的束缚。
C#泛型才能由CLR在运转时撑持,区分于C++的编译时模板机制,和java的编译时的“搽拭法”。这使得泛型才能能够在各个撑持CLR的言语之间举行无缝的互操纵。
C#泛型代码在被编译为IL和元数据时,接纳特别的占位符来暗示泛型范例,并用专有的IL指令撑持泛型操纵。而真实的泛型实例化事情以“on-demand”的体例,产生在JIT编译时。
C#泛型编译机制以下:
第一轮编译时,编译器只为Stack范例发生“泛型版”的IL代码和元数据,其实不举行泛型范例的实例化,T在两头只充任占位符。
JIT编译时,当JIT编译器第一次碰到Stack时,将用int范例交换“泛型版”IL代码与元数据中的T--举行泛型范例的实例化。
CLR为一切范例参数为“援用范例”的泛型范例发生统一份代码,但假如范例参数为“值范例”,对每个分歧的“值范例”,CLR将为其发生一份自力的代码。
C#泛型的几个特性
假如实例化泛型范例的参数不异,那末JIT编译器会反复利用该范例,因而C#的静态泛型才能制止了C++静态模板大概招致的代码收缩的成绩。
C#泛型范例照顾有丰厚的元数据,因而C#的泛型范例能够使用于壮大的反射手艺。
C#的泛型接纳“基类、接口、机关器、值范例/援用范例”的束缚体例来完成对范例参数的“显现束缚”,进步了范例平安的同时,也损失了C++模板基于“署名”的隐式束缚所具有的高天真性。
C#泛型类在编译时,师长教师成两头代码IL,通用范例T只是一个占位符。在实例化类时,依据用户指定的数据范例取代T并由立即编译器(JIT)天生当地代码,这个当地代码中已利用了实践的数据范例,同等于用实践范例写的类,以是分歧的关闭类的当地代码是纷歧样的。依照这个道理,我们能够如许以为:泛型类的分歧的关闭类是分离分歧的数据范例。
如许泛型不但加倍天真,也同时将代码的烦琐和进步到一个条理!不必再为详细分歧的重载办法写详细的代码了!
J2EE比较成熟一点,一些比较出名的企业应用软件都是基于J2EE的。以后的发展就不好说了。不过net网页编程比较烦,学.net的话,微软把很多工具都封装好了,学起来可能容易一点。
作者:
乐观
时间:
2015-1-20 18:59
现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。
作者:
谁可相欹
时间:
2015-1-29 15:06
ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
作者:
深爱那片海
时间:
2015-2-6 02:16
主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。
作者:
冷月葬花魂
时间:
2015-2-7 02:54
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
作者:
透明
时间:
2015-2-12 15:51
市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。
作者:
山那边是海
时间:
2015-3-3 03:45
这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。
作者:
小魔女
时间:
2015-3-6 05:05
ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。
作者:
分手快乐
时间:
2015-3-8 08:37
以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。
作者:
莫相离
时间:
2015-3-15 21:10
那么,ASP.Net有哪些改进呢?
作者:
变相怪杰
时间:
2015-3-22 04:26
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2