CowNew开源团队 向四川汶川大地震遇难同胞表示深切哀悼!

http://www.cownew.com 邮件请联系 about521 at 163.com

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  234 随笔 :: 0 文章 :: 526 评论 :: 0 Trackbacks

         最近公司要开发Windows平台上的产品(由于涉及到商业机密,所以目前无法对这个产品做详细介绍),采用.Net技术进行开发,我负责的是基于Visual Studio插件机制的行业开发工具的开发。从开始接触.Net到现在已经有近三个月了,而且也开发出了第一个版本,对.Net已经有了一些认识,由于以前主要用Java、Python等语言进行开发,因此有意无意的就对这些语言进行了比较。和Java比起来,.Net的优势还是很多的,比如快速开发能力、基于Windows特性进行开发的能力、内置的丰富类库、一些高级语法、组件的多版本管理等。优点是不用过多夸耀的,缺点我则要好好的“批评”一番的,因为“谦虚使人进步,骄傲使人落后”嘛,呵呵。开发场景为:使用Visual Studio2005进行C#的开发、使用Eclipse进行Java开发。 
 
1、HotSwap:在Java中HotSwap技术给程序的调试带来非常大的方便,比如可以让程序一边调试一边修改代码,代码修改以后在程序中立即就可以看到修改后的效果,不用每次修改以后都要重新启动程序;在.Net中几乎不允许这样做,只有在非常苛刻的几个情况下才可以实现在调试状态下修改代码,而且一旦代码段被执行过了就肯定不允许再修改了,这就导致每次修改代码都要频繁启动程序,非常繁琐。
 2、基于.Net的东西和Windows结合过于紧密,而且和Windows平台下一些旧有技术有太多千丝万缕的联系,导致用起来非常麻烦。比如每个对外部系统暴露的接口传来传去最后看到的类型是_ComObject,要想得知其真正的接口类型就必须通过COM技术来取得,非常麻烦;开发的很多组件都需要到注册表中注册,增加了部署的难度。

3、Visual Studio中代码的即时查错能力非常弱,很多的要到编译时才能知道代码是否有错;而在Eclipse中在编写代码的时候对于有错误的代码和有警告的代码(比如一些Private成员没有被引用)可以立即清晰的提示出来,开发人员可以立即修改有错误的代码。

4、Java中默认的方法都是可以override的除非标注为final,而在C#中必须是明确声明virtual的才可以override。在Delphi中也是类似的问题,这应该是Delphi和C#共同的老爹Anders Hejlsberg对于OO的一种理念吧,也许人家大师的想法是正确的:一个方法是否是虚方法必须要明确指定。不过对于习惯了Java中这种实现方式的人来说,C#的这种实现方式还是让人感觉一时难以适应的。

5、Visual Studio的编译速度太慢,点击【调试】/【运行】按钮以后要编译好长一段时间才能启动(不过和Visual Studio6比起来现在的Visual Studio编译速度已经快多了了,已经接近于Delphi的编译速度了);由于Eclipse使用的自己的高性能编译器Eclipse Compiler,而且代码的编译是在编写代码的时候即时进行的,所以在Eclipse中根本感觉不到编译的时间,点击【调试】/【运行】按钮以后程序就运行起来的。

6、.Net类库中一些类设计的不灵活,比如TreeView的节点的显示的值是通过Text属性赋值上去的;而在Java中的Swing、SWT等图形库中,可以在一个树节点中挂任何类型的值,然后通过为这个节点定义个性化的Render(渲染器)来决定这些树节点显示什么。

