VB和VB.NET有什么区别?

24

VB和VB.NET有什么区别?

最好用示例来解释。


两者基本上没有任何相似之处。 - Ry-
2
有很多相似之处! - john k
4个回答

37

有很多不同之处。

  • VB6和VB.NET的最大变化在于运行时环境。VB6使用VB-Runtime,而VB.NET使用.Net公共语言运行时(.Net CLR)。CLR比VB-Runtime更好地设计和实现。CLR通过即时编译器使用更好的代码转换,而VB-Runtime则解释代码。CLR垃圾回收器也比VB6的垃圾回收器更有效,因为它可以检测到循环引用。
  • VB6是基于解释器的语言,而VB.NET是编译语言
  • VB6不是类型安全的语言,而VB.NET是类型安全的语言。VB.NET中没有变体类型,并且VB.NET中不会发生神奇的类型转换

其他一些区别:

继承

VB.Net通过允许您定义作为派生类基础的类来支持继承。派生类继承并可以扩展基类的属性和方法。他们可以还可以重写基类的方法并提供新的实现。所有使用VB.Net创建的类默认都是可继承的。因为您设计的窗体实际上是类,所以可以使用继承来定义基于现有窗体的新窗体。有关详细信息,请参见Visual Basic中的继承

异常处理

VB.Net支持结构化异常处理,使用其他语言(如C++)所支持的Try...Catch...Finally语法的增强版本。结构化异常处理将现代控制结构(类似于Select Case或While)与异常、受保护的代码块和过滤器相结合。结构化异常处理使得创建和维护具有强大的全面错误处理程序的程序变得容易。有关详细信息,请参见异常处理简介

重载

重载是定义具有相同名称但使用不同数据类型的属性、方法、过程或运算符的能力。您可以使用重载过程来提供尽可能多的实现以处理不同类型的数据,同时给出单个、通用的过程的外观。有关详细信息,请参见重载属性和方法

覆盖属性和方法

Overrides关键字允许派生对象覆盖从父对象继承的特性。被覆盖的成员和从基类继承的成员具有相同的参数,但它们具有不同的实现。成员的新实现可以通过在成员名称前面加上MyBase来调用父类中的原始实现。有关详细信息,请参见覆盖属性和方法

构造函数和析构函数

构造函数是控制类的新实例初始化的过程。相反地,析构函数是在一个类离开作用域或设置为Nothing时释放系统资源的方法。VB.Net使用Sub New和Sub Finalize过程来支持构造函数和析构函数。详细信息请参见对象生存期:如何创建和销毁对象

数据类型

VB.Net引入了三种新的数据类型。Char数据类型是用于存储Unicode字符的无符号16位字,它等同于.NET Framework System.Char数据类型。Short数据类型是一种带符号的16位整数,在早期版本的Visual Basic中称为Integer。Decimal数据类型是一个96位带符号整数,由可变的10的幂比例缩放。在早期版本的Visual Basic中,它仅在Variant中可用。此外,Visual Basic现在还支持无符号整数数据类型(UShort、UInteger和ULong),以及有符号类型SByte。详细信息请参见Visual Basic中的数据类型

接口

接口描述类的属性和方法,但与类不同,接口不提供实现。使用Interface语句声明接口;使用Implements语句编写代码,将接口中描述的项付诸实践。详细信息请参见Visual Basic中的接口

委托

委托是可以代表您调用对象方法的对象,有时被描述为类型安全的面向对象函数指针。您可以使用委托来让过程指定在事件发生时运行的事件处理程序方法。您还可以在多线程应用程序中使用委托。详细信息请参见委托和AddressOf运算符

共享成员

共享成员是所有类实例共享的属性、过程和字段。当多个对象需要使用所有对象都通用的信息时,共享数据成员很有用。您可以在不首先从类创建对象的情况下使用共享类方法。详细信息请参见Visual Basic中的共享成员

引用

您可以使用引用来使用在其他程序集中定义的对象。在VB.Net中,引用指向程序集而不是类型库。详细信息请参见引用和Imports语句

命名空间

命名空间通过将类、接口和方法组织成层次结构来防止命名冲突。有关详细信息,请参见Visual Basic中的命名空间

程序集

程序集通过描述特定组件或应用程序所需的所有文件来替换和扩展类型库的功能。一个程序集可以包含一个或多个命名空间。有关详细信息,请参见程序集

属性

您可以使用属性为程序元素提供其他信息。例如,您可以使用属性指定当作为XML Web服务使用类时应公开哪些方法。有关详细信息,请参见Visual Basic中的属性

多线程

您可以使用VB.Net编写能够独立执行多个任务的应用程序。可以在单独的线程上执行可以阻塞其他任务的任务,这个过程被称为多线程。通过使复杂任务运行在与用户界面分离的线程上,多线程使您的应用程序对用户输入更加响应。有关详细信息,请参见多线程应用程序

