Как уничтожить объект

Кажется, что 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

Другим способом обеспечения надлежащего уничтожения объекта является его ссылка на объект на блок With (т.е. не объявлять локальную переменную):

Sub Test()
    With New FileSystemObject
        MsgBox .Drives.Count
    End With
End Sub

Объект существует только внутри блока With, и когда выполнение достигает маркера End With, если вы попробуете его с помощью специального модуля класса, вы заметите, что обработчик класса Class_Terminate работает эффективно подтверждая надлежащее разрушение объекта.

Что касается As New quirk, как уже было объяснено, если вы намерены установить ссылку на объект Nothing внутри этой области, не объявляйте он с As New, потому что VBA установит ссылку на объект на Nothing, но также с радостью ( "полезно" ) создаст для вас новый экземпляр, как только вы снова ссылаетесь на него, только убедитесь, что объект Is Nothing.

С другой стороны, это (раздражающее) контр-интуитивное поведение является тем, что стоит за аргументами Rubberduck Объект переменная - это самоподписанный контроль кода:

RD website's inspection results

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

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

Ответ 2

он должен иметь отношение к шаблону "объявить и создать экземпляр", чаще всего рассматриваемому как шаблон ", которого следует избегать"

если вы разделите их, вы получите 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

Ответ 3

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

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

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