7、Visual Studio的插件体系过于死板,开发起来不像开发Eclipse插件那样灵活简便,这可能和Visual Studio插件体系的历史渊源有关系。举例如下:
(1)比如要在代码编辑器上增加新特性,在Eclipse中可以通过代码编辑器中提供的大量扩展点来实现,而在Visual Studio中的代码编辑器中则只提供了很可怜的几个可扩展性。这一点是Visual Studio插件体系最大的硬伤,大大限制了基于Visual Stuio的插件的功能,相信随着MS对Visual Studio插件体系的逐渐重视,这一点会慢慢跟上来的。
(2)Visual Studio的插件体系和.Net结合过于紧密,在Eclipse中可以为Python、Ruby、C#、C、ASM等很多语言开发IDE(提供代码编辑、代码辅助、调试、编译等功能),这些语言不必与Java有任何关系,而在Visual Studio中虽然也可以为一种语言编写IDE,比如IronPython、J#,但是这些语言是和.Net集合紧密的,比如要为这种语言提供调试功能,则必须将代码编译成MSIL代码,这对于很多语言来讲是不可能的;
(3)Eclipse中的插件只要在自己的plugin.xml文件中配置好就可以了,把那个插件的jar包放到Eclipse中就可以运行,而Visual Studio中的插件则必须首先注册到注册表,调试和部署起来非常麻烦;
(4)Eclipse运行时的配置是保存在Workspace中的.metedata目录下的,因此在开发插件的时候会把插件的配置信息自动写到Host起来的那个Eclipse的Workspace中,被调试模式启动的Eclipse所做的一些修改不会影响主Eclipse,而在Visual Studio中虽然可以使用Experimental Hive方式进行插件开发,但是由于这些配置是保存在注册表中的,所以被Host启动的Visual Studio实例会污染到主Visual Studio,每次重启IDE都需要运行“Reset the Microsoft Visual Studio 2008 Experimental hive”来进行环境的重置,且重置耗时非常长,浪费了大量时间;
(5)VS2008中,如果插件中抛出异常,而又没有捕获的话,轻则VS2008会显示一个错误消息框,重则VS2008会宕掉;而在Eclipse中会将插件中未捕获异常显示出来并且输出到日志文件中,方便插件开发者排查插件的Bug。
(6)Eclipse中工程相关的特性是以Nature的方式提供的,一个Nature通常可以挂接到几乎所有的工程类型中去,包括用户自定义类型;而在Visual Studio中工程相关的特性则是以SubProject的形式提供的,往往只能挂到Visual Studio内置的少数几个工程类型中去(比如CSharpProject、VBProject),这样可扩展性大大降低了。
(7)Eclipse中可以使用JET来开发非常复杂的代码生成器,而Visual Studio中的代码生成则只能用非常简单的代码模板机制,复杂的逻辑就必须通过字符串拼接来完成;

        毕竟接触.Net时间还是非常短,所以有的地方说的可能有错误,还请园子里的兄弟多指教。最后祝.Net和Java能在相互竞争中快速成长,从而让我们开发人员能够轻松、快乐、快速的开发出产品来,:)

posted on 2008-02-19 11:29 CowNew开源团队 阅读(2800) 评论(17)  编辑  收藏 所属分类: 技术类

评论

# re: 我眼中的.net的缺点(和Java比较) 2008-02-19 12:10 doyle
看完后...发现是在比较两款IDE...虽然我基本赞成这篇文章  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-02-19 12:41 罗明
IDE的特性也能反映语言的特性吧,毕竟这两个都是各自领域里的顶级IDE  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-02-19 13:06 dennis
关于第4点,java默认所有方法都是“晚”绑定,而c#延续了cpp  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较)[未登录] 2008-02-19 13:42 gfh21cn
这两个IDE其实反映了各自的系统背景,有点WINDOWS和Linux相比较的味道,呵呵,不全是了

