热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(MSDN)VB.NET的强大和C#语言的比较

在网上经常能看到一些评论和比较C#、VB.net优劣的文章。其中绝大多数都认为:VB.net就没有它存在的必要,VB.net迟早要被C#取代。确实,计算机语言不是很重要

在网上经常能看到    一些评论和比较C#VB.net优劣的文章。其中绝大多数都认为:VB.net就没有它存在的必要,VB.net迟早要被C#取代。
         确实,计算机语言不是很重要的,也许讨论它有点无聊。所以还希望那些心中无剑架构、思想至尚的高手们口下留情。
关于VB.netC#在功能、能力、面向对象的特性上,实在是难分伯仲。这个已是不争的事实。尤其是VS.net2005中,这两种语言已经达到了惊人地相似!

下面就通过三个大方面对这这两种语言进行比较:
一、语言的人性化区别
C#像傻男人,VB.net像聪明贤惠的女人
从代码的风格就可以看出。

1.    声明变量时:
C#: int    iTest    ; //很直接的语气,类似于:擦汗!拿毛巾
VB.net Dim    iTest    As    Integer ‘很委婉的语气,类似于:小王,给我拿条毛巾,我用它擦汗~
实现完全相同的功能,但有着很明显的区别。哪个更人性化、更易懂呢?

2.语言的关键字上:
C#关键字:
usingthisvoidbaseabstractsealedvirtualswitchinternalstatic
相应的VB.net关键字:
ImportsMeSubMyBaseMustInheritNotOverridableMustOverrideSelect    FriendShared

比较一下,C#的关键字比较冰冷,是具有一定机器味道的语言。
VB.net的关键字,都是人的行为人的称谓
相信VB.net的语法更具亲和力,更易于帮助我们理解面向对象的特性。

二、语言的先进性的对比
现在,计算机软件工程越来越庞大,已经远远不是10年前的几十KB大小的级别了。这就对语言的可扩展性、可辅助性提出了更高的要求。面向对象便是这个需求的一个产物。

从现有的语言来看,具有标识符的标识性语言具备更高的容错性、可调试性、可扩展性。比如HTMLXML。尤其是XML已经成为了下一代语言的模型。
为什么像HTMLXML这种具有开口封口的语言    有更高的容错性、可调试性呢?这要取决于它的吝啬性。开口封口可以把故障的范围最小化,使出现问题的部分尽量不影响其它部分。比如说:在HTML

中,少写一个多写一个均不会对表格中其它行造成太大的影响。 

    这种吝啬的语法相反的是贪婪性的语法。什么是贪婪性呢?这个问题也不太好解释。不过,这种特性与正则表达式的解析十分十分地一致。吝啬性的正则表达式    用做 精确匹配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的代码的合理性了。

这里只是举了一个简单的例子,实际的情况比这个更复杂。我们可以看到,在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特有的结构:可选参数
Public    Sub    XXX(P1    As    Integer,Optional    P2    As    String,Optional    P3    As    String)
‘…
End    Sub
这样的结构在C#中是无法实现的,但可以通过重载的方式实现相同的效果:
void    XXX(int    P1){}
void    XXX(int    P1,string    P2){}
void    XXX(int    P1,string    P2,string    P3{}
当然,用VB.net也可以用重载方式写出一模一样的结构。

例三:事件代理的挂接
C#中:只有一种方法:XXX.XXX    +=    new    XXX(…);
VB.net中:即可以效仿C#的方法:AddHandler(XXX.xxx,AddressOf    XXX)
也可以把过程显示地指定给某个事件:Sub(…)    Handles    XXX.XXX

利用上面的第二种方法的特性,可以实现在VB.net代码编辑页中    简单地通过下拉框    来精确地定位某个对象的特定事件的处理过程。
遗憾的是,这种方便的特性在C#中是无法实现的。因为C#的语法:XXX.XXX    +=的后面可以是任何方法返回的具有相同签名的实例。比如    通过属性、方法,甚至是随机判断后返回的。
这种过份的自由使得C#编译器在运行代码前不能准确地确定该对象事件的处理部位。

类似的例子太多了,举不胜举。

总之,VB.net给了我们更大的活动空间,它允许我们在更快的速度更严格性能要求之间自由选择。

四、代码书写上的比较
一、变量的命名的区别
C#是区分变量的大小写的,这一点着实让人摸不着门。也许这仅仅是为了效仿Java?
在公共语言规范中(CLS),明确规定变量不区分大小写的,真是难为了C#编译器,还要把重名的变量重新命名。
相比之下,VB.net更加符合CLS,而且因为不区分大小写,编辑器就更轻松地实现了自动更正功能。
C#绝对是嫁错了人
C要区分大小写,其原因有二:一是为了能使用更多的变量资源,二是为了节省编译器的开销(性能和体积上都节省)。
如今,.net环境允许我们使用多达1024个长度的变量名,而且已完全面向对象化,相同的变量可以同时出现在任何object中,所以可用的变量资源数量    理论上已经达到了无穷多个!
在这样的条件下,区分大小写使代码在    可读性、可调试性、可辅助性上都造成了不小的负面影响!它已经成为了语言发展的障碍!

二、代码的书写
几乎绝大多数的C#程序员都觉得他们在代码的书写上有着无与伦比的优越性,因为C#代码看上去是如此的简洁。
是的,如果我们仅使用记事本来开发.net应用程序,我相信像VBDelphi早就灭绝了。
但更糟糕的是:如果我们仅能使用记事本写代码,那么程序员也早就集体自杀了。
说多少也不会有人相信,尤其是C#程序员不会相信    在代码书写方面    他们会完败于VB.net程序员。
我们完全可以用键盘钩子做个小程序来检测、验证一下到底是哪种代码更浪费键盘、书写起来更吃力。(这个程序我已经写好,有兴趣的可以到http://img.pcpop.com/upimg2/2005/5/15/491525800.jpg      来下载。注意:必须使用网络快车下载,下载后把文件更改为exe的即可直接运行。这个序使用VB.net    +    Framework1.0编写,必要的时候    需要你安装.net框架。)

测试结果很明显:VB.net代码需要按键的次数更少、书写更为容易。原因是IDE在其中起到了极大的作用!
VB.net不必像C#那样不停地用Ctrl+shift+B来编译检错;不必不停地按下Shift键来输入星罗棋布的符号;不必不停地使用Ctrl+]徘徊于大括号之间;更不必手动输入众多的关闭符
(试一试:输入If    A=B    [回车],这时    ThenEnd    IF马上就都给你准备好了)
(再试一试:在一个刚刚建立的新Class中,输入Inherits    回车,所有需要实现的方法都给你准备好了)

究其本质,是由于VB.net的语言起到了决定性的作用。
正是因为我们已经告诉了编辑器这是一个ReadOnly    Property”,所以编辑器会给我们自动提供了Get结构代码;
正是因为我们已经告诉了编辑器这是一个WithEvents的对象,所以编辑器会在对象事件选择列表里加入它;
正是因为我们已经告诉了编辑器这是一个Event”,所以当我们要RaiseEvent时,它会准确地出现在列表中;
正是因为我们已经告诉了编辑器这是一个Function”,所以当我们写上调用方法后,它会自动地在后面加上括号;
……
反观C#,由于代码过度地萎缩,许多事情还需要通过分析整段代码的结构来决定它的属性,导致这些智能的操作无法在C#上实现。

但这些动词并不能表明VB.net和C#之间具有什么差距!!!!


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
author-avatar
西瓜凉皮大夏天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有