正如我在问题中提到的,我有特定的子例程,可以说设置并利用多个对象,如下所示:
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
来完成这项工作?
您正在启动一个包含 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