云阳二中吧 关注:30贴子:154
  • 1回复贴,共1
序:   
    在网上经常能看到   一些评论和比较C#、VB.net优劣的文章。其中绝大多数都认为:VB.net就没有它存在的必要,VB.net迟早要被C#取代。  确实,计算机语言不是很重要的,也许讨论它有点无聊。所以还希望那些“心中无剑”、“架构、思想至尚”的高手们口下留情。   
    关于VB.net与C#在功能、能力、面向对象的特性上,实在是难分伯仲。这个已是不争的事实。尤其是VS.net2005中,这两种语言已经达到了惊人地相似!   
    下面就通过三个大方面对这这两种语言进行比较:   
一、语言的人性化区别     
  C#像傻男人,VB.net像聪明贤惠的女人   
  从代码的风格就可以看出。     
  例1.   声明变量时:   
  C#: int   iTest   ; //很直接的语气,类似于:擦汗!拿毛巾   
  VB.net Dim   iTest   As   Integer ‘很委婉的语气,类似于:小王,给我拿条毛巾,我用它擦汗~   
  实现完全相同的功能,但有着很明显的区别。哪个更人性化、更易懂呢?   
  例2.语言的关键字上:   
  C#关键字:   
  using、this、void、base、abstract、sealed、virtual、switch、internal、static   
  相应的VB.net关键字:   
  Imports、Me、Sub、MyBase、MustInherit、NotOverridable、MustOverride、Select   、Friend、Shared   
  比较一下,C#的关键字比较冰冷,是具有一定“机器味道”的语言。   
  而VB.net的关键字,都是“人的行为”,“人的称谓”。   
  相信VB.net的语法更具亲和力,更易于帮助我们理解面向对象的特性。   
