Dim (Instrucción) (Visual Basic)

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

Sintaxis

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

Partes

  • attributelist

    Opcional. Consulte Lista de atributos.

  • accessmodifier

    Opcional. Puede ser uno de los siguientes:

    Vea Access levels in Visual Basic.

  • Shared

    Opcional. Vea Shared.

  • Shadows

    Opcional. Consulte Shadows.

  • Static

    Opcional. Vea Static.

  • ReadOnly

    Opcional. Vea ReadOnly.

  • WithEvents

    Opcional. Especifica que son variables de objeto que hacen referencia a instancias de una clase que pueden generar eventos. Vea WithEvents.

  • variablelist

    Necesario. Lista de variables que se declaran 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 Necesario. nombre de la variable. Vea Declared Element Names.
    boundslist Opcional. Lista de límites de cada dimensión de una variable de matriz.
    New Opcional. Crea una instancia de la clase cuando se ejecuta la instrucción Dim.
    datatype Opcional. Tipo de datos de la variable.
    With Opcional. Presenta la lista de inicializadores de objetos.
    propertyname Opcional. Nombre de una propiedad de la clase de la que se va a crear una instancia.
    propinitializer Obligatorio después de propertyname =. Expresión que se evalúa y se asigna al nombre de la 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 usa la instrucción Dim para averiguar el tipo de datos de la variable y demás información, como qué código puede acceder a la variable. En el siguiente ejemplo se declara una variable para contener un valor Integer.

Dim numberOfStudents As Integer

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

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

En el caso de un tipo de referencia, use la palabra clave New para crear una instancia de la clase o la estructura especificada por el tipo de datos. Si usa New, no usará una expresión de inicializador, sino que proporcionará argumentos (si son necesarios) al constructor de la clase desde la que va a crear la variable.

Dim bottomLabel As New System.Windows.Forms.Label

Una variable se puede declarar en un procedimiento, un bloque, una clase, una estructura o un módulo, pero no en un archivo de origen, un espacio de nombres o una interfaz. Para obtener más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de acceso predeterminados).

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 el ámbito de su clase, estructura o módulo. Una variable que se declara en el nivel de procedimiento es una variable local. Las variables locales solamente están en el ámbito de su procedimiento o bloque.

Los siguientes modificadores de acceso se usan 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 normalmente se omite 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 (comportamiento predeterminado), el compilador requiere una declaración para cada variable que se use. Para obtener más información, vea Option Explicit (Instrucción).

Especificación de un valor inicial

Puede asignar un valor a una variable cuando esta se crea. Respecto al tipo de valor, se usa un inicializador para obtener la expresión que va a asignarse a la variable. La expresión debe evaluarse como una constante que se puede calcular en tiempo de compilación.

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

Si en una cláusula As se especifica un inicializador, pero no un tipo de datos, se usa la inferencia de tipos para deducir el tipo de datos del inicializador. En el siguiente ejemplo, tanto num1 como 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 funciona en el nivel de procedimiento, pero no fuera de un procedimiento en una clase, una estructura, un módulo o una interfaz. Para obtener más información sobre la inferencia de tipos, vea Option Infer (Instrucción) e Inferencia de tipo de variable local.

Para obtener información sobre lo que sucede cuando no se especifica un tipo de datos o un inicializador, vea Tipos de datos y valores predeterminados más adelante en este tema.

Puede usar un inicializador de objeto para declarar instancias de tipos tanto con nombre como anónimos. El siguiente código crea una instancia de una clase Student y usa 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 Procedimiento para declarar un objeto mediante un inicializador de objeto, Inicializadores de objeto: tipos con nombre y anónimos y Tipos anónimos.

Declaración de varias variables

En una misma instrucción de declaración se pueden declarar varias variables, especificando el nombre de variable de cada una y finalizando cada nombre de matriz con paréntesis. Las variables se separan con comas.

Dim lastTime, nextTime, allTimes() As Date

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

Se pueden especificar distintos tipos de datos para diferentes variables usando una cláusula As aparte por cada variable que se declare. Cada variable toma el tipo de datos especificado en la primera cláusula As encontrada después de su parte variablename.

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

Una variable se puede declarar para contener una matriz, que puede incluir varios valores. Para especificar que una variable contiene una matriz, agregue paréntesis inmediatamente detrás de variablename. Para obtener más información sobre las matrices, consulte Matrices.

Se puede especificar los límites inferior y superior de cada dimensión de una matriz. Para ello, incluya una 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 desde cero hasta su valor de límite superior.

Las dos instrucciones siguientes son equivalentes. En cada instrucción se declara una matriz de 21 elementos Integer. Al acceder a la matriz, el índice puede variar de 0 a 20.

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

