Período de duración en Visual Basic

La vigencia de un elemento declarado es el período de tiempo durante el cual está disponible para su uso. Las variables son los únicos elementos que tienen vigencia. Con este fin, el compilador trata los parámetros de procedimiento y los valores devueltos de las funciones como casos especiales de variables. La vigencia de una variable representa el período de tiempo durante el cual puede contener un valor. Su valor puede cambiar durante su vigencia, pero siempre contiene algún valor.

Diferentes vigencias

Una variable miembro (declarada en el nivel de módulo, fuera de cualquier procedimiento) suele tener la misma vigencia que el elemento en el que se declara. Una variable no compartida declarada en una clase o estructura existe como una copia independiente para cada instancia de la clase o estructura en la que se declara. Cada variable de este tipo tiene la misma vigencia que su instancia. Sin embargo, una variable Shared solo tiene una vigencia única que dura todo el tiempo en que se ejecuta la aplicación.

Una variable local (declarada dentro de un procedimiento) solo existe mientras se ejecuta el procedimiento en el que se declara. Esto también se aplica a los parámetros de ese procedimiento y a cualquier valor devuelto por la función. Sin embargo, si ese procedimiento llama a otros procedimientos, las variables locales conservarán sus valores mientras se ejecutan los procedimientos llamados.

Comienzo de la vigencia

La vigencia de una variable local comienza cuando el control entra en el procedimiento en el que se declara. Cada variable local se inicializa con el valor predeterminado para su tipo de datos en cuanto el procedimiento comienza a ejecutarse. Cuando el procedimiento encuentra una instrucción Dim que especifica valores iniciales, establece esas variables en esos valores, incluso si el código ya había asignado otros valores a ellos.

Cada miembro de una variable de estructura se inicializa como si fuera una variable independiente. De forma similar, cada elemento de una variable de matriz se inicializa individualmente.

Las variables que se declaran en un bloque dentro de un procedimiento (como un bucle For) se inicializan en la entrada al procedimiento. Estas inicializaciones surtirán efecto independientemente de si el código ejecuta el bloque alguna vez o no.

Fin de la vigencia

Cuando finaliza un procedimiento, los valores de sus variables locales no se conservan y Visual Basic reclama su memoria. La próxima vez que llame al procedimiento, todas sus variables locales se crearán de nuevo y se reinicializarán.

Cuando finaliza una instancia de una clase o estructura, sus variables no compartidas pierden su memoria y sus valores. Cada nueva instancia de la clase o estructura crea y reinicializa sus variables no compartidas. Sin embargo, las variables Shared se conservan hasta que la aplicación deja de ejecutarse.

Extensión de la vigencia

Si declara una variable local con la palabra clave Static, su vigencia será mayor que el tiempo de ejecución de su procedimiento. En la tabla siguiente se muestra cómo determina la declaración del procedimiento cuánto tiempo existe una variable Static.

Ubicación y uso compartido de procedimientos La vigencia de las variables estáticas comienza La vigencia de las variables estáticas finaliza
En un módulo (compartido de forma predeterminada) La primera vez que se llama al procedimiento Cuando la aplicación deja de ejecutarse
En una clase, Shared (el procedimiento no es un miembro de la instancia) La primera vez que se llama al procedimiento en una instancia específica o en el propio nombre de la clase o estructura Cuando la aplicación deja de ejecutarse
En una instancia de una clase, no Shared (el procedimiento es un miembro de la instancia) La primera vez que se llama al procedimiento en la instancia específica Cuando la instancia se ejecuta para la recolección de elementos no utilizados (GC)

Variables estáticas del mismo nombre

Puede declarar variables estáticas con el mismo nombre en más de un procedimiento. Si lo hace, el compilador de Visual Basic considerará que cada variable de este tipo es un elemento independiente. La inicialización de una de estas variables no afecta a los valores de las demás. Lo mismo se aplica si define un procedimiento con un conjunto de sobrecargas y declara una variable estática con el mismo nombre en cada sobrecarga.

Contenedor de elementos para variables estáticas

Puede declarar una variable local estática dentro de una clase, es decir, dentro de un procedimiento de esa clase. Sin embargo, no se puede declarar una variable local estática dentro de una estructura, ya sea como miembro de una estructura o como una variable local de un procedimiento dentro de esa estructura.

Ejemplo

Descripción

En el ejemplo siguiente se declara una variable con la palabra clave Static. (Tenga en cuenta que no necesitará la palabra clave Dim si la instrucción Dim usa un modificador como Static).

Código

Function runningTotal(ByVal num As Integer) As Integer
    Static applesSold As Integer
    applesSold = applesSold + num
    Return applesSold
End Function

Comentarios

En el ejemplo anterior, la variable applesSold continúa existiendo después de que el procedimiento runningTotal vuelva al código de llamada. La próxima vez que se llame a runningTotal, applesSold conservará su valor calculado anteriormente.

Si applesSold se hubiera declarado sin usar Static, los valores acumulados anteriores no se conservarían en las llamadas a runningTotal. La próxima vez que se llamara a runningTotal, applesSold se habría vuelto a crear y a inicializar en 0, y runningTotal simplemente habría devuelto el mismo valor con el que fue llamada.

Compilar el código

Puede inicializar el valor de una variable local estática como parte de su declaración. Si declara que una matriz es Static, puede inicializar su clasificación (número de dimensiones), la longitud de cada dimensión y los valores de los elementos individuales.

Seguridad

En el ejemplo anterior, puede generar la misma vigencia declarando applesSold en el nivel de módulo. Sin embargo, si cambió el ámbito de una variable de esta manera, el procedimiento ya no tendría acceso exclusivo a ella. Dado que otros procedimientos podrían acceder a applesSold y cambiar su valor, el total en ejecución podría ser poco confiable y el código sería más difícil de mantener.

Consulte también