Instrucción Dim (Visual Basic)

Declara y asigna espacio de almacenamiento para una o varias variables.

[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ] 
Dim [ WithEvents ] variablelist

Elementos

Término

Definición

attributelist

Opcional. Vea la Lista de atributos.

accessmodifier

Opcional. Puede ser una de las siguientes:

Vea Niveles de acceso en Visual Basic.

Shared

Opcional. Vea Shared.

Shadows

Opcional. Vea Shadows.

Static

Opcional. Vea Static.

ReadOnly

Opcional. Vea ReadOnly.

WithEvents

Opcional. Especifica que éstas son variables de objeto que hacen referencia a instancias de una clase que puede provocar eventos. Vea WithEvents.

variablelist

Requerido. Lista de variables que se declara en esta instrucción.

variable [ , variable ... ]

Cada variable tiene la sintaxis y las partes siguientes:

variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With { [ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]

Parte

Descripción

variablename

Requerido. Nombre de la variable. Vea Nombres de elementos declarados (Visual Basic).

boundslist

Opcional. Lista de límites de cada dimensión de una variable de matriz.

New

Opcional. Crea una nueva instancia de la clase cuando se ejecuta la instrucción Dim.

datatype

Opcional. Tipo de datos de la variable.

With

Opcional. Incluye la lista de inicializadores de objeto.

propertyname

Opcional. Nombre de una propiedad en la clase de la que se está creando una instancia.

propinitializer

Se requiere después de propertyname =. Expresión que se evalúa y se asigna al nombre de propiedad.

initializer

Opcional si no se especifica New. Expresión que se evalúa y se asigna a la variable cuando se crea.

Comentarios

El compilador de Visual Basic utiliza la instrucción Dim para determinar el tipo de datos de la variable y otra información, como por ejemplo qué código puede obtener acceso a la variable. En el ejemplo siguiente se declara una variable que contiene un valor Integer.

Dim numberOfStudents As Integer

Puede especificar cualquier tipo de datos o el nombre de una enumeración, estructura, clase o interfaz.

Dim finished As Boolean
Dim monitorBox As System.Windows.Forms.Form

En un tipo de referencia, la palabra clave New se utiliza para crear una nueva instancia de la clase o estructura especificada por el tipo de dato. Si utiliza New, no utilice una expresión de inicializador. En su lugar, si son necesarios, proporcione argumentos al constructor de la clase a partir de la que está creando la variable.

Dim bottomLabel As New System.Windows.Forms.Label

Puede declarar una variable en un procedimiento, bloque, clase, estructura o módulo. No puede declarar una variable en un archivo de código fuente, espacio de nombres o interfaz. Para obtener más información, vea Contextos de declaración y niveles de acceso predeterminados (Visual Basic).

Una variable que se declara en el nivel de módulo, fuera de cualquier procedimiento, es una variable miembro o campo. Las variables miembro están en ámbito a lo largo de su clase, estructura o módulo. Una variable que se declara dentro de un procedimiento es una variable local. Las variables locales sólo están en ámbito dentro de su procedimiento o bloque.

Los siguientes modificadores de acceso se utilizan para declarar variables fuera de un procedimiento: Public Protected, Friend, Protected Friend y Private. Para obtener más información, vea Niveles de acceso en Visual Basic.

La palabra clave Dim es opcional y se suele omitir si especifica cualquiera de los siguientes modificadores: Public Protected, Friend, Protected Friend, Private, Shared, Shadows, Static, ReadOnly o WithEvents.

Public maximumAllowed As Double
Protected Friend currentUserName As String
Private salary As Decimal
Static runningTotal As Integer

Si Option Explicit está activado (valor predeterminado), el compilador requiere una declaración para cada variable que utiliza. Para obtener más información, vea Option Explicit (Instrucción, Visual Basic).

Especifica un valor inicial

Puede asignar un valor a una variable cuando se crea. En un tipo de valor, un inicializador se utiliza para proporcionar una expresión que se va a asignar a la variable. La expresión se debe evaluar como una constante que se puede calcular en tiempo de compilación.

Dim quantity As Integer = 10
Dim message As String = "Just started"

Si se especifica un inicializador y no se especifica un tipo de datos en una cláusula As, la inferencia de tipos se utiliza para inferir el tipo de datos del inicializador. En el ejemplo siguiente, num1 y num2 están fuertemente tipados como enteros. En la segunda declaración, la inferencia de tipos deduce el tipo del valor 3.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

La inferencia de tipos se aplica en el nivel de procedimiento. No se aplica fuera de un procedimiento en una clase, estructura, módulo o interfaz. Para obtener más información sobre la inferencia de tipos, vea Option Infer (instrucción) y Inferencia de tipo de variable local (Visual Basic).

Para obtener información acerca de lo que sucede cuando un tipo de datos o inicializador no se especifica, consulte Valores y tipos de datos predeterminados más adelante en este tema.

Puede utilizar un inicializador de objeto para declarar instancias de tipos anónimos y con nombre. El código siguiente crea una instancia de una clase Student y utiliza a un inicializador de objeto para inicializar las propiedades.

Dim student1 As New Student With {.First = "Michael", 
                                  .Last = "Tucker"}

Para obtener más información sobre los inicializadores de objeto, vea Cómo: Declarar un objeto usando un inicializador de objeto (Visual Basic), Inicializadores de objeto: Tipos con nombre y anónimos (Visual Basic) y Tipos anónimos (Visual Basic).

Declarar variables múltiples

Se pueden declarar varias variables en una instrucción de declaración si se especifica el nombre de variable de cada una, y se sigue cada nombre de matriz con paréntesis. Las variables múltiples se separan con comas.

Dim lastTime, nextTime, allTimes() As Date

Si declara más de una variable con una cláusula As, no puede proporcionar un inicializador para ese grupo de variables.

Se pueden especificar tipos de datos diferentes para variables diferentes utilizando una cláusula As independiente para cada variable declarada. Todas las variables toman el tipo de datos especificado en la primera cláusula As que se encuentre después de su parte variablename correspondiente.

Dim a, b, c As Single, x, y As Double, i As Integer
' a, b, and c are all Single; x and y are both Double

Matrices

Puede declarar una variable para contener una matriz, que puede almacenar varios valores. Para especificar que una variable contiene una matriz, incluya un paréntesis inmediatamente después de variablename. Para obtener más información sobre las matrices, vea Matrices en Visual Basic.

Se puede especificar el límite inferior y superior de cada dimensión de una matriz. Para ello, incluya boundslist dentro de los paréntesis. En cada dimensión, boundslist especifica el límite superior y, opcionalmente, el límite inferior. El límite inferior siempre es cero, tanto si se especifica como si no. Cada índice puede variar de cero hasta el valor de su límite superior.

Las dos instrucciones siguientes son equivalentes. Cada instrucción declara una matriz de 21 elementos Integer. Cuando se tiene acceso a la matriz, el índice puede variar de 0 a 20.

Dim totals(20) As Integer
Dim totals(0 To 20) As Integer

La instrucción siguiente declara una matriz bidimensional de tipo Double. La matriz tiene 4 filas (3 + 1) de 6 columnas (5 + 1) cada una. Observe que el límite superior representa el valor más alto posible del índice, no la longitud de la dimensión. La longitud de la dimensión es el límite superior más uno.

Dim matrix2(3, 5) As Double

Una matriz puede tener de 1 a 32 dimensiones.

Todos los límites de una declaración de matriz se pueden dejar en blanco. En este caso, la matriz tiene el número de dimensiones que especifica, pero se no se inicializa. Tiene el valor Nothing hasta que se inicialicen por lo menos algunos de sus elementos. La instrucción Dim debe especificar los límites para todas las dimensiones o para ninguna de ellas.

' Declare an array with blank array bounds.
Dim messages() As String
' Initialize the array.
ReDim messages(4)

Si la matriz tiene más de una dimensión, debe incluir comas entre los paréntesis para indicar el número de dimensiones.

Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte

Puede declarar una matriz de longitud cero declarando una de las dimensiones de la matriz para que sea -1. Un variable que contiene una matriz de longitud cero no tiene el valor Nothing. Ciertas funciones de Common Language Runtime requieren matrices de longitud cero. Si se intenta acceder a dicha matriz, se produce una excepción de tiempo de ejecución. Para obtener más información, vea Matrices en Visual Basic.

Puede inicializar los valores de una matriz utilizando un literal de matriz. Para ello, encierre los valores de inicialización entre llaves ({}).

Dim longArray() As Long = {0, 1, 2, 3}

En las matrices multidimensionales, la inicialización de cada dimensión está entre llaves en la dimensión exterior. Los elementos se especifican en orden de importancia de filas.

Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}

