java与C#的⽐较
⼀、C#和java哪个更好?
eclipse哪个版本好⼏天前,我的北理⼯研究⽣⾯试,⽼师问了我这样⼀个问题,你认为C#和java哪个更好?那么,作为读者的你,会怎么回答这道题呢?
其实,在我看来,这道题⽆⾮是想问你c#和java有什么异同。同为开发语⾔,并不能说哪个更好,可能你某⼀种语⾔熟练,你会认为它好,但是如果你对两种语⾔都很熟练的话,你会认为,各有千秋。
那么,下⾯就分析⼀下C#和java到底有什么异同。 C#和Java⽐较,号称90%的相同加上10%的不同。
⼆、从功能⽐较
⽐较起Java和C#⼤相径庭的那10%,会发现C#五花⼋门的特性要多很多。⽐较知名的有:委托,属性,真正的泛型,索引器,类初始化器,分部类,操作符重载,struct,unsafe代码,IDisposable等,另外。net framework 3.5还加了⼀⼤串纯粹由编译器提供的特性。
委托,这个可以算是C#之于Java的最⼤优势。虽然Java可以依靠接⼝,匿名内部类这些特性实现委托⼀样的功能,但却要⿇烦许多,如果涉及到N个委托实例相加的情况,那么⼀个C#⾥⾯简单的"+"号,在Java⾥就只能⽤
FilterChain,InterceptorStack这种概念了。
真正的泛型,这个⼜是⼀⼤C#的优势,同时伪泛型⼜是Java的⼀⼤败笔。但是Java年代⽐较长,为兼容性考虑不得不使⽤假的泛型实现。如果泛型不是在jdk1.5时推出,⽽是在jdk1.4,和collection framework⼀起推出,我认为它也会采⽤真正的泛型实现。
索引器,有了这个很多容器类都可以直接⽤[]取元素,感觉还不错,⽐没有好,编译器的⼩把戏。类初始化器,典型的懒汉特性。每次⽤顶多能省下⼀两⾏代码,⼜是编译器的⼩把戏。分部类(partial class),纯粹为了vs的那⼀⼤堆图形化设计器⽼和⼈的代码冲突⽽搞出来得玩意,⼜是编译器的⼩把戏。
操作符重载,属于⽤到得不多,要⽤时却显得特别有⽤的东西。struct,在堆栈上的东西,释放内存那是超级的快,只不过需要⽤到这个的场合,⼤概都在使⽤C++编程。unsafe代码,纯粹增加语⾔复杂性的东西。就好像⼀个⼈搬家,看这个不舍得扔,那个也不舍得扔,搞到最后把瓶瓶罐罐都搬⾛了。IDisposable,实现这个接⼝,配合using块,⾮常的强⼤,终于可以像C++那样掌握对象的销毁了。
接着说说Java⽐C#多的特性:
匿名内部类:真是极端⽅便的⼀个东西,还和Java的好多设计模式有关系。
动态代理: Java⾥⾯要实现AOP,易如反掌;C#要实现AOP,相对较难,不得不借助Assamble命名空间下的那些动态IL⽣成⼯具或者使⽤。这就是动态代理的作⽤。
希望有⼀天C#可以拥有匿名内部类和动态代理,变得更完善。也希望Java也可以有委托等。
三、从应⽤⽐较
相似性:
Java和C#都是⼀门⾯向对象的语⾔,Java更多地借鉴了C++的优点,⽽摒弃了它的⼀些不太容易被⼈掌握的知识点(有些不能说是缺点),并且增加了⼀些⾃⼰的特点,⽽C#则是更多地借鉴了Java的优点,⽽增加了⼀些⾃⼰的特点。也就是说Java站在C++的肩膀上,⽽C#站在了Java的肩膀上。
跨平台特性
跨平台特性的最⼤优点就是只要有相应的运⾏环境,同⼀个编译好的程序就能在上⾯运⾏,⽽不需要重新编译程序,它的缺点就是不能针对特定平台,所以不能充分利⽤平台特性,因⽽在性能上会有所降低,幸运的是现在的硬件⽐以前⼤⼤提⾼,这部分的降低在绝⼤部分情况下可以不⽤考虑。⽽且Java和C#都有⾃动垃圾回收机制,运⾏时环境可以⾃动清理不再使⽤的内存,减少了⼿动释放内存的风险。
Java的跨平台特性建⽴在可以跨越多个不同种类的操作系统平台,⽐如Windows、Linux、Unix等,但是需要注意的是不是说Java能在所有的系统上都能跨平台,必须实现在该操作系统上的Java运⾏时环境JRE才⾏,也就是说假如今天有⼈开发了⼀个前所未有的系统,这时候Java程序是不能在上⾯运⾏的——因为还没有针对这个操作系统的Java虚拟机(JVM),好在在当今绝⼤部分操作系统上都有针对该系统的JVM,所以它能“⼀次编译,到处运⾏”。
C#的跨平台则是建⽴跨Windows平台的基础上的(有⼀个针对⾮Windows的运⾏环境,不过好像还不是太好),不像以前Windows95下的程序到WindowsXP下就不能运⾏,或者WindowsXP下的程序到Windows95下也不能运⾏(这种情况居多),现在呢,只要安装⼀个 framework(也就是程序的运⾏时环境),在Windows2003下编写的程序不⽤重新编译就能在Windows98下运⾏,只要这台安装Windows98的机⼦安装了程序的运⾏时环境。
语法特性
Java抛弃了指针,使⽤了包(package)的概念,导⼊包使⽤import语句,在Java中有⼏种⾮⾯向对象的数据类型,那就是byte、char、short、int、long、float、double这⼏种数据类型,在⽅法中传递时仅仅是传递它们的值,为了⽅便⼀些集合类的操作(它们存储的是对象类型),⼜增加了它们的包装类Byte、Char、Short、Integer、Long、Float、Double。在Java 中存在属性的概念,这些都是通过setXXX()、getXXX()来设置。
C#没有完全抛弃指针(在unsafe状态下还可以操作指针),对于类的管理采⽤了名称空间(namespace)的概念,并且还使⽤了out、ref等关键字,便于从⼀个⽅法返回多个结果,在C#中不仅存在属性,还有索引器等⽐较⽅便的特性。
⽣成⽂档doc⽂档
在利⽤程序中的特殊注释⽣成api⽂档⽅⾯,两种语⾔都有不错的表现,不过C#更胜⼀筹,它能利⽤注释在输⼊类成员时提⽰,便于程序员不⽤去看程序源码⽽知道程序的⼤概⽤途,⽽Java这⽅⾯没有。
IDE(集成开发环境)⽅⾯
Java的IDE是⾮常多,从庞⼤的Jbuilder到⼩巧的Jcreator,还有可以扩充的Eclipse,可以说Java的IDE的数量是⾮常多的。 C#的IDE不多,除了微软⾃⼰的VS.NET之外,好像还有Borland的C#Builder,除此之外,⼴为认知好像不多。
性能⽅⾯
Java采⽤了字节码(bytecode),⽽C#则采⽤了MSIL,它们的性能都是介于解释型语⾔和⽣成本地机器代码之间的,在⼀些测试中,C#的性能略⾼于Java,可能Java的字节码要适⽤多个系统多个平台的缘故吧。
企业开发⽅⾯
由于Java出现的时间长的缘故,并且还能跨平台,采⽤EJB等解决⽅案,所以⽬前绝⼤部分⽹站都是基于J2EE开发的(⼤部分都是J2EE+MySQL+Apache+Linux,都是免费的)。
C#做的⼤型⽹站,它也有针对EJB的Net Remoting技术,由于它限制了必须(IIS+Windows),所以⼤型的⽹站不是太多,不过随着时间的推移,可能会有更多的⽹站采⽤asp技术。毕竟微软的东西⼀向傻⽠化,门槛低,能够吸引⼀些初级编程⼈员到这个⾏列中来。⽽且微软的asp采⽤了代码和页⾯分离技术,的确能⽅便编程⼈员。
四、总结
记得在⽹上看到过⼀句话,⼤意是这样的,Linux就像专业相机,拍摄出来的照⽚取决于你的摄影技术;⽽Windows就像傻⽠相机,只要会按快门就能拍照。我觉得Java就像Linux,添加⼀个按钮,⼀个标签都需要你指定样式,放置到哪⾥也需要你指定;⽽C#则继续秉承了Windows的特点,傻⽠化,便于操作,便于上⼿。所以说,各有千秋并没有哪个更好,看你对他们的了解和使⽤。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论