新事物的产生大部分是为了解决存在的问题而产生的,当前编程语言能存在并占据市场一定份额,一定是各有千秋。
那么,下面就分析一下 C#和java到底有什么异同。 C#和Java比较,号称90%
的相同加上10%
的不同。
比较起Java和C#大相径庭的那10%,会发现C#五花八门的特性要多很多。比较知名的有:委托deligate,属性prop
,真正的泛型T,索引器[],类初始化器,分部类part class,操作符重载
,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.net
的那一大堆图形化设计器老和人的代码冲突而搞出来得玩意,又是编译器的小把戏。
操作符重载
,属于用到得不多,要用时却显得特别有用的东西。struct
,在堆栈上的东西,释放内存那是超级的快,只不过需要用到这个的场合,大概都在使用C++编程。unsafe
代码,纯粹增加语言复杂性的东西。就好像一个人搬家,看这个不舍得扔,那个也不舍得扔,搞到最后把瓶瓶罐罐都搬走了。IDisposable
,实现这个接口,配合using
块,非常的强大,终于可以像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的.net运行环境,不过好像还不是太好),不像以前Windows95下的程序到WindowsXP下就不能运行,或者WindowsXP下的程序到Windows95下也不能运行(这种情况居多),现在呢,只要安装一个.net framework
(也就是.net程序的运行时环境),在Windows2003下编写的.net程序不用重新编译就能在Windows98下运行,只要这台安装Windows98的机子安装了.net
程序的运行时环境。
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#中不仅存在属性,还有索引器等比较方便的特性。
在利用程序中的特殊注释生成api文档方面,两种语言都有不错的表现,不过C#更胜一筹,它能利用注释在输入类成员时提示,便于程序员不用去看程序源码而知道程序的大概用途,而Java这方面没有。
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(java Web)+MySQL(中小型数据库)+Apache(Web服务器)+Linux(操作系统)
,都是免费的)。此外,Java更多的是用于写后端程序较多
C#做的大型网站,它也有针对EJB的Net Remoting
技术,由于它限制了必须(IIS(微软Web服务器)+Windows
),所以大型的网站不是太多,不过随着时间的推移,可能会有更多的网站采用asp.net
技术。而且微软的asp.net
采用了代码和页面分离技术,的确能方便编程人员