如何破坏一个物体

时间:2017-02-10 16:58:05

标签: vba excel-vba vb6 access-vba excel

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

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

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

所以如何销毁这个Fs对象。

3 个答案:

答案 0 :(得分:17)

它必须与"声明&实例"模式,通常被称为"要避免"图案

如果您拆分它们,则在将其设置为:{/ p>后得到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

答案 1 :(得分:16)

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

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

该对象只存在于With块内,当执行到达End With令牌时,如果您使用自定义类模块进行尝试,您会注意到类{{1}处理程序运行,有效地确认对象的正确销毁。

至于Class_Terminate quirk,as was already explained,如果您打算在该范围内将对象引用设置为As New,请不要将其声明为Nothing,因为VBA 将对象引用设置为As New,但是一旦您再次重新引用它,也会愉快地(“帮助”)为您创建一个新实例,只是为了验证它对象Nothing

旁注,这种(讨厌的)反直觉行为具体是Rubberduck对象变量的原因是自我分配的代码检查:

RD website's inspection results

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

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

答案 2 :(得分:10)

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

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

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