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:
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 | Sí | 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. |
Sí | 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. |
Sí | Sí | 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
- Instrucción Const
- Instrucción ReDim
- Option Explicit (instrucción)
- Option Infer (instrucción)
- Option Strict (instrucción)
- Página Compilación, Diseñador de proyectos (Visual Basic)
- Declaración de variables
- Matrices
- Inicializadores de objeto: tipos con nombre y anónimos
- Tipos anónimos
- Inicializadores de objeto: tipos con nombre y anónimos
- Procedimiento para declarar un objeto mediante un inicializador de objeto
- Inferencia de tipo de variable local