Ámbito en Visual Basic

El ámbito de un elemento declarado es el conjunto de todo el código que puede hacer referencia a él sin habilitar su nombre ni ponerlo a disposición a través de una instrucción Imports (Tipo y espacio de nombres de .NET). Un elemento puede tener ámbito en uno de los siguientes niveles:

Nivel Descripción
Ámbito de bloque Disponible solo dentro del bloque de código en el que se declara
Ámbito de procedimiento Disponible para todo el código dentro del procedimiento en el que se declara
Ámbito de módulo Disponible para todo el código dentro del módulo, clase o estructura en el que se declara
Ámbito de espacio de nombres Disponible para todo el código del espacio de nombres en el que se declara

Estos niveles de progreso de ámbito del más estrecho (bloque) al más ancho (espacio de nombres), donde el ámbito más estrecho significa el conjunto de código más pequeño que puede hacer referencia al elemento sin habilitación. Para más información, consulte "Niveles de ámbito" en esta página.

Especificación del ámbito y definición de variables

El ámbito de un elemento se especifica al declararlo. El ámbito puede depender de los siguientes factores:

  • La región (bloque, procedimiento, módulo, clase o estructura) en la que se declara el elemento.

  • El espacio de nombres que contiene la declaración del elemento

  • El nivel de acceso que declara para el elemento

Tenga cuidado de no definir variables con el mismo nombre pero con un ámbito diferente, ya que hacerlo puede dar lugar a resultados inesperados. Para obtener más información, consulta References to Declared Elements.

Niveles de ámbito

Un elemento de programación está disponible en toda la región en la que se declara. Todo el código de una misma región puede hacer referencia al elemento sin habilitar su nombre.

Ámbito de bloque

Un bloque es un conjunto de instrucciones incluidas dentro de las instrucciones de declaración de inicio y finalización como, por ejemplo, el siguiente:

  • Do y Loop

  • For [Each] y Next

  • If y End If

  • Select y End Select

  • SyncLock y End SyncLock

  • Try y End Try

  • While y End While

  • With y End With

Si declara una variable dentro de un bloque, solo puede usarla dentro de ese bloque. En el ejemplo siguiente, el ámbito de la variable de entero cube es el bloque entre If y End If, y ya no se puede hacer referencia a cube cuando la ejecución sale fuera del bloque.

If n < 1291 Then
    Dim cube As Integer
    cube = n ^ 3
End If

Nota

Incluso si el ámbito de una variable se limita a un bloque, su duración sigue siendo la del procedimiento completo. Si entra en el bloque más de una vez durante el procedimiento, cada variable de bloque conserva su valor anterior. Para evitar resultados inesperados en este caso, es aconsejable inicializar las variables de bloque al principio de este.

Ámbito de procedimiento

Un elemento declarado dentro de un procedimiento no está disponible fuera de ese procedimiento. Solo el procedimiento que contiene la declaración puede usarlo. Las variables en este nivel también se conocen como variables locales. Las declara con la instrucción Dim, con o sin la palabra clave Static.

El ámbito de procedimiento y el de bloque están estrechamente relacionados. Si declara una variable dentro de un procedimiento, pero fuera de todos los bloques de ese procedimiento, puede considerar que la variable tiene ámbito de bloque, en el que este lo constituye todo el procedimiento.

Nota

Todos los elementos locales, incluso si son variables Static, son privados para el procedimiento en el que aparecen. No se puede declarar ningún elemento mediante la palabra clave Public dentro de un procedimiento.

Ámbito de módulo

Por comodidad, el nivel de módulo de un solo término se aplica por igual a módulos, clases y estructuras. Puede declarar elementos en este nivel colocando la instrucción de declaración fuera de cualquier procedimiento o bloque pero dentro del módulo, clase o estructura.

Cuando realiza una declaración en el nivel de módulo, el nivel de acceso que elija determina el ámbito. El espacio de nombres que contiene el módulo, clase o estructura también afecta al ámbito.

Los elementos para los que declara el nivel de acceso privado están disponibles para todos los procedimientos de ese módulo, pero no para ningún código de otro módulo. La instrucción Dim en el nivel de módulo tiene Private como valor predeterminado si no usa ninguna palabra clave de nivel de acceso. Sin embargo, puede hacer que el ámbito y el nivel de acceso sean más obvios mediante la palabra clave Private de la instrucción Dim.

En el ejemplo siguiente, todos los procedimientos definidos en el módulo pueden hacer referencia a la variable de cadena strMsg. Cuando se llama al segundo procedimiento, muestra el contenido de la variable de cadena strMsg en un cuadro de diálogo.

' Put the following declaration at module level (not in any procedure).
Private strMsg As String
' Put the following Sub procedure in the same module.
Sub initializePrivateVariable()
    strMsg = "This variable cannot be used outside this module."
End Sub
' Put the following Sub procedure in the same module.
Sub usePrivateVariable()
    MsgBox(strMsg)
End Sub

Ámbito de espacio de nombres

Si declara un elemento en el nivel de módulo mediante la palabra clave Friend o Public, estará disponible para todos los procedimientos del espacio de nombres en el que se declara el elemento. Con la siguiente modificación del ejemplo anterior, el código puede hacer referencia a la variable de cadena strMsg en cualquier parte del espacio de nombres de su declaración.

' Include this declaration at module level (not inside any procedure).
Public strMsg As String

El ámbito del espacio de nombres incluye espacios de nombres anidados. Un elemento disponible desde dentro de un espacio de nombres también está disponible desde cualquier espacio de nombres anidado dentro de ese espacio de nombres.

Si el proyecto no contiene ninguna instrucción de espacio de nombres, todo lo que hay en el proyecto está en el mismo espacio de nombres. En este caso, el ámbito del espacio de nombres se puede considerar como ámbito del proyecto. Los elementos Public de un módulo, clase o estructura también están disponibles para cualquier proyecto que haga referencia a su proyecto.

Elección del ámbito

Cuando declara una variable, debe tener en cuenta los siguientes puntos al elegir su ámbito.

Ventajas de las variables locales

Las variables locales son una buena opción para cualquier tipo de cálculo temporal, por los siguientes motivos:

  • Prevención de conflictos de nombres. Los nombres de variables locales no son susceptibles a conflictos. Por ejemplo, puede crear varios procedimientos diferentes que contengan una variable denominada intTemp. Siempre que cada intTemp se declare como una variable local, cada procedimiento solo reconocerá su propia versión de intTemp. Cualquier procedimiento puede modificar el valor en su variable local intTemp sin que afecte a las variables intTemp de otros procedimientos.

  • Consumo de memoria. Las variables locales consumen memoria solo mientras se ejecuta su procedimiento. Su memoria se libera cuando el procedimiento vuelve al código de llamada. Por el contrario, las variables Shared y Static consumen recursos de memoria hasta que la ejecución de la aplicación se detiene, así que úselas solo cuando sea necesario. Las variables de instancia consumen memoria mientras su instancia sigue existiendo, lo que hace que sean menos eficaces que las variables locales, pero potencialmente más eficaces que las variables Shared o Static.

Minimización del ámbito

En general, al declarar cualquier variable o constante, se recomienda que el ámbito sea lo más estrecho posible (el ámbito de bloque es el más estrecho). Esto ayuda a conservar la memoria y minimiza las posibilidades de que el código haga referencia erróneamente a la variable incorrecta. Del mismo modo, debe declarar una variable para que sea Static solo cuando sea necesario conservar su valor entre las llamadas a procedimientos.

Consulte también