如果我使用`CreateObject()`设置变量,是否需要在使用后将其设置为“Nothing”来清理它?

时间:2011-11-15 23:07:03

标签: vbscript resource-cleanup

如果我使用CreateObject()设置变量,是否需要在使用后将其设置为Nothing进行清理?

Dim foo
Set foo = CreateObject("SomeAssembly")
foo Bar
Set foo = Nothing

我刚刚this post找到了Eric Lippert

  

脚本引擎会在超出范围时自动清除这些变量,因此在它们超出范围之前清除它们似乎毫无意义。

2 个答案:

答案 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编写的序列脚本在FunctionSub程序中都没有被很好地考虑。