Set используется для назначения объектов переменным. Ничто не думайте как особый объект
>> WScript.Echo IsObject(Nothing)
>>
-1
, который полезен только для указания пустоты переменной. Ваш
Set strConnectHost = Nothing
назначает это Ничто для strConnectHost. После этого переменная бесполезна - она содержит пустой объект, который нельзя распечатать или использовать в вычислениях или попросить сделать методы.
Мошенничество с префиксом типа (* str * ConnectHost) должно предупредить вас, что это подозрительно. Вы работаете со строками (и числами?); чтобы очистить / сбросить их, используйте (простое) назначение с пустым:
>> strConnectHost = Empty
>>
>> WScript.Echo IsEmpty(strConnection)
>>
-1
или с подходящим значением:
intWaitString = -1 ' or 0 ...
(при условии, что intWaitString не является мошенничеством с префиксами другого типа).
ВТОРАЯ ПОПЫТКА:
Полагаю, вы называете свою подлодку так:
strHost = "SomeHost"
prConnectToHost strHost
Соответствующий дайджест вашего саба:
Sub prConnectToHost( [ByRef] strConnectHost)
...
Set strConnectHost = Nothing
End Sub
Поскольку VBScript по умолчанию использует передачу параметров по ссылке, ваша модификация
изменяет переменную вызывающей стороны strHost. Это происходит и с необъектными переменными:
Dim sVar : sVar = "String 0"
WScript.Echo 0, sVar
changeString sVar
WScript.Echo 1, sVar
Sub changeString( sByRefVar )
sByRefVar = "String 1: changed by changeString( ByRef sByRefVar )"
End Sub
выход:
0 String 0
1 String 1: changed by changeString( ByRef sVar )
В вашем случае модификация ничего не присваивает переменной, которая называется
strConnectHost в Sub и strHost на уровне вызывающего. Как я сказал ранее,
что делает переменную бесполезной (кроме проверки на Is Nothing).
Надеюсь, это объясняет забивание strHost.
WRT 'управление памятью': за исключением особых случаев, вам не нужно
Переменные сброса / сброса / SetToNothing в VBScript. Использование локальной переменной в вашем
Subs / Functions это все что нужно. Если вы решили использовать глобальные переменные
и управляя своим состоянием самостоятельно, необходимо обратить внимание на типы переменных:
Изменение типа от объекта (включая Ничто) <=> не объект и ложь
вводить в заблуждение префиксы типов опасно / верный путь к разрушению.
Если вы считаете, что должны очистить strHost, присвойте Empty или "" strConnectHost.
СЛЕДУЮЩАЯ ДОБАВКА
Все переменные VBScript являются вариантами, но не все варианты созданы равными:
>> s0 = "string"
>> s1 = CStr( 12.35 )
>> WScript.Echo TypeName( s0 ), TypeName( s1 )
>>
String String
>> n0 = 1
>> n1 = CByte( n0 )
>> WScript.Echo TypeName( n0 ), TypeName( n1 )
>>
Integer Byte
TypeName () и VarType () показывают подтипы, и программатор может использовать набор
C[hange/onvertTo]<Type>()
функции для их обеспечения - в некоторой степени, как назначения
может менять типы «под капотом».
>> WScript.Echo TypeName( n0 ), TypeName( n1 )
>>
Integer Byte
>> n0 = 1.1
>> n1 = 2 ^ 20
>> WScript.Echo TypeName( n0 ), TypeName( n1 )
>>
Double Double
Есть даже ошибки несоответствия типов:
>> WScript.Echo Nothing
>>
Error Number: 13
Error Description: Type mismatch
>>
>> WScript.Echo s0 Is Nothing
>>
Error Number: 424
Error Description: Object required
Так что подтипы имеют значение. Некоторые люди думают, что префиксы типа не круты, но другие видят
они как ценная помощь в слабо типизированных языках. Если вы решите использовать их, вы
следует использовать их правильно -
Set strWhatEver = objWhatever
objWhatever = intWhatever
intWhatever = objWhatever
If strWhatEver = intWhatever Then
все пахнет (не обращая внимания на типы и трудно определить ошибки в последующем коде).