vbscript resource-cleanup

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).