位移运算符

VB.Net现在支持对整数数据类型(Byte、Short、Integer和Long)以及无符号类型(UShort、UInteger和ULong)执行算术左移和右移操作。算术移位不是循环移位,这意味着从结果的一端移出的位不会重新进入另一端。相应的赋值运算符也被提供。有关详细信息,请参见位移运算符和赋值运算符

循环变量声明

您可以使用VB.Net将循环变量声明为For或ForEach循环的一部分。您可以在For或ForEach语句中为变量包括一个As子句,前提是没有在循环之外声明该名称的变量。以这种方式声明的循环变量的作用域仅限于循环本身。有关详细信息,请参见For...Next语句(Visual Basic)ForEach...Next语句(Visual Basic)

更多信息:

编辑:如评论所述,一些特性如构造函数在 VB6 中已经支持(以不同的方式),请查看最后一个链接以更全面地了解这一点。


2
+1 对于全面的回答甚至提供更多信息的链接! - Geoffrey
4
第一段中所有的陈述都是错的:1. 在VB6中没有人编译成解释型的可执行文件,解释器仅在集成开发环境(IDE)中用于调试。2. 垃圾回收并不比引用计数更有效率。3. VB6不是基于解释器的语言——它没有像JS中的“eval”函数。4. VB6是一种类型安全的语言,只是弱类型的(类似于C),这本身不是一个“弱点”。有一件事是确定的——微软做了一个很好的工作,妖魔化VB6,吓唬大多数VB6开发者(数百万),并将他们困在.NET中。还有一件事我也很确定——这将再次发生...与.NET一起。 - wqw
3
WQW说得很对,还有其他错误。VB6确实拥有接口、构造函数和析构函数。 - MarkJ
1
@wqw,MarkJ:我在我的编辑和最后一个链接中提到了这一点。 - Tim Schmelter
我为你出色的总结点赞。 - Relaxed1
@wqw是正确的吗?那些错误可以在答案中进行更正吗? - Vivek Chavda

18

如果你正在为一个新项目做出选择,那么相关要点如下:

  • VB6是遗留的语言(发布于1998年,IDE已不再受支持,运行时仅在Win8寿命期间受支持)
  • VS2008不支持VB6
  • VB.NET是一种现代化的语言,在VS2008中得到支持

我会说几乎没有任何理由选择VB.OLD而不是VB.NET。

如果你“只是感兴趣”,那么维基百科对每种语言的文章相当有信息量,但简而言之,它们是截然不同的语言,具有表面上相似的语法。VB拥有其自己的运行时,而VB.NET是使用更现代的.NET框架的众多语言之一。


1
我需要更正一个细节。虽然VB6运行时仍在得到支持,但其集成开发环境(IDE)已不再得到支持。对于新项目来说,选择VB.Net几乎总是更好的选择,我仍旧认同这一点。 - MarkJ
1
好的观点 :-) 将会纠正! - Dan Puzey
我相信一定有人会这么做,但我仍然很难想出为任何新项目在不受支持的IDE上开发VB6的理由。 - Dan Puzey
运行时至少支持 Windows 7 和 Windows Server 2008 的生命周期,而不仅仅是这个时间段。微软尚未说明它是否会在此之后获得支持。他们称他们没有计划支持它。依我看,这些话被精心挑选,旨在尽可能让人感到担忧,但并未明确表示他们不会支持该运行时。 - MarkJ
我之前的评论是正确的!现在运行时至少支持Windows 8的生命周期,而不仅仅是支持。他们说他们“没有计划”支持它,使用故意恐怖的词语。就像他们为Windows 8所做的一样:当Windows 8发布时,VB6运行时被包含并得到支持。 - MarkJ
非常正确,但我不确定运行时是否是关键:如果你正在开发一个新产品,选择一个15年前的不受支持的开发环境是疯狂的。我想知道VB6 IDE在Windows 8中是否能正常工作...(虽然没有计划去检查!) - Dan Puzey

5

经典的VB不支持大部分面向对象编程特性,而VB.NET则支持。


1
VB.NET 对多重继承的支持有限(因此它并不“支持所有面向对象编程特性”)。我并不是说 VB 经典版支持多重继承,只是指出你的陈述在技术上不正确。 - Scott Whitlock
我已经编辑了答案以反映这一点。 - SharpAffair

4
主要的区别在于版本号和面向对象。
从6版本开始,它被称为VB。从版本7开始,随着.Net 1.0的发布,它被称为VB.NET。
它在版本7中进行了全面改进,以更加流畅地与.Net Framework(CLI和CLS兼容性)以及其他语言如C#和Java配合使用。
在这个转变过程中,几个变化导致了与早期版本的不兼容。这就是为什么Microsoft提供了一些工具在Visual Studio中将旧的VB6应用程序转换为.Net的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接