将多个对象传递到数组时,VBScript 将多个对象设置为 Nothing 不起作用

问题描述 投票:0回答:1

正如我在问题中提到的,我有特定的子例程,可以说设置并利用多个对象,如下所示:

Sub Subroutine1
    Set a = CreateObject("Somthing")
    Set b = CreateObject("SomthingElse")
    Set c = CreateObject("SomthingOther")
    Set d = CreateObject("Another")
    ' Some operation done with those objects
    Call NothingifyObjects(Array(a, b, c, d))
    If a Is Nothing Then
        MsgBox "Yes"
    Else
        MsgBox "No"
    End If
End Sub

我试图通过将对象的

Nothing
传递到另一个函数中来将所有这些设置为
Array

Function NothingifyObjects(arrObjectArray)
    For i = 0 to UBound(arrObjectArray)
        Set arrObjectArray(i) = Nothing
    Next
    arrObjectArray = Null
End Function

但是

MsgBox
仍然打印
No
,为什么以及如何使用最少代码行数
Function
来完成这项工作?

arrays object vbscript
1个回答
1
投票

您正在启动一个包含 4 个对象引用的数组。这 4 个对象引用值是从 a、b、c 和 d 复制的。

然后将新创建的数组传递到函数 NothingifyObjects 中。 NothingifyObjects 获取新创建的数组并对其进行迭代,将数组中的每个元素设置为“Nothing”。这不会影响 Subroutine1 范围内的原始 4 个局部变量,因为数组仅保存 a、b、c 和 d 的副本。

您可以将代码更改为:

Sub Subroutine1
    Set a = CreateObject("Somthing")
    Set b = CreateObject("SomthingElse")
    Set c = CreateObject("SomthingOther")
    Set d = CreateObject("Another")
    ' Some operation done with those objects
    Call NothingifyObjects(a, b, c, d)
    If a Is Nothing Then
        MsgBox "Yes"
    Else
        MsgBox "No"
    End If
End Sub

Function NothingifyObjects(a, b, c, d)
    Set a = Nothing
    Set b = Nothing
    Set c = Nothing
    Set d = Nothing
End Function

这将起作用,因为 VBScript 默认情况下会传递 ByRef。

如果你真的只是想减少代码行数,我能想到的是:

Function NothingifyObjects(a, b, c, d)
    Set a = Nothing : Set b = Nothing : Set c = Nothing : Set d = Nothing
End Function

...这会起作用,但可能看起来不太漂亮。

VBscript 不支持可选参数,因此您必须为函数设置预定义数量的参数。否则你可能会做出像你所建议的那样的东西。

如果是我,我会像这样内联 Set to Nothing 语句:

Sub Subroutine1
    Set a = CreateObject("VBScript.RegExp")
    Set b = CreateObject("VBScript.RegExp")
    Set c = CreateObject("VBScript.RegExp")
    Set d = CreateObject("VBScript.RegExp")
    ' Some operation done with those objects
    Set a = Nothing
    Set b = Nothing
    Set c = Nothing
    Set d = Nothing
    If a Is Nothing Then
        MsgBox "Yes"
    Else
        MsgBox "No"
    End If
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.