Instrucción Dim (Visual Basic)
Declara y asigna espacio de almacenamiento para una o varias variables.
Sintaxis
[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist
Partes
attributelistOpcional. Vea Lista de atributos.
accessmodifierOpcional. Puede ser uno de los siguientes:
Consulte Niveles de acceso en Visual Basic.
SharedOpcional. Consulte Compartido.
ShadowsOpcional. Vea Sombras.
StaticOpcional. Vea Static.
ReadOnlyOpcional. Vea ReadOnly.
WithEventsOpcional. Especifica que se trata de variables de objeto que hacen referencia a instancias de una clase que pueden generar eventos. Vea WithEvents.
variablelistNecesario. Lista de variables que se declaran en esta instrucción.
variable [ , variable ... ]Cada
variabletiene la sintaxis y las partes siguientes:variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With{[ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]Parte Descripción variablenameNecesario. nombre de la variable. Vea Declared Element Names. boundslistOpcional. Lista de límites de cada dimensión de una variable de matriz. NewOpcional. Crea una nueva instancia de la clase cuando se Dimejecuta la instrucción .datatypeOpcional. Tipo de datos de la variable. WithOpcional. Presenta la lista de inicializadores de objeto. propertynameOpcional. Nombre de una propiedad de la clase de la que va a crear una instancia. propinitializerRequerido después propertynamede =. Expresión que se evalúa y asigna al nombre de propiedad.initializerOpcional si Newno se especifica . Expresión que se evalúa y asigna a la variable cuando se crea.
Comentarios
El Visual Basic utiliza la instrucción para determinar el tipo de datos de la variable y otra información, como qué código Dim puede tener acceso a la variable. En el ejemplo siguiente se declara una variable para contener un Integer valor.
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
Para un tipo de referencia, se usa la palabra clave para crear una nueva instancia de la clase o estructura New especificada por el tipo de datos. Si usa New , no usará una expresión de inicializador. En su lugar, proporcione 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
Puede declarar una variable en un procedimiento, bloque, clase, estructura o módulo. No se puede declarar una variable en un archivo de código fuente, 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 un campo. Las variables miembro están en el ámbito a lo largo de su clase, estructura o módulo. Una variable que se declara en el nivel de procedimiento es una variable local. Las variables locales están en el ámbito solo dentro de su procedimiento o bloque.
Los siguientes modificadores de acceso se usan para declarar variables fuera de un procedimiento: Public , , , y Protected Friend Protected Friend Private . Para obtener más información, vea Niveles de acceso en Visual Basic.
La palabra clave es opcional y normalmente se omite si se especifica cualquiera de los modificadores Dim siguientes: Public , , , , , , , , Protected o Friend Protected Friend Private Shared Shadows Static ReadOnly WithEvents .
Public maximumAllowed As Double
Protected Friend currentUserName As String
Private salary As Decimal
Static runningTotal As Integer
Si Option Explicit está en (valor predeterminado), el compilador requiere una declaración para cada variable que use. Para obtener más información, vea Option Explicit Statement.
Especificación de un valor inicial
Puede asignar un valor a una variable cuando se crea. Para un tipo de valor, se usa un inicializador para proporcionar una expresión que se va a asignar 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 se especifica un inicializador y no se especifica un tipo de datos en una cláusula , se usa la inferencia de tipos para deducir el tipo de datos As del inicializador. En el ejemplo siguiente, y num1 num2 se escriben fuertemente 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 Statement e Local Type Inference.
Para obtener información sobre lo que sucede cuando no se especifica un tipo de datos o un inicializador, vea Valores y tipos de datos predeterminados más adelante en este tema.
Puede usar un inicializador de objeto para declarar instancias de tipos con nombre y anónimos. El código siguiente crea una instancia de una Student clase y usa un inicializador de objeto para inicializar 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 mediante un inicializador de objeto , Inicializadores de objeto:tipos con nombre y anónimos y Tipos anónimos.
Declarar varias variables
Puede declarar varias variables en una instrucción de declaración, especificando el nombre de variable para cada una y siguiendo cada nombre de matriz con paréntesis. Las variables se separan con comas.
Dim lastTime, nextTime, allTimes() As Date
Si declara más de una variable con una As cláusula , no puede proporcionar un inicializador para ese grupo de variables.
Puede especificar tipos de datos diferentes para distintas variables mediante una cláusula As independiente para cada variable que declare. Cada variable toma el tipo de datos especificado en la primera As cláusula encontrada después de su variablename parte.
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 contener varios valores. Para especificar que una variable contiene una matriz, siga su inmediatamente variablename con paréntesis. Para obtener más información sobre las matrices, consulte Matrices.
Puede especificar el límite inferior y superior de cada dimensión de una matriz. Para ello, incluya dentro boundslist de los paréntesis. Para 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 a su valor límite superior.
Las dos instrucciones siguientes son equivalentes. Cada instrucción declara una matriz de 21 Integer elementos. 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
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. 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 de 1 a 32 dimensiones.
Puede dejar todos los límites en blanco en una declaración de matriz. Si lo hace, la matriz tiene el número de dimensiones que especifique, pero no está inicializada. Tiene un valor de hasta Nothing que inicialice al menos algunos de sus elementos. La Dim instrucción debe especificar límites para todas las dimensiones o para ninguna dimensión.
' 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 paréntesis para indicar el número de dimensiones.
Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte
Puede declarar una matriz de longitud cero declarando que una de las dimensiones de la matriz es -1. Una variable que contiene una matriz de longitud cero no tiene el valor Nothing . Determinadas funciones de Common Language Runtime requieren matrices de longitud cero. Si intenta acceder a esta matriz, se produce una excepción en tiempo de ejecución. Para más información, consulte Matrices.
Puede inicializar los valores de una matriz mediante un literal de matriz. Para ello, envuelve 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 de fila principal.
Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}
Para obtener más información sobre los literales de matriz, 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á en (valor predeterminado), la variable toma el tipo de datos del inicializador. Vea Inferencia de tipos locales. 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. Consulte la tabla más adelante en 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 especifica un inicializador, Visual Basic inicializa la variable en el valor predeterminado para 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 Byte (incluidos y SByte ) |
0 |
Char |
Binario 0 |
Todos los tipos de referencia Object (incluidas 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 declara la longitud de una matriz pero no inicializa sus elementos, cada elemento se inicializa como si fuera una variable independiente.
Duración de la variable local estática
Una variable local tiene una duración más larga que la del procedimiento Static en el que se declara. Los límites de la duración de la variable dependen de dónde se declare el procedimiento y de si es Shared .
| Declaración de procedimiento | Variable inicializada | La variable detiene la existente |
|---|---|---|
| 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 se libera la instancia para la recolección de elementos no utilizados (GC) |
Atributos y modificadores
Solo puede aplicar atributos a variables miembro, no a variables locales. Un atributo aporta información a los metadatos del ensamblado, lo que no es significativo para el almacenamiento temporal, como las variables locales.
En el nivel de módulo, no se puede usar el Static modificador para declarar variables miembro. En el nivel de procedimiento, no puede usar , , , ni ningún modificador Shared de acceso para declarar variables Shadows ReadOnly WithEvents locales.
Puede especificar qué código puede tener acceso a una variable si proporciona 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. 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).
Solo 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 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, 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 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 .NET Framework recolector de elementos no utilizados elimina los recursos administrados sin ninguna codificación adicional por su parte. Sin embargo, puede forzar la eliminación de un recurso administrado en lugar de esperar 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), es posible que no quiera esperar hasta la siguiente recolección de elementos no utilizados para limpiar una instancia de clase que ya no está en uso. Una clase puede implementar la IDisposable interfaz para proporcionar una manera de liberar recursos antes de una recolección de elementos no utilizados. Una clase que implementa esa interfaz expone un método al que se puede llamar para forzar el lanzamiento inmediato de Dispose recursos valiosos.
La instrucción automatiza el proceso de adquisición de un recurso, ejecución de un conjunto de instrucciones y Using eliminación del recurso. Sin embargo, el recurso debe implementar la IDisposable interfaz . Para obtener más información, vea Using (Instrucción).
Ejemplo 1
En el ejemplo siguiente se declaran variables mediante la Dim instrucción con varias 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}
Ejemplo 2
En el ejemplo siguiente se enumeran los números primos entre 1 y 30. El ámbito de las variables locales se describe en los 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 ejemplo siguiente, la speedValue variable se declara en el nivel de clase. La Private palabra clave se usa para declarar la variable. Cualquier procedimiento de la clase puede tener acceso a la Car variable.
' 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
Consulta 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 variable
- 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