Compartir a través de


Á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 en el bloque de código en el que se declara
Ámbito del procedimiento Disponible para todo el código dentro del procedimiento en el que se declara
Ámbito del módulo Disponible para todo el código dentro del módulo, la clase o la estructura en los 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 desde el más estrecho (bloque) hasta el más ancho (espacio de nombres), donde el ámbito más estrecho significa el conjunto más pequeño de código que puede hacer referencia al elemento sin cualificación. Para obtener más información, vea "Niveles de ámbito" en esta página.

Especificar el ámbito y definir variables

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

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

  • Espacio de nombres que contiene la declaración del elemento

  • Nivel de acceso que declara para el elemento

Use cuidado al definir variables con el mismo nombre pero con un ámbito diferente, ya que hacerlo puede provocar resultados inesperados. Para obtener más información, vea Referencias a elementos declarados.

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 la misma región puede hacer referencia al elemento sin calificar su nombre.

Ámbito de bloque

Un bloque es un conjunto de instrucciones incluidas en las instrucciones de declaración de inicio y finalización, como las siguientes:

  • 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 está limitado a un bloque, su duración sigue siendo la del procedimiento completo. Si escribe el bloque más de una vez durante el procedimiento, cada variable de bloque conserva su valor anterior. Para evitar resultados inesperados en tal caso, es aconsejable inicializar variables de bloque al principio del bloque.

Ámbito del 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 cualquier bloque dentro de ese procedimiento, puede pensar en la variable como tener ámbito de bloque, donde el bloque es todo el procedimiento.

Nota:

Todos los elementos locales, incluso si son Static variables, 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 del módulo

Para mayor comodidad, el nivel de módulo de un solo término se aplica igualmente 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, la clase o la estructura.

Al realizar 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, la clase o la 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 un módulo diferente. La Dim instrucción 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 strMsgde cadena . Cuando se llama al segundo procedimiento, muestra el contenido de la variable strMsg de cadena 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, la variable de cadena strMsg podrá ser referenciada por código 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 dentro de 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 de proyecto. Public Los elementos de un módulo, una clase o una estructura también están disponibles para cualquier proyecto que haga referencia a su proyecto.

Elección del ámbito

Al declarar 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 uno se declare como una variable local, cada procedimiento reconoce solo su propia versión de intTemp. Cualquier procedimiento puede modificar el valor en su entorno local intTemp sin afectar a variables intTemp en 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 compartidas y estáticas consumen recursos de memoria hasta que la aplicación deja de ejecutarse, 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 eficientes que Shared las variables o Static .

Minimizar el ámbito

En general, al declarar cualquier variable o constante, es buena práctica de programación hacer que el ámbito sea lo más restringido posible (siendo el ámbito de bloque el más restringido). 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 Estática solo cuando sea necesario conservar su valor entre las llamadas a procedimiento.

Consulte también