Para obtener más información sobre los literales de matriz, vea Matrices en Visual Basic.

Valores y tipos de datos predeterminados

La tabla siguiente describe los resultados de varias combinaciones de especificar el tipo de datos y el inicializador en una instrucción Dim.

¿Tipo de datos especificado?

¿Inicializador especificado?

Ejemplo

Resultado

No

No

Dim qty

Si Option strict está desactivado (valor predeterminado), la variable se establece en Nothing.

Si Option Strict está activada, se produce un error en tiempo de compilación.

No

Dim qty = 5

Si Option infer está activado (valor predeterminado), la variable tiene el tipo de datos de inicializadores. Vea Inferencia de tipo de variable local (Visual Basic).

Si Option Infer y Option Strict están desactivadas, la variable toma el tipo de datos de Object.

Si Option Infer está desactivada y Option Strict está activada, se produce un error en tiempo de compilación.

No

Dim qty As Integer

La variable se inicializa con el valor predeterminado para el tipo de datos. Consulte la tabla más adelante en esta sección.

Dim qty As Integer = 5

Si el tipo de datos del inicializador no es convertible al tipo de datos especificado, se produce un error en tiempo de compilación.

Si especifica un tipo de datos pero no especifica un inicializador, Visual Basic inicializa la variable con el valor predeterminado de su tipo de datos. En la tabla siguiente se muestran los valores de inicialización predeterminados.

