Для:
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)
Возвращает -1 для arr1, но «Ошибка времени выполнения VBScript: нижний индекс вне диапазона:« UBound »» для arr2 и arr3.
Функция общего назначения для проверки того, является ли массив «затемненным» или «пустым», также должна (вероятно) проверять, является ли переменная фактически массивом.
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
...
Я не знаю, действительно ли эта практика экономит какое-либо «Время», но она экономит 1 строку кода практически при каждом использовании, и это простой способ применить практику проверки ошибок.
Кроме того, я включил его для полноты, но на практике проверка "UBound> = 0" в IsDimmedArray:
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 будет пропущено.