Microsoft Visual Basic.NET 是 Microsoft Visual Basic© 的后续版本,它是基于 .NET 框架重新设计的,您可以用它来轻松地创建用于 Microsoft Windows© 操作系统和 Web 的下一代应用程序。使用 Visual Basic.NET,可视化开发 Web 应用程序、Web 服务、Windows 应用程序和服务器端组件将变得轻而易举。此外,Visual Basic.NET 使用了 Windows 应用程序的 XCOPY 部署方案,使您不必再担心 DLL 版本问题。随着 Visual Basic.NET 的发布,“DLL 噩梦”将成为过去。
在设计 Visual Basic.NET 时,我们着眼于世界各地 Visual Basic 开发者的要求。Visual Basic 语言现在是真正的面向对象语言,并支持实现继承。窗体设计器支持可视化继承,并包含窗体自动调整大小、资源本地化和访问选项支持等新特性。现在的数据工具继续支持 XML 数据,并可以共同使用设计时数据绑定和断开数据。此外,Visual Basic.NET 是基于 .NET 框架直接创建的,因此可以使用所有的平台特性,并能够与其他 .NET 语言协同工作。
在发布这些功能的同时,我们对产品的几个方面作了修改。本文档介绍了从 Visual Basic 6.0 到 Visual Basic.NET 的一些变更,并解释了进行这些变更的原因。本文还介绍 Visual Basic.NET 升级向导的功能。它是作为产品的一部分提供的工具,可以帮助您将现有的应用程序升级为 Visual Basic.NET 版本。
有关从 Visual Basic 6.0 升级到 Visual Basic.NET 的其他信息,请参阅白皮书《准备将 Visual Basic 6.0 应用程序升级到 Visual Basic.NET》(英文)。此白皮书介绍了升级过程并提供了尽可能顺利升级的建设性意见。
语言
Variant
Visual Basic 6.0 |
Variant 是一种特殊的“通用”数据类型,可以包含除定长字符串之外的各类数据。Object 变量用作指向对象的指针。默认的数据类型为 Variant。 |
Visual Basic.NET |
公共语言运行时 (CLR) 使用 Object 作为通用数据类型。Visual Basic.NET 没有继续使用 Variant 作为通用数据类型,而是选择采用 CLR 命名规则,以避免在跨语言开发时造成混乱。仅使用一种通用数据类型将简化类型系统。默认的数据类型为 Object。 |
升级 |
将 Variant 数据类型变为 Object,因此以下代码: Dim x As Variant 升级后将变为: Dim x As Object |
Integer 和 Long
Visual Basic 6.0 |
Long 变量存储为带有符号的 32 位数字,而 Integer 变量存储为 16 位数字。 |
Visual Basic.NET |
Long 变量存储为带有符号的 64 位数字,Integer 变量存储为 32 位数字,而 Short 变量存储为 16 位数字。在 32 位系统中,32 位整数操作比 16 位和 64 位整数操作都要快。这意味着 Integer 将是最有效和最基本的数字类型。 由于部分 .NET 框架技术以现代的 32 位和 64 位技术为基础,因此根据新技术更新数据大小是明智之举。 |
升级 |
修改变量的类型,因此以下代码: Dim x As Integer Dim y As Long 升级后将变为: Dim x As Short Dim y As Integer |
Currency
Visual Basic 6.0 |
Visual Basic 6.0 支持 Currency 数据类型。您不能将变量声明为 Decimal 类型(虽然变量可以具有子类型 Decimal)。 Currency 变量以整数格式存储为 64 位数字,以 10,000 为标度,以将数字表示为定点数,其小数点左边为 15 位,右边为 4 位。这种表示形式可以表示 -922,337,203,685,477.5808 至 922,337,203,685,477.5807 范围内的数字。 Decimal 变量存储为带有符号的 96 位整数,标度为 10 的不同乘幂。10 次幂的刻度因子指定了小数点右边的数字位数,其范围为 0 至 28。当指数为 0 时(无小数位数),最大的可能值为 +/-79,228,162,514,264,337,593,543,950,335。当指数为 28 时,最大值为 +/-7.9228162514264337593543950335,最小的非零值为 +/-0.0000000000000000000000000001。 |
Visual Basic.NET |
Currency 数据类型的精度不够,无法避免四舍五入的误差,因此创建了 Decimal 这种数据类型。 |
升级 |
将 Currency 数据类型转换为 Decimal,因此以下代码: Dim x As Currency 升级后将变为: Dim x As Decimal |
Date
升级
向导
Visual Basic 6.0 |
Date 变量在内部以 Double 格式存储,能够作为 Double 类型的变量操作。 Date 变量存储为 IEEE 64 位浮点数,表示从 100 年 1 月 1 日到 9999 年 12 月 31 日的日期和从 0:00:00 到 23:59:59 的时间。任何可识别的文字日期都可以指定为 Date 变量。 当其他数字类型转换为 Date 时,小数点左边的值表示日期信息,而小数点右边的值表示时间信息。午夜为 0,正午为 0.5。整个数值为负表示 1899 年 12 月 30 日之前的日期。 |
Visual Basic.NET |
Date 在内部存储为 64 位整数,因此无法直接作为 Double 进行操作。.NET 框架提供了 ToOADate 和 FromOADate 函数以进行 Double 和 Date 之间的转换。将日期表示为整数形式可以简化并加速对日期的操作。 |
升级工具并非能够检测到所有使用变量将 Date 存储为 Double 的情况,但它一般会在将 Double 指定为 Date 的位置插入适当的 ToOADate 或 FromOADate 方法。例如,以下代码: Dim dbl As Double Dim dat As Date Dbl = dat 升级后将变为: Dim dbl As Double Dim dat As Date Dbl = dat.ToOADate |
定长字符串
Visual Basic 6.0 |
除类模块的 Public 变量之外,其他变量均可以声明为定长字符串。 |
Visual Basic.NET |
CLR 第一版不支持定长字符串。在后续版本中将添加这一支持功能。 |
升级 |
在大多数情况下不会出现问题。假设为定长字符串表现方式,则以下代码: Dim MyFixedLengthString As String * 100 升级后将变为: Dim MyFixedLengthString As New VB6.FixedLengthString(100) 有关该主题的全面说明,请参阅白皮书《准备将 Visual Basic 6.0 应用程序升级到 Visual Basic.NET》(英文)。 |
Type
Visual |
Type 语句用于定义由用户定义的数据类型。 |
Visual Basic.NET |
Type 和 User-Defined Type 这两个名称会引起混淆,因为类、枚举和接口也是可以由用户定义的类型。Type 和 User-Defined Type 是从 QuickBasic 遗留下来的,在 QuickBasic 中用户可以定义的类型只有结构和记录。CLR 使用 Type 这一名称广义地包含所有数据类型。 因此,在 Visual Basic.NET 中 Type 语句将变为 Structure。 |
升级 |
将 Type 语句变为 Structure,因此以下代码: Type MyType MyVariable As Integer End Type 升级后将变为: Structure MyType Dim MyVariable As Short End Structure |
用户定义类型存储
Visual Basic 6.0 |
用户定义的数据类型可以包含某种数据类型、数组或先前定义的用户定义类型的一个或多个元素。在 Visual Basic 6.0 中,它们存储在连续的内存块中。 |
Visual Basic.NET |
格式是最有效的。它可能位于一段连续的内存,也可能不。结构可以被标记为封送处理属性,以确保能够作为连续内存块传递到 COM 组件。 |
升级 |
在所有需要添加封送处理属性的位置,API 均标记有 TODO 注释。(属性不是自动添加的,只有将结构传递到 API 时才需要它们。) |
True
Visual Basic 6.0 |
True 的值为 -1。 |
Visual Basic.NET |
True 的值为 1。 鉴于语言的协同操作,需要一种适用于所有语言的一致表示法。 |
升级 |
如果将布尔值强制转换为非布尔值,代码将标记有升级警告。例如,以下代码: Dim MyBoolean As Boolean Dim MyInteger As Integer MyInteger = MyBoolean 升级后将变为: Dim MyBoolean As Boolean Dim MyInteger As Short ' UPGRADE_WARNING: Boolean MyBoolean is being converted into a numeric MyInteger = MyBoolean |
Empty
Visual Basic 6.0 |
变量均初始化为 Empty,当用于数值表达式时,变量将自动转换为零,当用于字符串表达式时,则自动转换为空字符串。 |
Visual Basic.NET |
对象变量均初始化为 Nothing,当用于数值表达式时,变量将自动转换为零,当用于字符串表达式时,将自动转换为空字符串。使用 Nothing 代替特殊的 Empty 值可以降低语言的复杂性,语言协同操作性也更强。 |
升级向导 |
Null 和 Null 传播
Visual Basic 6.0 |
Null 值为 Variant 的子类型,表示变量不包含有效数据。Null 值通过表达式和函数“传播”。如果表达式的任一部分为 Null,则整个表达式为 Null。将 Null 作为参数传递给大多数函数时,这些函数也将返回 Null。 |
Visual Basic.NET |
不支持 Null 传播。使用 ADO.NET 对数据进行编程的模型用于在检索字段的值之前先检查字段的值是否为 Null。包含 null 的变量将作为 DBNull 类型的对象封送处理至 CLR。 Visual Basic.NET 处理 Null 时更加直接:字符串函数(例如 Left())总是返回字符串,与您的预期一样。 |
升级 |
Null 值和 IsNull 函数标记有升级警告注释。例如,以下代码: If x Is Null Then MsgBox "Null" 升级后将变为: ' UPGRADE_WARNING: Use of IsNull() detected |