来一篇关于NET的不异中的分歧:Java程序员应当中断低看C#
也不知道,我同学昨天说数据挖掘很好。<p>【51CTO.com5月24日外电头条】我们创建的开辟网站kalistick算是个Java专营店了,从一入手下手的初版起,全体产物利用的都是Java代码,但我们其实不偏执,从2008年入手下手,我们也入手下手剖析和利用C#。我注重到Java开辟者多数在对待C#的时分几带些蔑视,就仿佛这是一只微软仿制的盗窟猫,笨伯和软蛋们才会用它。我在博客中入手下手扫除这些看法和曲解,展现C#的各种优点。Java和C#的不异的地方比分歧处要多很多:两种言语都是写在年夜括号里的,就像C和C++,范例都是静态、强范例和显式形状,两种言语都是基于类的面向工具言语,二者用的都是运转时编译的思绪,而且很好的利用了渣滓处置。
以是这篇文章里,我要重点谈谈它们的不异点,和C#的奇妙的地方。
51CTO保举专题:VisualStudio退化史
一致范例体系(Unifiedtypesystem)
在Java中,原始数据范例(byte、int、bool、float、char等)和其他的类分歧,它们其实不算是面向工具,也反面援用范例共享不异的先人类,但它们是有本人的包装类的,用来代表本人而且用来拔出到工具布局中(比方int利用Integer类),如许做能够进步功能。
在另外一边,C#的一致范例体系却都是从一个公用的根范例System.Object类中衍生而来的,即便是原始数据范例。一切的数据都要用到工具办法(ToString、Equal、GetHashCode等),以是你会碰上像3.ToString()如许的表达式,这类把办法夹杂到后缀,就带来了dsl作风的语句:
TimeSpanworkingTime=7.Hours()+30.Minutes();
这么做的美好的地方在于当开辟者把数据范例当作值来利用时,它们可以和Java的原始范例一样高效,只要在想要把它们当作工具利用时,体系才必要利用boxing/unboxing来分派堆内存。
显式虚办法(Explicitvirtualmethod)
在Java中,默许一切的办法都是虚办法(固然这些办法可使用final封装起来而不同意掩盖),而C#则分歧,假如想在C#中写一个虚办法,必需先要用virtual关头字显式声明一下。
有几种缘故原由决意了如许的选择,起首是功能上的思索:虚办法都有一个悬在头上的功能成绩,由于它们不是一般的内联,必要经由过程vtable来举行挪用,这类做法其实不间接(Sun的JVM能够内联上最常常挪用的虚办法)。第二个也是更主要的缘故原由就是版本成绩:C#的计划思绪是向后兼容,因而分歧版本类库中的基类和衍生类是能够退化开展和坚持兼容的。比方,C#可以完整撑持基类中新到场的成员和衍生类中的成员同名,而不会招致没法意料的毛病。最初一点是可读性:开辟者的编程企图可以十分分明的读出来。在Java中,假如开辟者不写出Overrideannotation的话,你不会晓得他究竟是不是想要重写这个办法。
classMeme{publicvirtualvoidSpread(){}}classThreeHundred:Meme{publicoverridevoidSpread(){Console.Write("Thisissparta!");}}classDbz:Meme{//NotamethodoverridepublicvoidSpread(){Console.Write("Itsoverninethousaaannnd!");}}
真实的泛型(TrueGeneric)
关于泛型,Java和C#显现出语法上的类似性,但真正深切了解以后你会发明这两种言语在泛型处置上的不同很年夜。
Java的泛型是在编译器中处置的,运转时其实不体贴泛型范例。Java在编译中利用叫做范例擦除转换的泛型类与办法:一切的泛型范例都被它们的原始版本交换,而且会在客户代码中拔出cast和范例反省,天生的字节代码中其实不包括任何泛型范例或参数的援用。Java的泛型是让你在语法编写上尝到长处,但不会让你的使用实行起来更无效。
而C#的泛型其实不满是言语上的功效,它是安排在CLR(CommonLanguageRuntime,相称于JVM)中的。在编译时必要举行泛型范例反省考证,但指定范例会推延到类装载时天生。代码挪用时的泛型是完整编译的,并且能够假定泛型在范例上是平安的,这被称为泛型的详细化。和Java分歧,C#不必要拔出cast大概范例反省。泛型范例和办法能够经由过程援用(class、delegate、interface等)和值范例(primitivetype、struct、enum等)来创立。
C#中泛型的利用可以带来效力的进步(不必要cast和值范例的boxing/unboxing),还可以进步深条理的平安考证和反应才能。
publicvoidAwesomeGenericMethod(Tt)whereT:new(){TnewInstance=newT();//CausesatypecreationerrorinJavaT[]array=newT;//CausesgenericarraycreationerrorinJavaTdefaultValue=default(T);Typetype=typeof(T);Listlist=newList();}//GenericwithsamenamebutadifferentnumberofgenerictypepublicvoidAwesomeGenericMethod(Tt,Uu)whereT:new(){}
Oracle的Java平台总架构师MarkReinhold在Devoxx2011年夜会上已经切磋过给Java增加泛型的详细化成绩,但这项功效还没有计划进Java的下一个次要版本中。
告辞被反省非常(checkedexception)
Java和C#的非常反省事情差未几一样,两者独一的次要区分是:Java中包括了checkedexception如许的非常。在Java里你能够在办法声明中抛出ExceptionType,如许做能够强制任何挪用办法的函数来处置非常。这个设法在纸面上说说很好,但实践利用中却很烦人,并且带来了新成绩。
版本成绩:在新版本的办法声明中到场一个checkedexception会损坏客户代码,就像给一个接口增加办法一样。好比在版本1中你创立了一个foo办法,声明抛出非常A和B,在版本2中你增加了一些新功效,抛出非常D,这就是一个损坏性变更,由于现有的挪用程序不克不及处置这个非常。
<p>扩大性成绩:在年夜范围的使用项目中,互相依附的事情长短常多的,因而抛出的非常会多的难以统计,开辟者常常会其实Java之所以在曾经独步天下,就是因为他的跨平台、安全性,这两方面,效率可不是Java的强项,反而是他最短的一块挡板,虽然net总是用理论证明比.NET快。 Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境! 那么,ASP.Net有哪些改进呢? 是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。 ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。 对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。 关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。 逐步缩小出错代码段的范围,最终确定错误代码的位置。 asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!
页:
[1]