Tipo de datos

Valor predeterminado

Todos los tipos numéricos (incluso Byte y SByte)

0

Char

Binario 0

Todas las referencias de tipo (incluidas Object, String y todas las matrices).

Nothing

Boolean

False

Date

12:00 a.m. del 1 de enero del año 1 (01/01/0001 12:00:00 a.m.)

Cada elemento de una estructura se inicializa como si fuera una variable independiente. Si se declara la longitud de una matriz pero no se inicializan sus elementos, éstos se inicializan como si fueran una variable independiente.

Vigencia de la variable local estática

Una variable local Static tiene un período de duración más largo que el del procedimiento en el que se declara. Los límites de la duración de la variable dependen de dónde se declare el procedimiento y si es Shared.

Declaración de procedimiento

La variable se inicializa

La variable deja de existir

En un módulo

La primera vez que se llama al procedimiento

Cuando el programa detiene la ejecución

En una clase o estructura, el procedimiento es Shared

La primera vez que se llama al procedimiento en una instancia específica o en la propia clase o estructura

Cuando el programa detiene la ejecución

En una clase o estructura, el procedimiento no es Shared

La primera vez que se llama al procedimiento en una instancia específica

Cuando la instancia se libera para la recolección de elementos no utilizados

Atributos y modificadores

Sólo se pueden aplicar atributos a las variables miembro, no a las variables locales. Un atributo proporciona información a los metadatos del ensamblado, que no son significativos para el almacenamiento temporal como las variables locales.

En el nivel de módulo, no se puede utilizar el modificador Static para declarar variables miembro. En el nivel de procedimiento, no se puede utilizar Shared, Shadows, ReadOnly, WithEvents ni un modificador de acceso para declarar variables locales.

Puede especificar qué código puede tener acceso a una variable, suministrando un accessmodifier. Las variables miembro de clase y módulo (fuera de cualquier procedimiento) tienen como valor predeterminado el acceso privado y las variables miembro de estructura tienen como valor predeterminado el acceso público. Puede ajustar sus niveles de acceso con los modificadores de acceso. No puede utilizar modificadores de acceso en variables locales (dentro de un procedimiento).

Solo se puede especificar WithEvents en variables miembro, no en variables locales dentro de un procedimiento. Si especifica WithEvents, el tipo de datos de la variable debe ser un tipo de clase concreto, no Object. No se puede declarar una matriz con WithEvents. Para obtener más información sobre los eventos, vea Eventos (Visual Basic).

Nota

El código externo a una clase, estructura o módulo debe calificar el nombre de una variable miembro con el nombre de esa clase, estructura o módulo.El código externo a un procedimiento o bloque no puede hacer referencia a ninguna variable local dentro de ese procedimiento o bloque.

Liberar recursos administrados

El recolector de elementos no utilizados de .NET Framework dispone de recursos administrados sin ninguna codificación adicional en la partición. Sin embargo, puede forzar la eliminación de un recurso administrado en lugar de esperar el recolector de elementos no utilizados.

