21

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

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

我刚刚发现Eric Lippert这篇文章

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

4

3 回答 3

34

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

通常你不这样做,但你所做的已经成为 VB 社区的传说。如果你是一个迷信的人,通过将变量设置为你完成它们的时间来抵御邪恶的眼睛并没有什么坏处Nothing,但它也几乎没有任何帮助。

您确实需要将变量设置为的极少数情况Nothing是:

  • 您创建了垃圾收集器无法清理的循环引用
  • 该对象很昂贵,但变量是长期存在的,因此您希望尽早清理它
  • 对象实现需要必须维护的特定关闭顺序
  • 等等。

如果我不是其中一种情况,我不会将变量设置为Nothing. 我从来没有遇到过这个问题。

于 2011-11-16T14:41:40.840 回答
16

我很少这样做:-

Set foo = Nothing 

这就是为什么...

考虑:-

Function DoStuff()
    Dim foo : Set foo = CreateObject("lib.thing")
    ''# Code that uses foo
    Set foo = Nothing
End Function

由于foo即将超出范围,无论如何分配Nothingfoo多余的,所以我不打扰。

考虑:-

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-using 代码块实际上属于它自己的函数:-

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是可取的,但我倾向于在特殊情况下这样做。在普通代码中,我发现很少需要。

也许“总是一无所获”阵营背后的驱动因素之一是许多 VBScripter 编写的顺序脚本没有很好地融入Function程序Sub

于 2011-11-16T13:20:25.980 回答
1

如果您的变量是模块或全局变量(在模块顶部附近声明,在任何过程之外),则该变量可能不会在脚本结束时自动超出范围。在某些情况下这可能会导致问题,因此您可能会考虑将变量设置为空(或者如果它不是对象变量,则为默认值)。

于 2019-03-13T02:17:33.330 回答