VBScript中的零长度数组

时间:2010-01-21 09:17:04

标签: arrays vbscript

我必须做一些ASP工作,我发现该语言没有提供检测零长度数组的方法(好吧,我想你可以检测到它们在你尝试使用它们时抛出的异常...... )。如果没有任何理智的方法来处理它,为什么Split()会返回一个空数组?或者我错过了什么?

我编造了以下hack以检测空数组,但必须有一种更简单的方法。这是什么? TIA

function ArrayEmpty (a)
    dim i, res
    res = true
    for each i in a
        res = false
        exit for
    next
    ArrayEmpty = res
end function

5 个答案:

答案 0 :(得分:6)

有关:

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,但是" VBScript运行时错误:下标超出范围:' UBound'"对于arr2和arr3。

一个通用函数,用于测试数组是否为" Dimmed"或"空"还应该(可能)测试变量是否实际上是一个数组。

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%的时间我正在检查数组是否是#Dime;维度#34;,如果我需要获取数组的UBound并且我想防止运行时错误阵列未标注尺寸的情况。所以我通常会将UBound作为参数传递给:

Function IsDimmedArray(arrParam, intUBoundParam)
    intUBoundParam = 0
    ...

我不知道这种做法是否真的可以节省任何时间&#34;时间&#34;但它几乎每次使用都会保存1行代码,并且是一种简单的方法来强制执行错误检查。

另外,我将其包含在内是为了完整性,但实际上,在IsDimmedArray中检查&#34; UBound&gt; = 0&#34;

    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。

答案 1 :(得分:4)

使用Array函数创建的空数组或其他内部VBScript函数(如Split)返回的空数组的上限为-1。所以你可以测试一个像这样的空数组:

Dim arr : arr = Array()

If UBound(arr) >= 0 Then
  ' arr is non-empty
Else
  ' arr is empty
End If

此处有更多信息:Testing for Empty Arrays

答案 2 :(得分:2)

如果你的方法应该能够返回一个空数组,你的代码就必须像这样

Option Explicit

dim result : result = mymethod
if(NOT ubound(result) > 0) then MsgBox "Array Is Empty"
dim elem : for each elem in result
  MsgBox "Element"
Next

Function mymethod
  dim results : results = Array()
  mymethod = results
End Function

Array()创建一个Ubound = -1数组,在每个循环中没有循环。

答案 3 :(得分:1)

我认为这是检查VBS中的数组的好方法

Dim myArray
myArray = Array()
sTest = IsArrayEmpty(myArray)
Msgbox (sTest) ' True
Function IsArrayEmpty(myArray)
    iRet = True

    If IsArray(myArray) Then
        i = 0
        For Each e In myArray
            If Not IsEmpty(e) And Len(e)>0 Then
                i = i +1
            End If
        Next
        If i>0 Then
            iRet = False
        End If
    End If
    wIsArrayEmpty = iRet
End Function

答案 4 :(得分:0)

我在TechNet上发现了一个建议使用VarType检查数组的线程:

Function ArrayEmpty (a)
    If VarType(a) < 8192 Then ArrayEmpty=True Else ArrayEmpty=False
End Function

对我有用。