Si una clase consume un recurso determinado valioso y suficiente (como una conexión de base de datos o un identificador de archivos), puede que no desee esperar hasta la siguiente recolección de elementos no utilizados para limpiar una instancia de clase que ya no se utiliza. Una clase puede implementar la interfaz IDisposable para proporcionar una manera de liberar recursos antes de una recolección de elementos no utilizados. Una clase que implementa expone de esa interfaz un método Dispose que se puede llamar para obligar a los recursos valiosos que se producirán liberar inmediatamente.

La instrucción Using automatiza el proceso de adquirir un recurso, de ejecutar un conjunto de instrucciones, y después de eliminar de recursos. Sin embargo, el recurso debe implementar la interfaz IDisposable . Para obtener más información, vea Using (Instrucción, Visual Basic).

Ejemplo

En el ejemplo siguiente se declaran variables mediante la instrucción Dim con diversas opciones.

' Declare and initialize a Long variable. 
Dim startingAmount As Long = 500

' Declare a variable that refers to a Button object, 
' create a Button object, and assign the Button object 
' to the variable. 
Dim switchButton As New System.Windows.Forms.Button

' Declare a local variable that always retains its value, 
' even after its procedure returns to the calling code. 
Static totalSales As Double 

' Declare a variable that refers to an array. 
Dim highTemperature(31) As Integer 

' Declare and initialize an array variable that 
' holds four Boolean check values. 
Dim checkValues() As Boolean = {False, False, True, False}

El ejemplo siguiente muestra los números primos entre 1 y 30. El ámbito de las variables locales se describe en comentarios de código.

Public Sub ListPrimes()
    ' The sb variable can be accessed only 
    ' within the ListPrimes procedure. 
    Dim sb As New System.Text.StringBuilder()

    ' The number variable can be accessed only 
    ' within the For...Next block.  A different 
    ' variable with the same name could be declared 
    ' outside of the For...Next block. 
    For number As Integer = 1 To 30
        If CheckIfPrime(number) = True Then
            sb.Append(number.ToString & " ")
        End If 
    Next

    Debug.WriteLine(sb.ToString)
    ' Output: 2 3 5 7 11 13 17 19 23 29 
End Sub 


Private Function CheckIfPrime(ByVal number As Integer) As Boolean 
    If number < 2 Then 
        Return False 
    Else 
        ' The root and highCheck variables can be accessed 
        ' only within the Else block.  Different variables 
        ' with the same names could be declared outside of 
        ' the Else block. 
        Dim root As Double = Math.Sqrt(number)
        Dim highCheck As Integer = Convert.ToInt32(Math.Truncate(root))

        ' The div variable can be accessed only within 
        ' the For...Next block. 
        For div As Integer = 2 To highCheck
            If number Mod div = 0 Then 
                Return False 
            End If 
        Next 

        Return True 
    End If 
End Function

En el siguiente ejemplo, se declara la variable speedValue en el nivel de clase. La palabra clave Private se utiliza para declarar la variable. La variable es accesible a través del cualquier procedimiento de la clase Car .

' Create a new instance of a Car. 
Dim theCar As New Car()
theCar.Accelerate(30)
theCar.Accelerate(20)
theCar.Accelerate(-5)

Debug.WriteLine(theCar.Speed.ToString)
' Output: 45
Public Class Car
    ' The speedValue variable can be accessed by 
    ' any procedure in the Car class. 
    Private speedValue As Integer = 0

    Public ReadOnly Property Speed() As Integer 
        Get 
            Return speedValue
        End Get 
    End Property 

    Public Sub Accelerate(ByVal speedIncrease As Integer)
        speedValue += speedIncrease
    End Sub 
End Class

Vea también

Tareas

Cómo: Declarar un objeto usando un inicializador de objeto (Visual Basic)

Referencia

Instrucción Const (Visual Basic)

Instrucción ReDim (Visual Basic)

Option Explicit (Instrucción, Visual Basic)

Option Infer (instrucción)

Option Strict (Instrucción)

Página Compilación, Diseñador de proyectos (Visual Basic)

Conceptos

Declaración de variable en Visual Basic

Inicializadores de objeto: Tipos con nombre y anónimos (Visual Basic)

Tipos anónimos (Visual Basic)

Inicializadores de objeto: Tipos con nombre y anónimos (Visual Basic)

Inferencia de tipo de variable local (Visual Basic)

Otros recursos

Matrices en Visual Basic