对于:
Dim arr1 : arr1 = Array()
Dim arr2
Dim arr3 : ReDim arr3(1) : Erase arr3
WScript.Echo UBound(arr1)
WScript.Echo UBound(arr2)
WScript.Echo UBound(arr3)
对于arr1返回-1,但对于arr2和arr3则报错:"VBScript runtime error: Subscript out of range: 'UBound'"。
一个通用的测试数组是否“Dimmed”或“Empty”的函数也应该(可能)测试变量是否实际上是一个数组。
Function IsDimmedArray(arrParam)
Dim lintUBound : lintUBound = 0
Dim llngError : llngError = 0
IsDimmedArray = False
If Not IsArray(arrParam) Then : Exit Function
'' Test the bounds
On Error Resume Next
lintUBound = UBound(arrParam)
llngError = Err.Number
If (llngError <> 0) Then : Err.Clear
On Error Goto 0
If (llngError = 0) And (lintUBound >= 0) Then : IsDimmedArray = True
End Function ' IsDimmedArray(arrParam)
对我来说,99%的情况下,当我检查一个数组是否“已定义”时,是因为我需要获取该数组的 UBound,并且我想在数组未定义的情况下防止运行时错误。所以通常我会将 UBound 作为参数传递,例如:
Function IsDimmedArray(arrParam, intUBoundParam)
intUBoundParam = 0
...
我不知道这种做法是否真正节省了任何“时间”,但它几乎在每次使用时都可以节省一行代码,并且是强制执行错误检查实践的简单方法。
此外,我为了完整性而包含它,但在实践中,在IsDimmedArray中检查"UBound >= 0"并不常用。
If (llngError = 0) And (lintUBound >= 0) Then : IsDimmedArray = True
通常情况下不需要,因为它通常用于以下情况:
Dim arrX
Dim lintUBound
Dim intNdx
arrX = Array()
lintUBound = UBound(arrX)
WScript.Echo "arrX is an array with UBound=" & lintUBound
For intNdx = 0 to lintUBound
WScript.Echo "This will not print: " & intNdx
Next
因此,在这种情况下,
lintUBound = -1,For ... Next将被跳过。