赞成LZ的观点,VS有很多地方没有ECLIPSE来的方便。  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-02-19 14:07 GaoYP
可能开发插件是如此。楼主的观点只是从JAVA转向C#的程序员的观点。
我从C#转向JAVA的感受完全不是这样。VS是装上就能用。Eclipse折腾了我好几天,很久才适应。  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-02-19 14:10 CowNew开源团队
不过Eclipse还是比VS强大很多的,毕竟开发人员用一个IDE是希望它强大,是否容易上手是次要问题,:)。  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-02-19 14:13 guoyong.che@gmail.com
据说java中的许多思想更成熟,更先进,这些方面能做做比较吗  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-02-19 14:19 CowNew开源团队
@guoyong.che@gmail.com
从语法本来来讲,Java和C#比起来没有本质区别。不过从我接触过的产品来讲,很多基于.Net的开发东西更侧重于工业化的实际应用,所以很多地方都是“能用就行,不考虑太复杂的东西”,而基于Java的东西则是求精美、求最佳化。不同的风格吧。比如看看Visual Studio SDK的代码,发现很多类设计的很土,违背很多设计原则,只是“为了使用而设计”,并没有经过好的设计,而Eclipse的代码则非常精美。
还是那句话,能不能写出精美的程序在于人,而不在于工具,很多基于.Net的东西也有写的很精美的,基于Java做的东西也有很多非常垃圾。  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-02-19 14:35 传世私服
也不能说那就是缺点吧```都有好处,看习惯`  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-02-20 09:41 bangbang
博主所说的ide的扩展性,在vs2008里应该有显著的增强。还有我最难忍受eclipse的地方就是,明明有些功能,只要再稍微多花一点点的功夫就是实现得非常好的一些功能,偏偏要留一些遗憾在那边,看起来很别扭。比如代码自动完成时,对构造函数支持不好。  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-02-20 20:44 香草的天空
eclipse的体系设计很好,而vs2008几乎不可能转型成为eclipse那样完全基于OSGi的设计。
因为M$投入的人年太多了,很难想象推倒重来而且还要经受住工业化的测试。

而eclipse因为它免费,另一个是因为它在java ide里几乎没有遇到竞争对手,所以它可以从容的大修大改。
eclipse2.0的版本是不支持increment compile的,要编译就全体编译,-_-!
eclipse2.1后面的版本,几乎每个版本都有API改动。而且更新非常快,快到Milestone版本里API都不一样。这时候为eclipse写插件几乎没法维护,且不说换个版本就编译不过,而且某些个必须功能只存在于M版本里,而这些M版本几乎都有这样那样的bug。
3.0后eclipse又遵循OSGi重写底层代码,不过API稳定很多。当然3.0到3.3改动还是很大,不过大方向已经稳定了。

不过根据我对JDT的认识并不存在Eclipse Compiler,而是基于AST的词法分析。你能即时启动主要是因为你Ctrl-S的时候class已经编译好了,后面只是javaw的问题了。
而.net每次当你修改后代码启动的时候都重编译一次工程,所以-_-!!  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-02-20 20:51 香草的天空
M$在技术上已经落后于Java了。现在的C#语言也好VS也好处于一个追赶期。
从深层次上是两者观念的差异,eclipse是希望程序员自己动手,自己来完善,它只提供一个平台。而MS是希望程序员一点击就可以运行,超级上手快。
单纯从技术上来说,MS应该选择放弃兼容一些过时技术但是它那样做的话就会失去市场  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-02-21 11:59 dennis
c#3.0在语法上比java更加激进,引入了更多函数式语言的特性,java比c#3.0落后多了,哪怕java7出来。  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-03-19 17:44 ZelluX
怎么是比较两个ide的。。vs2008很好用啊。。Java没闭包用起来就是不爽,代码废话多。  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-03-20 17:02 Javalet
用了用NetBeans,觉得还不错,就是插件上比不上Eclipse  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-04-03 09:06 cell
也许在.net1.1甚至2.0的时候可以说java领先,但是他等更新速度太慢,如今的.net3.0/3.5已经超过java。我还是觉得vs2008好用,最起码只能提示比eclipse舒服多了。  回复  更多评论
  

# re: 我眼中的.net的缺点(和Java比较) 2008-06-01 09:40 anony
显然java不行了  回复  更多评论
  


标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交