在比较Java和C#的时候你不可能不注意到它们诸多的相似之处这在某种程度上要归结于它们共同的来源C和C++但是当Gosling和他的同事们坐下来创造Java的时候他们不仅吸取了C++的能力而且更重要的是他们减掉了一些无用特性后者让C++更容易出错误而且更难学习C#的设计者加入了很多C++的特性而Java也加入了这些特性但是C#却没有去掉C++的最糟糕的一些特性其结果就是这样一门语言它仍然为所有人提供了所有的特性但其结局是内部沖突不断而且过于复杂
散漫的句法缺陷
最容易找出的错误是流控制和句法C#提供了goto command将其作为更改程序执行点的机制自从Edsger W Dijkstra在年出版了他的《关于Go to陈述式害处的考虑(Go To Statement Considered Harmful)》Goto语句导致代码难以调试而且很难被测试工具处理
在另一种不同的情况下操作符过载同样也有很大问题只不过层次不一样罢了当+根据操作数的类型而代表任何东西的时候代码的功能就不再透明难以预料的副作用就会发生
C#在安全上的削弱
C#有一个用于将代码区域标示为不安全的简单机制在这些不安全的区域里Java以及后来的C#安排到位了一些安全措施用以防止程序员直接修改内存位置以及使用点运算但是这些措施是值得怀疑的在使用具有垃圾清理功能的高级语言时如果下到内存地址这一层就会把对象/内存之间有意作出分离弄混错误就会容易出现调试成了恶梦缓沖区溢出再次抬头C和C++里着名的安全漏洞再次现身
C#还允许对主机系统上本机库的简单访问这个与非NET对象相结合的访问同Java本机接口(JNI)所提供的功能类似但是它更加危险JNI被设计用来小心地限制Java代码以及本机代码同已定义好的接口之间的交互操作NET使得调用本机对象文件变得极其简单结果导致开发人员在做这的时候无法意识到他们在这一过程中把平台的可移植性也扔出了窗外
SOAP的集成
C#及其更大的扩展NET已经同SOAP Web服务紧密地集成在一起SOAP是使用XML指定参数和结果值来进行远程过程调用的好标准但是它并不是唯一的方式利用用于Web服务的外部库能够允许Java开发人员轻易地更改其Web服务的风格使其成为SOAPXMLRPC或者什么还没有发明的东西当然C#的开发人员总是能够选择将外部库用于SOAP的Web服务但是由SOAP标准的紧密集成所造成的限制要比它能够做的东西更多
所有者的恐慌
C#里最令人恐慌的特性可能就是其所有者了微软已经为将C#和NET用于非Windows平台进行了精心的展示但是这在很大程度上还只是作秀其用于非Windows平台的CLR是问题多多错误多多它通过ECMA标准化过程来运行C#??这一步连Sun也不敢在Java上迈出
其担心来自于微软对此可能封锁的程度如果它愿意的话微软已经申请了一个专利以排斥他人编写第三方的CRL例如Mono计划如果微软决定对免费的C#和NET社区施压它就有能力拿票子和法律的大棒把其开发活动赶回到Win平台??当然这也不是它想看到的情况
而Java语言则相反不是ECMA标准的真可惜Sun没有遵从这一标准但是它是可以实现的而且没有专利的阻碍其虚拟机和核心类库都有来自第三方的开放和封闭源代码的实现C#看起来是免费的其实不然而Java看起来限制很多但是它能够依据法律通过免费的途径来实现
最后我从来都没有想到我会说这个但是Java具有更好工具的支持即使是在考虑到集成开发环境(IDE)的情况下Visual Studio NET是一个很不错的IDE它代表了多年的努力而且特性很丰富但是Eclipse IDE包括了对Java的支持它在稳定性易用性和所提供的特性上超过了Visual StudioIBM对Eclipse的贡献举足轻重而且如果你信奉原来的软件格言创建一个扔掉的(Build one to throw away)那么你可以把Visual Age作为第一个(被抛弃掉了的)尝试对于使用C#的开发人员来说幸运的是Eclipse的NET版本正在开发中
不是那么差但是还不是Java
客观一点评价C#里并没有什么很恐怖的东西它没有Visual Basic里的那些很恐怖的东西而且它事实上也没有继承像C里的一些东西而这些东西会让开发人员开枪却打中自己脚但是底线是C#并没有做很多东西如果有任何东西比Java更好的话它在某些方面很明显的要更差在这两个非常类似的语言之间作选择的时候请选择稍稍更好且经历风雨的那个Java