避免Null传播(Propagation)
先前版本的VB支持Null传播。Null传播的前提是null值使用在表
达式中,表达式的结果将是Null,例如下面的范例,结果V都将是Null
Dim V
V = 1 + Null
V = Null + Right$("SomeText", 1)
V = Right("SomeText", 0)
Null传播在Visual Basic.NET中将不再被支持。象上面的语句
1+Null会产生一个类型错误。另外在Visual Basic 6.0中有两个求左值的函数:Left和Left$前者返回值为Variant类型并且可以为空,Left$函数返回值为String类型。在Visual Basic.NET中,只有一个Left函数,该函数总是返回String类型值
为了使程序兼容Visual Basic 6.0以及Visual Basic.NET,你需
要在代码中加入对Null检测的代码,在Visual Basic.NET中,下面的函数将不再返回Null值:
Chr Mid
Command Oct
CurDir Right
Date RTrim
Environ Space
Error Str
Hex Time
LCase Trim
LTrim UCase
由于数据库中的数据可以包含Null值,所以你需要在程序中对获得的
数据加入代码检测其值是否为Null。
使用以0为下界的数组
Visual Basic 6.0允许你使用任何整数数字作为一个数组的上界
和下界。同样你也可以通过ReDim将一个Variant重新定义为数组。为了能够同.NET平台下的其它语言协同工作,Visual Basic.NET数组必须以0作为下界,而且只有一个变量事先定义为数组后才可以使用ReDim函数重新定义。虽然这样限制了数组定义的灵活性,但是这样可以在Visual Basic.NET和.NET下的其它语言之间传递数组。下面的范例说明了新的定义数组的约束:
Dim a(1 To 10) As Integer '错误:下界必须为0
Dim v
ReDim v(10) '错误,在没有定义v为数组前不能使用ReDim
Dim b(10) As Integer '正确
ReDim b(5) As Integer '正确
另外,在Visual Basic 6.0中, Dim (0 to 10) As Integer定
义了包含11各整数的数组,索引从0到10。同样
的定义在Visual Basic.NET下建立一个包含10个整数的数组,索引从
0到9。
基于上面的改变,Option Base 0|1已经从Visual Basic.NET中
删除了。
当你的代码升级到Visual Basic.NET后,以0为下界的数组不会
改变。如果数组下界非0的话,数组会升级到一个兼容类,如下:
Dim a(1 To 10) As Integer
改变为:
Dim a As Object = New VB6.Array(GetType(Short), 1,10)
兼容数组类比本地数组操作起来要慢很多,同时在程序中使用它
也有限制。例如你不能将一个兼容数组类作为参数传递到一个以数组作为参数的函数,你也不能传递一个兼容类到Visual C#或者Visual C++类中。
基于以上原因,你需要在你的Visual Basic 6.0代码中使用以0
为下界的数组,避免使用ReDim定义数组,避免使用Option Base 1语句。
使用VB常量而不要使用它们所代表的值在写代码的时候,尽量使用VB常量而不要使用它们所代表的值。例如你要在运行时将一个窗口最大化,使用:
Me.WindowState = vbMaximized 'Good: Constant name
而不要使用:
Me.WindowStyle = 2 'Bad: Underlying value
Me.WindowStyle = X 'Bad: Variable
在Visual Basic.NET中,一些属性和常量的数值发生了改变;例
如True的值由-1变为了1。在你的代码升级到Visual Basic.NET后,大部分的常量会自动更改;然而如果你使用的是常量代表的数值而不是常量名,那么你就要做大量的手工更改工作。
用户自定义数据类型中的数组和固定长度字符串
为了使Visual Basic.NET数组和数据结构完全兼容Visual
Studio.NET,固定长度字符串在新语言中不再被支持。在大多数情况下者不是问题,因为Visual Basic.NET提供了兼容固定长度字符串定义的类,那么代码:
Dim MyFixedLengthString As String * 100
升级后会变成这样:
Dim MyFixedLengthString As New VB6.FixedLengthString(100)
然而,在数据结构(例如用户自定义数据)中使用固定长度字符
串类可能产生错误。因为在用户自定义数据结构建立时类不会被建立。用户自定义数据中的固定长度数组也会产生同样的问题。
当你的代码升级后,在代码中的用户自定义数据类型中如果有固
定长度的数组和字符串的话,在定义位置会添加注释提醒你在使用用户自定义数据类型前首先对字符串或者数组进行初始化。然而,你可以在你的Visual Basic 6.0的用户自定义类型中将固定长度的字符串定义改变为字符串定义,将固定长度数组定义改变为未初始化数组来
避免升级产生后产生上面的问题。例如:
Private Type MyType
MyArray(5) As Integer
MyFixedString As String * 100
End Type
Sub Bar()
Dim MyVariable As MyType
End Sub
升级后会变为:
Private Type MyType
MyArray() As Integer
MyFixedString As String
End Type
Sub Bar()
Dim MyVariable As MyType
ReDim MyVariable.MyArray(5) As Integer
MyVariable.MyFixedString = String$(100, &quo