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)
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.
旁注,这种(恼人的)反直觉行为具体是对于Rubberduck的Object变量推理的原因是自我分配的代码检查:
(注意:如果您有想要检查的代码,请知道它在实际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)
| 归档时间: |
|
| 查看次数: |
8787 次 |
| 最近记录: |