Ответ 1
Для:
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.
Функция общего назначения, чтобы проверить, является ли массив "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
...
Я не знаю, действительно ли эта практика сохраняет какое-либо "время", но она сохраняет 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... Далее будет пропущен.