二、语言的先进性的对比   
  现在,计算机软件工程越来越庞大,已经远远不是10年前的几十KB大小的级别了。这就对语言的可扩展性、可辅助性提出了更高的要求。“面向对象”便是这个需求的一个产物。   
    
  从现有的语言来看,具有“标识符”的标识性语言具备更高的容错性、可调试性、可扩展性。比如HTML、XML。尤其是XML已经成为了下一代语言的模型。   
  为什么像HTML、XML这种具有“开口”和“封口”的语言   有更高的容错性、可调试性呢?这要取决于它的“吝啬”性。“开口”和“封口”可以把故障的范围最小化,使出现问题的部分尽量不影响其它部分。比如说:在HTML的<table>中,少写一个<TR>多写一个<TR>均不会对表格中其它行造成太大的影响。   
  与   这种“吝啬”的语法相反的是“贪婪”性的语法。什么是“贪婪”性呢?这个问题也不太好解释。不过,这种特性与正则表达式的解析十分十分地一致。“吝啬性”的正则表达式   用做   精确匹配Group时有着较高的性能,而“贪婪性”的正则表达式用于判断IsMatch时有着较高的性能。   
  像C类的所有封口均使用大括号的语言,就属于这种“贪婪性”性的语言。过多相同的封口使得代码更加地难于控制。    
  许多人抱怨微软,为什么不给C#加上动态编译、加上自动完成……,实际上,微软何尝不想加啊,但由于C#的语法特性,是根本无法实现的。下面就用实例来说明为什么C#无法实现动态编译:   
  看下面的C#代码段,代码中的大括号是不平衡的:   
  class   A   {   
          class   B   {   
                  class   C   
                  {   
                          int   F1()   
                          {   
                                  return   1;   
                          }   
                          int   F2()   
                          {   
                                  return   2;   
                          }   
                  }   
  }   
  假如现在已经有了C#的动态编译器,现在   要求编译器指明   到底是哪里丢失了大括号!   
  这时,编译器就糊涂了:因为   不论是把大括号加在F1的末尾   还是加在class   A的末尾   都是行得通的,虽然这两种情况的意义是完全不同的,即:不能判断F1到底是Class   C的方法,还是Class   B的方法。那么连带下一步,在代码的其它部分   就更无法判断   调用F1的代码的合理性了。    



1楼2006-11-02 11:41回复
      这里只是举了一个简单的例子,实际的情况比这个更复杂。我们可以看到,在C语言的代码没有完全正确地书写之前,它的结构是有可能极度混乱、多意性的,在这种极度混乱的环境下   是无法判断故障之所在、无法正确识别对象的结构的。自然,这样的动态编译器也就成了“累赘”。   
      相比之下,同样的内容   看看VB语法:   
      Class   A   
      Class   B   
      Class   C   
      Function   X1()   As   Integer   
      Return   1   
      End   Function   
      End   Class   
      Function   X2()   As   Integer   
      Return   2   
      End   Function   
      End   Class   
      End   Class   
      无论你删除End   Class还是删除End   function,故障范围都不会扩大,定位就可以做到精准。    
      检错如此,自动完成代码也是如此。在C#环境下,由于代码结构可能存在着“多意性”,所以IDE有可能无法决定做处理的确切位置。    
      当然,C类的代码并不是没有优点,其优点主要有二:   
      1.节省代码所占的磁盘和内存空间   
      2.使编译器的体积能够做得更小(最终还是为了节省磁盘空间)   
      只有在   内存和磁盘空间非常珍贵的过去的年代里,C类语言代码才能够更具优势。   
      然而在内存和磁盘如此丰富的今天,这种优势已经成了劣势。   
      借助于这种具有确定的“开口”与“封口”的特性,相信VB.net会走得更远。   
    三、语言的灵活性、适应性的对比   
      C#的代码,可以“随便书写”:在一行里可以写多条语句,一条语句可以分成多行来写。这使得它的代码有可能更加地“松散”。虽然C#允许您把代码写得非常地松散,不过在实际的使用中,几乎所有的使用者都默默地走向了VB的代码风格(一行一条语句)。最后,它的分号成了累赘。   
      虽然C#的代码更加地自由,不过C#的思想比起VB.net起来却是更加地死板。   
      在这方面,我觉得把C#比做手动档汽车、把VB.net比做自动档汽车是比较合适的。自动档汽车也可以用手动档的方式驾驶。   
      C#的思想、思路在VB.net中均可实现,而VB.net的思想(自动档)却经常无法在C#上实现。下面举例说明:   
      例一:事件模型   
      在C#中,事件模型是固定的,构造一个事件模型通常需要下面的思路:   
      建立事件代理结构、声明事件、建立事件处理方法、添加事件句柄、判断事件代理是否挂到上实例、通过代理方法引发事件。   
      在VB.net中,即可以按照C#所用的模式建立事件,也可以用VB.net自身所带的RaiseEvent方法实现。虽然他们编译后的结构几乎是一样的,但毕竟VB.net让我们有了更多的选择,何乐而不为呢?下面就看看VB.net引发事件的两种方法示例:     
      方法一:用RaiseEvent.   
      这是一种非常快捷、代码思路非常清晰的一种方法:   
      Class   EventClass   
      Public   Event   E1(sender   as   Object,e   as   XXXEventHandler)   
      Sub   XXXX()   
      RaiseEvent   E1(Me,new   XXXEventHandler(…)   
      End   Sub   
      End   Class   
      方法二:用C#的的思路   
      Public   Delegate   Sub   xxxHandler(ByVal   sender   As   Object,   ByVal   e   As   EventArgs)   
      Public   Class   A   
      Public   Event   XXX   As   xxxHandler   
      Public   Overridable   Sub   OnXXXEvent(ByVal   sender   As   Object,   ByVal   e   As   EventArgs)   
      If   XXXEvent   IsNot   Nothing   Then   
      XXXEvent.Invoke(sender,   e)   
      End   If   
      End   Sub   
      Sub   X()   
      OnXXXEvent(Me,   New   EventArgs)   
      End   Sub   
      End   Class   
      “用尽量少的代码   做出更多的事情”是每个人程序员的最爱!   
      很显然,VB.net在这方面占尽了优势。   
      例二:可选参数结构   
      如下代码展示了VB特有的结构:可选参数   
    


    2楼2006-11-02 11:41
    回复