从VB 6.0到VB.NET的转换(2)

页面导航:首页 > 软件编程 > vb.net > 从VB 6.0到VB.NET的转换(2)

从VB 6.0到VB.NET的转换(2)

来源: 作者: 时间:2016-02-05 12:32 【

升级向导将 Currency 数据类型转换为 Decimal,因此以下代码:Dim x As Currency升级后将变为:Dim x As DecimalDateVisual Basic 6.0 Date 变量在内部以 Double 格式存储,能够作为 Double 类型的变量操作。
升级
向导


将 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
Basic 6.0
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 BooleanDim MyInteger As Integer  MyInteger = MyBoolean
升级后将变为:

Dim MyBoolean As BooleanDim 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  If IsDBNull(x) Then MsgBox "Null"


Def<Type>
Visual
Basic 6.0 DefBool、DefByte、DefInt、DefLng、DefCur、DefSng、DefDbl、DefDec、DefDate、DefStr、DefObj 和 DefVar 语句用于在模块级设置变量、参数和过程返回类型(以指定字符开始)的默认数据类型。



Visual Basic.NET


避免使用隐式类型声明,提高了代码的可读性和可靠性。



升级
向导


将变量类型的显式声明插入代码。例如,以下代码:

DefStr a-z
  Sub MySub
    s = "Hello"
    End Sub
升级后将变为:

Sub MySub
    Dim s As String
  s = "Hello"
    End Sub


块内的局部变量
Visual
Basic 6.0 从包含声明的行至过程结束的范围内,局部变量均可见。



Visual Basic.NET


Visual Basic.NET 支持变量的块范围。这意味着从包含声明的行开始,至出现声明的块结束,局部变量均可见。例如:

Sub Test(x As Integer)
  If x < 0 Then
  Dim y As Integer = - x
  ...
  Else
  ...
  End If
End Sub
以上示例中的变量 y 仅在声明该变量的块中可用;更确切地说,它仅在其声明至 Else 语句之间可用。如果需要在整个过程中使用变量,则必须在 If/Else/End If 控制结构之外声明该变量。

变量的块范围是许多结构语言共有的功能。过程局部变量允许定义过程内部变量,从而对结构化编程提供支持,与此类似,块级别变量允许定义代码块内部变量,从而对结构化分解提供支持。



升级
向导


如果变量在块内声明,变量将自动移至模块级范围。例如,以下代码:

If x =1 Then
    Dim y As Integer
  End If
升级后将变为:

Dim y As Integer
  If x =1 Then
  End If


新的自动重新实例化
Visual
Basic 6.0 窗体的类变量声明 Dim x As New <classname> 将导致编译器每次引用 x 时生成代码。此代码检查 x 是否为 Nothing;如果是 Nothing,则创建类的新实例。例如,以下代码:

Dim x As New MyClass
  ...
  Call x.MyMethod()
等同于:

Dim x As MyClass
  ...
  If x Is Nothing Then
    Set x = New MyClass
  End If
  Call x.MyMethod()
即使变量已经设置为 Nothing,在下一次调用时该变量仍将重新实例化。

Visual Basic.NET


窗体的变量声明 Dim x As New <classname> 等同于 Dim x As <classname> = New <classname>。引用通过此语法声明的变量不会生成特殊代码。

Visual Basic.NET 声明 As New 比 Visual Basic 6.0 中的同一声明更加有效。大多数对这类变量的引用不需要额外的开销。而且,Visual Basic 6.0 的“自动实例化”行为对于发现它的许多编程人员来说非常古怪。



升级
向导


这极少会成为问题。但是,如果代码尝试使用已设置为 Nothing 的类,将导致运行时异常。该异常很容易检测到。然后,可以方便地修改代码以实例化类的新版本,如下例所示:

Dim x As New MyClass
  x = Nothing
  x = New MyClass


对象终结
Visual
Basic 6.0 COM 引用计数机制用于垃圾回收对象实例。如果对象不在循环中,当对象不再使用,引用计数会立即检测到此情况,并且运行终结代码。

Visual Basic.NET


跟踪垃圾回收器从存储在堆栈变量、模块变量和共享变量中的可及引用开始,将对象过一遍。此
Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<