C#学Java:东施效颦

<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; /* 336x280, 创建于 07-11-21 */ google_ad_slot = "0989131976"; google_ad_width = 336; google_ad_height = 280; // </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> C#和Java都是不错的语言。它们用类似的方式达到了类似的目标,而且C#在Java的基础上增加了一些更“优美”的语法,比如foreach关键字以及用起来更加舒服的extends/implements结构。令人遗憾的是,这些改进对语言的总体影响却因某些方面的退化而大打折扣。本文要比较这两种语言,同时尽量避免掉到JVM和CLR的泥沼中而不能自拔。 Java:对C 进行彻底去芜存菁 比较Java和C#时,不可避免地会注意到两者的相似性,这部分是缘于两者共同的老祖宗:C和C 。但是,当James Gosling率领他的团队开发Java时,不仅从C 那里借鉴了大量功能,而且更重要的是,他们摒弃了C 中容易出错和难以学习的特性。C#的设计者也像Java那样添加了大量C 特性,只是忘了移除C 的一些不好的特性。结果就是一种试图为任何人做任何事的语言,造成内部容易产生冲突,而且极度复杂。 令人恼火的语法缺陷 在流程控制和语法中最容易挑出错误。C#提供了goto命令,用于更改程序的执行点。但早在1968年由Edsger W. Dijkstra发表的“Go To语句有害论”一文中,计算机科学家便已齐声反对goto。goto造成代码难以调试,而且难以通过测试覆盖(test coverage)工具。 而且和一般看法不同的是,运算符重载具有同样的缺陷,而且它造成的错误更难以发现。如果' '依据操作数的类型而具有不同的含义,那么代码的运行就不再是透明的,会出现大量不可预料的副作用。 C#安全性更差 C#提供了一个简单的机制,可将部分代码标记为unsafe(不安全)。在这些不安全区域中,由Java和C#所提供的防止程序员直接改变内存位置以及使用指针算术的安全机制会暂时失效,代码的安全性将受到质疑。但是,在采用了垃圾回收机制的高级语言中,如果下降到内存地址一级上进行操作,不可避免地会妨碍内部的对象/内存隔离。就像在C和C 中已经臭名昭著的那样,这很容易引入错误,调试会变成一场噩梦,缓冲区溢出会再次泛滥,造成许多安全漏洞。 C#还允许简单地访问主机系统上的原生库。“与非.NET对象绑定”类似于Java原生接口(JNI)所提供的功能,只是前者更危险。JNI通过良好定义的接口,小心限制了Java代码和原生代码之间的交互。相反,.NET虽然大幅简化了对原生对象文件的调用,但开发者如果滥用这一功能,很容易就会破坏平台间的移植性。 SOAP集成 C#和.NET中的大多数组件都同SOAP Web服务紧密集成。SOAP是使用XML来指定参数和结果值,并发出远程过程调用的一项出色标准。但它并不是你惟一的选择。使用为Web服务设计的扩展库,Java开发者可轻松改变其Web服务的形式,可将其变成SOAP、XML-PRC或者其他尚未发明的任何东西。当然,C#开发者也能选择为非SOAP Web服务提供的外部库,但SOAP标准的紧密集成更像是一种限制,而非改进。 最令人担忧的是微软 C#最容易引起恐慌的或许就是它的所有者,即微软公司。微软曾做过为非Windows平台开放C#和.NET的演示,但那仅仅是一个演示。它为非Windows平台提供的CLR存在大量问题,bug一大堆。C#已通过了ECMA标准化过程,这一步是Sun至今不敢为Java迈出的。人们的担心来源于微软对自己的产品施加的专利保护。微软已申请了一个专利,它会禁止第三方的CLR,比如Mono项目。如果微软下定决定对免费C#和.NET社区进行制裁,就会不可避免地挥舞起金钱和法律的大棒,将所有开发者都赶回Win32平台,这显然会令人感到非常不快。 另一方面,Java语言不是一项ECMA标准,这或许是Sun公司最应该感到羞愧的一个地方。不过,它的实现没有专利的麻烦,而且无论它的虚拟机还是核心类库,都由第三方提供了开放源码和封闭源码这两种实现方式。C#表面看似乎是免费的,但其实不然。Java看起来是受到限制的,但却能合法地以免费形式实现。 最后,Java提供了更好的工具支持,即便是在考虑到集成开发环境(IDE)的情况下。Visual Studio .NET是一个不错的IDE。它是多年来许多人工作的结晶,提供了丰富的特性。但是,无论在稳定性、易用性还是提供的特性方面,Eclipse IDE(包括Java支持)都已超越了Visual Studio。IBM在Eclipse上投入了许多。Visual Age可以说是IBM的第一次尝试,目前已经放弃,但新一代的Eclipse足可傲视群伦。而且即使你坚持使用C#,那么一个好消息是,.NET版本的Eclipse目前正在开发中。 不算太坏,只是比不上Java 老实说,C#并没有什么特别的坏处。它的缺点不像Visual Basic那么明显,而且也不像C那样一定要让开发者去自寻烦恼。但是,C#并不能做比Java更多的事情,而且在某些领域显得更糟。如果要对这两种很大程度上相似的语言做出选择,请选择Java,它是一种更好的、经过更多实际检验的语言。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值