2017-02-10 38 views
11

Кажется, что Set Object = Nothing не уничтожить Fs объект в этом коде:Как уничтожить объект,

Sub Test2() 
    Dim Fs As New FileSystemObject 
    Set Fs = Nothing 
    MsgBox Fs.Drives.Count ' this line works 
End Sub 

Последняя строка работает без ошибок !. thats mean Fs Объект все еще существует, правильно ?.

Итак, как уничтожить это Fs Объект.

+1

Дайте ему выйти из сферы действия? Почему вы чувствуете необходимость уничтожить его? – Comintern

+0

@Comintern, я использую этот объект для чтения текстового файла, сохраненного в томе TrueCrypt, и после его использования я не могу отключить этот том, может быть, если я его уничтожу, я смогу отключить этот том. – Fadi

+1

Возможный дубликат [VBA: Разница в двух способах объявления нового объекта? (Попытка понять, почему мое решение работает)] (http: // stackoverflow.com/questions/2478097/vba-difference-in-two-ways-of-declaring-a-new-object-try-to-understand-why) – Comintern

ответ

13

Другой способ, чтобы обеспечить надлежащее разрушение объекта, чтобы дать свою ссылку на объект к 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 является самоназначенными инспекции кода:

RD website's inspection results

(примечание: если у вас есть код, который вы хотите проверить, знаете, что он работает много быстрее в реальном VBE, чем на веб-сайте)

(если оно уже не ясны: я активно участвую в проекте Rubberduck)

+0

Большое спасибо. Кружка Мата. user3598756 и ответы Zerk - отличные ответы и помогают мне, но я думаю, что ваш ответ является лучшим и должен быть принятым ответом, чтобы помочь другим пользователям. – Fadi

+0

Хмм, я не собирался красть галочку здесь, только для того, чтобы предоставить * дополнительную * информацию - спасибо в любом случае! –

+0

Я знал о 'Dim', затем' Set' и тестировал его, прежде чем публиковать свой вопрос, но я искал дополнительную информацию, такую ​​как ваш ответ, Еще раз спасибо. – Fadi

9

Этот измененный код работает нормально. Кажется нюансом с тусклым/новым на той же линии. Надеюсь, кто-то еще может дать лучшую идею относительно рассуждений.

Как прокомментировали другие, если он является тусклым внутри суб-объекта, он будет собран после завершения завершения.

Sub Test2() 
    Dim Fs As FileSystemObject 
    Set Fs = New FileSystemObject 
    Set Fs = Nothing 
End Sub 
+0

Спасибо @Zerk. – Fadi

17

он должен иметь дело с рисунком «объявить & Instantiate», чаще всего обращаются как к «следует избегать» модель

если вы разделяете их, вы получаете Nothing после установки его:

Sub Test2() 
    Dim Fs As FileSystemObject 
    Set Fs = New FileSystemObject 
    Set Fs = Nothing 
    MsgBox Fs.Drives.Count ' this line DOESN'T work 
End Sub 
+0

Большое спасибо пользователю3598756, и я сожалею, но я думаю, что кружка Матса дает отличный ответ. – Fadi

+2

Я тоже так думаю. – user3598756