Какая захватывающая ошибка.
У меня нет удобной отладочной сборки движка VBScript. (Десятилетний жесткий диск, на котором я его держал, явно испортился через два года с тех пор, как я в последний раз смотрел его.) Однако я легко могу догадаться, что здесь происходит. Я подозреваю, что я не пометил инструкцию, соответствующую «end», как точку, в которой закончился оператор, и сборщик должен работать.
Давайте рассмотрим эту гипотезу.
В вашем первом примере, когда запустится GC? Когда программа заканчивается. В этот момент терминаторы запускаются в том порядке, в котором они были созданы. (Это деталь реализации, на которую не следует полагаться.)
В вашем втором и третьем примере конец вызова nop вызывает GC, и это происходит сразу после окончания с. (Я не совсем уверен, почему во втором примере запускается сборщик мусора, когда объект пригоден для сбора; я не помню точную семантику кода для извлечения ссылки на объект из области видимости блока.)
В вашем четвертом примере GC запускается перед внутренним с и ничего не делает.
Поскольку я написал и логику завершения, и изрядное количество кода обработки «с», я, несомненно, вызвал эту ошибку, поэтому очень много извинений. Поскольку, по-видимому, мы жили с ним без особых проблем в течение последних одиннадцати или двенадцати лет, и поскольку это влияет только на блоки «с», в которых нет содержимого, я не думаю, что это когда-либо будет исправлено.
В любом случае, вы не должны полагаться на приказ о расторжении. Это плохая практика программирования.
Подробнее об увлекательной теме логики завершения VBScript см .:
Каков порядок уничтожения объектов в VBScript?