如果我使用 设置变量CreateObject()
,是否需要Nothing
在使用后将其设置为清理?
Dim foo
Set foo = CreateObject("SomeAssembly")
foo Bar
Set foo = Nothing
我刚刚发现Eric Lippert的这篇文章:
脚本引擎会在它们超出范围时自动清除这些变量,因此在它们超出范围之前清除它们似乎毫无意义。
如果我使用 设置变量CreateObject()
,是否需要Nothing
在使用后将其设置为清理?
Dim foo
Set foo = CreateObject("SomeAssembly")
foo Bar
Set foo = Nothing
我刚刚发现Eric Lippert的这篇文章:
脚本引擎会在它们超出范围时自动清除这些变量,因此在它们超出范围之前清除它们似乎毫无意义。
如果我使用 CreateObject() 设置变量,是否需要在使用后将其设置为 Nothing 来清理它?
通常你不这样做,但你所做的已经成为 VB 社区的传说。如果你是一个迷信的人,通过将变量设置为你完成它们的时间来抵御邪恶的眼睛并没有什么坏处Nothing
,但它也几乎没有任何帮助。
您确实需要将变量设置为的极少数情况Nothing
是:
如果我不是其中一种情况,我不会将变量设置为Nothing
. 我从来没有遇到过这个问题。
我很少这样做:-
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
-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
。
如果您的变量是模块或全局变量(在模块顶部附近声明,在任何过程之外),则该变量可能不会在脚本结束时自动超出范围。在某些情况下这可能会导致问题,因此您可能会考虑将变量设置为空(或者如果它不是对象变量,则为默认值)。