如果我使用CreateObject()
设置变量,是否需要在使用后将其设置为Nothing
进行清理?
Dim foo
Set foo = CreateObject("SomeAssembly")
foo Bar
Set foo = Nothing
我刚刚this post找到了Eric Lippert:
脚本引擎会在超出范围时自动清除这些变量,因此在它们超出范围之前清除它们似乎毫无意义。
答案 0 :(得分:29)
如果我使用CreateObject()设置变量,是否需要在使用后将其设置为Nothing来清理它?
通常你没有,但它已成为你所做的VB社区的绝杀。如果你是一个超级明星的人,那么当你完成它们时,通过将变量设置为Nothing
,它不会伤害来抵御邪恶的眼睛,但它也很少有任何帮助。
您需要将变量设置为Nothing
的极少数情况是:
如果我不属于其中一种情况,我不会将变量设置为Nothing
。我从来没有遇到过这个问题。
答案 1 :(得分:11)
我很少这样做: -
Set foo = Nothing
这就是为什么......
考虑: -
Function DoStuff()
Dim foo : Set foo = CreateObject("lib.thing")
''# Code that uses foo
Set foo = Nothing
End Function
由于foo
即将超出范围,无论如何将Nothing
分配给foo
是多余的,所以我不打扰。
考虑: -
Function DoStuff()
Dim foo : Set foo = CreateObject("lib.thing")
''# Code that uses foo
Set foo = Nothing
''# Loads more code that doesn't use foo
End Function
现在,这是一种分配Nothing
有意义的情况,因为否则它的持续时间可能比必要时间长很多。 然而在这种情况下,代码是重构的候选者。事实上该函数继续做了很多不需要foo
的东西,这表明foo
- 使用大块代码实际上属于它自己的函数: -
Function DoStuff()
''# Code that calls FooUsage
''# Loads more code that doesn't use foo
End Function
Function FooUsage(someParams)
Dim foo : Set foo = CreateObject("lib.thing")
''# Code that uses foo
FooUsage = someResult
End Function
在某些情况下,为了释放内存而分配给Nothing
是可取的,但我倾向于在特殊情况下这样做。在普通代码中,我发现它很少有必要。
也许“永远无所事事”阵营背后的驱动因素之一就是许多VBScripters编写的序列脚本在Function
和Sub
程序中都没有被很好地考虑。