En la siguiente instrucción se declara una matriz bidimensional de tipo Double. La matriz tiene 4 filas (3+1) de 6 columnas (5+1) cada una. Tenga en cuenta que un límite superior representa el valor más alto posible para el í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 entre 1 y 32 dimensiones.

En una declaración de matriz se pueden dejar todos los límites en blanco. Si lo hace, la matriz tendrá el número de dimensiones que especifique, pero no se inicializa. Tiene un valor de Nothing hasta que se inicialice al menos algunos de sus elementos. La instrucción Dim debe especificar los límites de todas las dimensiones o de ninguna.

' 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, se debe incluir comas entre paréntesis para indicar el número de dimensiones.

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

Se puede declarar una matriz de longitud cero declarando una de las dimensiones de la matriz en -1. Una variable que contiene una matriz de longitud cero no tiene el valor Nothing. Las matrices de longitud cero son necesarias en determinadas funciones de Common Language Runtime. Si intenta acceder a dicha matriz, se produce una excepción en tiempo de ejecución. Para más información, consulte Matrices.

Los valores de una matriz se pueden inicializar mediante un literal de matriz. Para ello, hay que insertar los valores de inicialización entre llaves ({}).

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

En el caso de las matrices multidimensionales, la inicialización de cada dimensión independiente se incluye entre llaves en la dimensión externa. Los elementos se especifican en orden principal de fila.

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

Para obtener más información sobre los literales de matrices, vea Matrices.

Tipos de datos y valores predeterminados

En la tabla siguiente se describen los resultados de diversas combinaciones resultantes 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á activado, se produce un error en tiempo de compilación.
No Dim qty = 5 Si Option Infer está activado (valor predeterminado), la variable toma el tipo de datos del inicializador. Vea Inferencia de tipo de variable local.

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

Si Option Infer está desactivado y Option Strict está activado, se produce un error en tiempo de compilación.
No Dim qty As Integer La variable se inicializa con el valor predeterminado del tipo de datos. Vea la tabla más avanzada 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 un inicializador, Visual Basic inicializa la variable en el valor predeterminado de su tipo de datos. En la siguiente tabla se muestran los valores de inicialización predeterminados.

Tipo de datos Valor predeterminado
Todos los tipos numéricos (incluidos Byte y SByte) 0
Char 0 binario
Todos los tipos de referencia (incluidos Object, String y todas las matrices) Nothing
Boolean False
Date 12:00 AM del 1 de enero del año 1 (01/01/0001 12:00:00 AM)

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, cada elemento se inicializa como si fuera una variable independiente.

Duración de las variables locales estáticas

Una variable local de tipo Static tiene una duración mayor que la del procedimiento en el que se declara. Los límites de la duración de la variable dependen de dónde se declara el procedimiento y si es de tipo Shared.

Declaración del procedimiento Variable inicializada 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 (GC)

Atributos y modificadores

Solo se pueden aplicar atributos a variables miembro, no a variables locales. Un atributo contribuye con información a los metadatos del ensamblado, que no es significativo para el almacenamiento temporal, como las variables locales.

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

Se puede especificar qué código puede tener acceso a una variable proporcionando un accessmodifier. Las variables miembro de clase y de módulo (fuera de un procedimiento) tienen como valor predeterminado el acceso privado, mientras que las variables miembro de estructura tienen como valor predeterminado el acceso público. Los niveles de acceso se pueden ajustar con los modificadores de acceso. No se pueden usar modificadores de acceso en variables locales (dentro de un procedimiento).

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

Nota

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

Liberación de recursos administrados

El recolector de elementos no utilizados de .NET Framework elimina los recursos administrados sin ninguna codificación extra por parte del usuario. Sin embargo, sí se puede forzar la eliminación de un recurso administrado en lugar de esperar a que lo haga al recolector de elementos no utilizados.

Si una clase se mantiene en un recurso especialmente valioso y escaso (como una conexión de base de datos o un identificador de archivo), posiblemente no le interese esperar a que la siguiente recolección de elementos no utilizados limpie una instancia de clase que ya no está en uso. Una clase puede implementar la interfaz IDisposable para disponer de una manera de liberar recursos antes de una recolección de elementos no utilizados. Una clase que implementa esa interfaz expone un método Dispose al que se puede llamar para forzar que los recursos valiosos se liberen inmediatamente.

La instrucción Using automatiza el proceso de adquisición de un recurso, ejecución de un conjunto de instrucciones y, finalmente, eliminación del recurso. Sin embargo, el recurso debe implementar la interfaz IDisposable. Para obtener más información, vea Using (Instrucción).

Ejemplo 1

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

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

' 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}

Ejemplo 2

En el siguiente ejemplo se enumeran 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

Ejemplo 3

En el siguiente ejemplo, la variable speedValue se declara en el nivel de clase. La palabra clave Private se usa para declarar la variable. Cualquier procedimiento de la clase puede tener acceso a la variable 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

Consulte también