VBScript установка нескольких объектов в Ничто не работает при передаче их в массив - PullRequest
0 голосов
/ 08 февраля 2019

Как я уже упоминал в этом вопросе, у меня есть специальная подпрограмма, которая, скажем, устанавливает и использует несколько объектов, как показано ниже:

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 минимальных строк кода?

1 Ответ

0 голосов
/ 08 февраля 2019

Вы инициируете массив, содержащий 4 ссылки на объекты.Эти 4 значения ссылок на объекты копируются из a, b, c и d.

Затем вы передаете этот вновь созданный массив в вашу функцию NothingifyObjects.NothingifyObjects берет ваш вновь созданный массив и перебирает его, устанавливая для каждого элемента в массиве значение «Nothing».Это не повлияет на ваши 4 локальные переменные в области действия Subroutine1, однако, так как Array содержит только копии 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
...