vbscript - Si configuro una variable usando `CreateObject()`, ¿necesito limpiarla configurándola a `Nothing` después de usarla?
resource-cleanup (3)
Si configuro una variable usando CreateObject()
, ¿necesito limpiarla configurándola en Nothing
después del uso?
Dim foo
Set foo = CreateObject("SomeAssembly")
foo Bar
Set foo = Nothing
Acabo de encontrar esta publicación de Eric Lippert :
El motor de secuencias de comandos borrará automáticamente esas variables cuando salgan del alcance, por lo que eliminarlas de la declaración antes de que salgan del alcance parece no tener sentido.
Si configuro una variable usando CreateObject (), ¿necesito limpiarla configurándola en Nothing después del uso?
Normalmente no lo hace, pero se ha convertido en una tradición en la comunidad de VB que hace. Si eres una persona supersticiosa, no está de más alejar el mal de ojo al configurar las variables en Nothing
cuando hayas terminado con ellas, pero tampoco ayuda en nada.
Los casos raros en los que necesita establecer una variable en Nothing
son aquellos casos en los que:
- ha creado una referencia circular que el recolector de basura no puede limpiar
- El objeto es caro pero la variable es de larga duración, por lo que desea que se limpie temprano
- la implementación del objeto requiere un orden de apagado particular que debe mantenerse
- y así.
Si no estoy en uno de esos casos, no establezco variables en Nothing
. Nunca he tenido un problema con eso.
Rara vez hago esto: -
Set foo = Nothing
Aquí es por qué ...
Considerar:-
Function DoStuff()
Dim foo : Set foo = CreateObject("lib.thing")
''''# Code that uses foo
Set foo = Nothing
End Function
Ya que foo
está a punto de quedar fuera del alcance de todos modos, asignar Nothing
a foo
es superfluo, así que no me molesto.
Considerar:-
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
Ahora bien, este es un caso en el que la asignación de Nothing
tiene sentido, ya que de lo contrario se mantiene por mucho más tiempo del necesario. Sin embargo, en tales casos, el código es un candidato para refactorización. El hecho de que la función siga haciendo muchas más cosas que no necesiten a foo
indica que la porción de código que utiliza foo
realidad pertenece a su propia función:
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
Hay ocasiones en las que es aconsejable asignar a Nothing
con fines de liberación de memoria, pero tiendo a hacerlo en casos especiales. En el código normal encuentro que rara vez es necesario.
Tal vez uno de los controladores detrás del campo "Establecer siempre en nada" es que muchos VBScripters escriben guiones secuenciales que no están bien incorporados en los procedimientos de Function
y Sub
.
Si su variable es un módulo o una variable global (declarada cerca de la parte superior de su módulo, fuera de cualquier procedimiento), es posible que la variable no quede fuera del alcance automáticamente al final de su script. Eso podría causar un problema en algunas situaciones, por lo que podría considerar establecer la variable a nada (o es la opción predeterminada si no es una variable de objeto).