如何破坏一个物体

Fad*_*adi 15 vb6 excel vba excel-vba access-vba

似乎Set Object = Nothing没有破坏Fs此代码中的Object:

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

最后一行没有错误!那意味着Fs对象仍然存在,对吗?

那么如何破坏这个Fs对象.

use*_*756 18

它必须与"声明和实例化"模式有关,通常被称为"待避免"模式

如果你拆分它们,你可以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
Run Code Online (Sandbox Code Playgroud)

  • 我也这么认为. (2认同)

Mat*_*don 17

确保正确销毁对象的另一种方法是生成对象的对象引用With(即不声明局部变量):

Sub Test()
    With New FileSystemObject
        MsgBox .Drives.Count
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

该对象只存在于With块内,并且当执行到达End With令牌时,如果您使用自定义类模块尝试它,您将注意到该类的Class_Terminate处理程序运行,有效地确认了对象的正确销毁.

至于As Newquirk,正如已经解释的那样,如果你打算将对象引用设置Nothing在该范围内,请不要声明它As New,因为VBA 会将对象引用设置为Nothing,但也会愉快地("帮助")创建一个只要再次重新引用它,就可以为您提供新实例,只需验证该对象即可Is Nothing.

旁注,这种(恼人的)反直觉行为具体是对于RubberduckObject变量推理的原因是自我分配的代码检查:

RD网站的检查结果

(注意:如果您有想要检查的代码,请知道它在实际VBE中的运行速度比在网站上运行快得多)

(如果还不清楚:我参与了Rubberduck项目)


Zer*_*erk 12

这个修改过的代码似乎运行正常.似乎在同一条线上有暗淡/新的细微差别.希望其他人可以更好地了解推理.

正如其他人所评论的那样,如果它在sub中是昏暗的,那么它将在sub完成后收集.

Sub Test2()
    Dim Fs As FileSystemObject
    Set Fs = New FileSystemObject
    Set Fs = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)