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
对象。
答案 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的对象变量的原因是自我分配的代码检查:
(注意:如果您有想要检查的代码,请知道它在实际VBE中比在网站上运行更多更快
(如果还不清楚:我参与了Rubberduck项目)
答案 2 :(得分:10)
这个修改过的代码似乎运行正常。似乎在同一条线上有暗淡/新的细微差别。希望其他人可以更好地了解推理。
正如其他人所评论的那样,如果它在sub中是昏暗的,那么无论如何它将在子完成后收集。
Sub Test2()
Dim Fs As FileSystemObject
Set Fs = New FileSystemObject
Set Fs = Nothing
End Sub