Другой способ, чтобы обеспечить надлежащее разрушение объекта, чтобы дать свою ссылку на объект к With
блока (т.е. не объявить локальную переменную):
Sub Test()
With New FileSystemObject
MsgBox .Drives.Count
End With
End Sub
Объект только когда существует внутри With
блока, и, когда выполнение достигает End With
фишку, если вы попробуете его с модулем пользовательского класса вы заметите, что класс Class_Terminate
обработчик работает, эффективно подтверждая надлежащее уничтожение объекта.
Что касается As New
причуды, as was already explained, если вы собираетесь установить ссылку на объект Nothing
внутри этой сферы, не объявляйте его As New
, поскольку VBA будет установить ссылку на объект Nothing
, но также будет счастливо («полезно») создайте новый экземпляр для вас, как только вы снова ссылаетесь на него, только убедитесь, что объект Is Nothing
.
Примечание стороны, это (раздражает) нелогичное поведение именно то, что за рассуждениями для переменного объекта Rubberduck «s является самоназначенными инспекции кода:
(примечание: если у вас есть код, который вы хотите проверить, знаете, что он работает много быстрее в реальном VBE, чем на веб-сайте)
(если оно уже не ясны: я активно участвую в проекте Rubberduck)
Дайте ему выйти из сферы действия? Почему вы чувствуете необходимость уничтожить его? – Comintern
@Comintern, я использую этот объект для чтения текстового файла, сохраненного в томе TrueCrypt, и после его использования я не могу отключить этот том, может быть, если я его уничтожу, я смогу отключить этот том. – Fadi
Возможный дубликат [VBA: Разница в двух способах объявления нового объекта? (Попытка понять, почему мое решение работает)] (http: // stackoverflow.com/questions/2478097/vba-difference-in-two-ways-of-declaring-a-new-object-try-to-understand-why) – Comintern