Instrucción Dim (Visual Basic)Dim Statement (Visual Basic)

Declara y asigna espacio de almacenamiento para una o más variables.Declares and allocates storage space for one or more variables.

SintaxisSyntax

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

ElementosParts

Opcional.Optional. Especifica que se trata de las variables de objeto que hacen referencia a instancias de una clase que puede provocar eventos.Specifies that these are object variables that refer to instances of a class that can raise events. Consulte WithEvents.See WithEvents.

  • variablelist

    Obligatorio.Required. Lista de variables que se declaran en esta instrucción.List of variables being declared in this statement.

    variable [ , variable ... ]

    Cada variable tiene la sintaxis y las partes siguientes:Each variable has the following syntax and parts:

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

    PartePart DescripciónDescription
    variablename Obligatorio.Required. Nombre de la variable.Name of the variable. Vea Declared Element Names.See Declared Element Names.
    boundslist Opcional.Optional. Lista de los límites de cada dimensión de una variable de matriz.List of bounds of each dimension of an array variable.
    New Opcional.Optional. Crea una nueva instancia de la clase cuando la Dim instrucción se ejecuta.Creates a new instance of the class when the Dim statement runs.
    datatype Opcional.Optional. Tipo de datos de la variable.Data type of the variable.
    With Opcional.Optional. Presenta la lista de inicializadores de objeto.Introduces the object initializer list.
    propertyname Opcional.Optional. El nombre de una propiedad en la clase está realizando una instancia de.The name of a property in the class you are making an instance of.
    propinitializer Necesario después propertyname =.Required after propertyname =. La expresión que se evalúa y se asigna al nombre de propiedad.The expression that is evaluated and assigned to the property name.
    initializer Opcional si New no se especifica.Optional if New is not specified. Expresión que se evalúa y se asigna a la variable cuando se crea.Expression that is evaluated and assigned to the variable when it is created.

ComentariosRemarks

El compilador de Visual Basic utiliza la Dim instrucción para determinar el tipo de datos de la variable y otra información, como qué código puede tener acceso a la variable.The Visual Basic compiler uses the Dim statement to determine the variable's data type and other information, such as what code can access the variable. En el ejemplo siguiente se declara una variable que contenga un Integer valor.The following example declares a variable to hold an Integer value.

Dim numberOfStudents As Integer

Puede especificar cualquier tipo de datos o el nombre de una enumeración, estructura, clase o interfaz.You can specify any data type or the name of an enumeration, structure, class, or interface.

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

Para un tipo de referencia, usa el New palabra clave para crear una nueva instancia de la clase o estructura que se especifica mediante el tipo de datos.For a reference type, you use the New keyword to create a new instance of the class or structure that is specified by the data type. Si usa New, no utilice una expresión de inicializador.If you use New, you do not use an initializer expression. En su lugar, proporcione argumentos, si son necesarios al constructor de la clase desde el que está creando la variable.Instead, you supply arguments, if they are required, to the constructor of the class from which you are creating the variable.

Dim bottomLabel As New System.Windows.Forms.Label

Puede declarar una variable en una clase, estructura, procedimiento, bloque o módulo.You can declare a variable in a procedure, block, class, structure, or module. No se puede declarar una variable en un archivo de código fuente, el espacio de nombres o la interfaz.You cannot declare a variable in a source file, namespace, or interface. Para obtener más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de acceso predeterminados).For more information, see Declaration Contexts and Default Access Levels.

Una variable que se declara en el nivel de módulo, fuera de cualquier procedimiento, es un variable miembro o campo.A variable that is declared at module level, outside any procedure, is a member variable or field. Las variables miembro están en el ámbito de su clase, estructura o módulo.Member variables are in scope throughout their class, structure, or module. Una variable que se declara en el nivel de procedimiento es un variable local.A variable that is declared at procedure level is a local variable. Las variables locales están en ámbito dentro de su procedimiento o bloque.Local variables are in scope only within their procedure or block.

Los siguientes modificadores de acceso se utilizan para declarar variables fuera de un procedimiento: Public, Protected, Friend, Protected Friend, y Private.The following access modifiers are used to declare variables outside a procedure: Public, Protected, Friend, Protected Friend, and Private. Para obtener más información, consulte tener acceso a los niveles en Visual Basic.For more information, see Access levels in Visual Basic.

El Dim palabra clave es opcional y normalmente se omite si se especifica cualquiera de los siguientes modificadores: Public, Protected, Friend, Protected Friend, Private, Shared, Shadows, Static, ReadOnly, o WithEvents.The Dim keyword is optional and usually omitted if you specify any of the following modifiers: Public, Protected, Friend, Protected Friend, Private, Shared, Shadows, Static, ReadOnly, or WithEvents.

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

Si Option Explicit está activada (valor predeterminado), el compilador requiere una declaración para cada variable que se utiliza.If Option Explicit is on (the default), the compiler requires a declaration for every variable you use. Para obtener más información, consulte instrucción Option Explicit.For more information, see Option Explicit Statement.

Si se especifica un valor inicialSpecifying an Initial Value

Puede asignar un valor a una variable cuando se crea.You can assign a value to a variable when it is created. Para un tipo de valor, usa un inicializador para proporcionar una expresión que se asignará a la variable.For a value type, you use an initializer to supply an expression to be assigned to the variable. La expresión debe evaluarse como una constante que se puede calcular en tiempo de compilación.The expression must evaluate to a constant that can be calculated at compile time.

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 un As cláusula, inferencia se usa para deducir el tipo de datos del inicializador.If an initializer is specified and a data type is not specified in an As clause, type inference is used to infer the data type from the initializer. En el ejemplo siguiente, ambos num1 y num2 están fuertemente tipados como enteros.In the following example, both num1 and num2 are strongly typed as integers. En la segunda declaración, inferencia de tipo deduce el tipo del valor 3.In the second declaration, type inference infers the type from the value 3.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

Inferencia de tipos se aplica en el nivel de procedimiento.Type inference applies at the procedure level. No se aplica fuera de un procedimiento en una clase, estructura, módulo o interfaz.It does not apply outside a procedure in a class, structure, module, or interface. Para obtener más información acerca de la inferencia de tipo, consulte instrucción Option Infer y Local Type Inference.For more information about type inference, see Option Infer Statement and Local Type Inference.

Para obtener información sobre lo que ocurre cuando no se especifica un tipo de datos o un inicializador, consulte valores y tipos de datos predeterminados más adelante en este tema.For information about what happens when a data type or initializer is not specified, see Default Data Types and Values later in this topic.

Puede usar un inicializador de objeto para declarar instancias de tipos con nombre y anónimos.You can use an object initializer to declare instances of named and anonymous types. El código siguiente crea una instancia de un Student clase y usa un inicializador de objeto para inicializar las propiedades.The following code creates an instance of a Student class and uses an object initializer to initialize properties.

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, inicializadores de objeto: Tipos con nombre y anónimos, y tipos anónimos.For more information about object initializers, see How to: Declare an Object by Using an Object Initializer, Object Initializers: Named and Anonymous Types, and Anonymous Types.

Declarar varias VariablesDeclaring Multiple Variables

Puede declarar varias variables en una instrucción de declaración, especificando el nombre de variable para cada uno de ellos y se sigue cada nombre de la matriz con paréntesis.You can declare several variables in one declaration statement, specifying the variable name for each one, and following each array name with parentheses. Las variables se separan con comas.Multiple variables are separated by commas.

Dim lastTime, nextTime, allTimes() As Date

Si declara más de una variable con uno As cláusula, no puede proporcionar un inicializador para el grupo de variables.If you declare more than one variable with one As clause, you cannot supply an initializer for that group of variables.

Puede especificar los tipos de datos diferentes para distintas variables mediante el uso de otro As cláusula para cada variable que declare.You can specify different data types for different variables by using a separate As clause for each variable you declare. Cada variable tiene el tipo de datos especificado en la primera As cláusula detectados después de su variablename parte.Each variable takes the data type specified in the first As clause encountered after its variablename part.

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

MatricesArrays

Puede declarar una variable que contenga un matriz, que puede contener varios valores.You can declare a variable to hold an array, which can hold multiple values. Para especificar que una variable contiene una matriz, siga su variablename inmediatamente con paréntesis.To specify that a variable holds an array, follow its variablename immediately with parentheses. Para obtener más información sobre las matrices, consulte Matrices.For more information about arrays, see Arrays.

Puede especificar el límite inferior y superior de cada dimensión de una matriz.You can specify the lower and upper bound of each dimension of an array. Para ello, incluya un boundslist dentro de los paréntesis.To do this, include a boundslist inside the parentheses. Para cada dimensión, el boundslist especifica el límite superior y, opcionalmente, el límite inferior.For each dimension, the boundslist specifies the upper bound and optionally the lower bound. El límite inferior siempre es cero, si se especifica o no.The lower bound is always zero, whether you specify it or not. Cada índice puede variar de cero a través de su valor de límite superior.Each index can vary from zero through its upper bound value.

Las dos instrucciones siguientes son equivalentes.The following two statements are equivalent. Cada instrucción declara una matriz de 21 Integer elementos.Each statement declares an array of 21 Integer elements. Cuando tenga acceso a la matriz, el índice puede variar de 0 a 20.When you access the array, the index can vary from 0 through 20.

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

La instrucción siguiente declara una matriz bidimensional de tipo Double.The following statement declares a two-dimensional array of type Double. La matriz tiene 4 filas (3 + 1) de 6 columnas (5 + 1) cada.The array has 4 rows (3 + 1) of 6 columns (5 + 1) each. Tenga en cuenta que el límite superior representa el valor más alto posible para el índice, no la longitud de la dimensión.Note that an upper bound represents the highest possible value for the index, not the length of the dimension. La longitud de la dimensión es el límite superior más uno.The length of the dimension is the upper bound plus one.

Dim matrix2(3, 5) As Double

Una matriz puede tener de 1 a 32 dimensiones.An array can have from 1 to 32 dimensions.

Todos los límites puede dejar en blanco en una declaración de matriz.You can leave all the bounds blank in an array declaration. Si lo hace, la matriz tiene el número de dimensiones especificadas, pero no está inicializada.If you do this, the array has the number of dimensions you specify, but it is uninitialized. Tiene un valor de Nothing hasta que se inicialicen al menos algunos de sus elementos.It has a value of Nothing until you initialize at least some of its elements. El Dim instrucción debe especificar los límites para todas las dimensiones o para ninguna dimensión.The Dim statement must specify bounds either for all dimensions or for no dimensions.

' 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.If the array has more than one dimension, you must include commas between the parentheses to indicate the number of dimensions.

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

Puede declarar un matriz de longitud cero declarando una de las dimensiones de la matriz sea -1.You can declare a zero-length array by declaring one of the array's dimensions to be -1. Una variable que contiene una matriz de longitud cero no tiene el valor Nothing.A variable that holds a zero-length array does not have the value Nothing. Matrices de longitud cero son necesarios para determinadas funciones de common language runtime.Zero-length arrays are required by certain common language runtime functions. Si se intenta tener acceso a dicha matriz, se produce una excepción en tiempo de ejecución.If you try to access such an array, a runtime exception occurs. Para obtener más información, consulte matrices.For more information, see Arrays.

Puede inicializar los valores de una matriz mediante un literal de matriz.You can initialize the values of an array by using an array literal. Para ello, incluya los valores de inicialización con llaves ({}).To do this, surround the initialization values with braces ({}).

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

Para las matrices multidimensionales, la inicialización de cada dimensión se encierra entre llaves en la dimensión exterior.For multidimensional arrays, the initialization for each separate dimension is enclosed in braces in the outer dimension. Los elementos se especifican en orden fila principal.The elements are specified in row-major order.

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

Para obtener más información sobre los literales de matriz, vea matrices.For more information about array literals, see Arrays.

Tipos de datos de forma predeterminada y valoresDefault Data Types and Values

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.The following table describes the results of various combinations of specifying the data type and initializer in a Dim statement.

¿Tipo de datos especificado?Data type specified? ¿Inicializador especificado?Initializer specified? EjemploExample ResultadoResult
NoNo NoNo Dim qty Si Option Strict es off (valor predeterminado), la variable se establece en Nothing.If Option Strict is off (the default), the variable is set to Nothing.

Si Option Strict está activado, se produce un error en tiempo de compilación.If Option Strict is on, a compile-time error occurs.
NoNo Yes Dim qty = 5 Si Option Infer está activada (valor predeterminado), escriba la variable toma los datos del inicializador.If Option Infer is on (the default), the variable takes the data type of the initializer. Consulte inferencia de tipos Local.See Local Type Inference.

Si Option Infer está desactivado y Option Strict está desactivado, la variable toma el tipo de datos de Object.If Option Infer is off and Option Strict is off, the variable takes the data type of Object.

Si Option Infer está desactivado y Option Strict está activado, se produce un error en tiempo de compilación.If Option Infer is off and Option Strict is on, a compile-time error occurs.
Yes NoNo Dim qty As Integer La variable se inicializa con el valor predeterminado del tipo de datos.The variable is initialized to the default value for the data type. Consulte la tabla más adelante en esta sección.See the table later in this section.
Yes Yes 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.If the data type of the initializer is not convertible to the specified data type, a compile-time error occurs.

Si especifica un tipo de datos, pero no especifica a un inicializador, Visual Basic inicializa la variable en el valor predeterminado para su tipo de datos.If you specify a data type but do not specify an initializer, Visual Basic initializes the variable to the default value for its data type. En la tabla siguiente se muestra el valor predeterminado de los valores de inicialización.The following table shows the default initialization values.

Tipo de datosData type Valor predeterminadoDefault value
Todos los tipos numéricos (incluidos Byte y SByte)All numeric types (including Byte and SByte) 00
Char 0 binarioBinary 0
Todos los tipos de referencia (incluidos Object, Stringy todas las matrices)All reference types (including Object, String, and all arrays) Nothing
Boolean False
Date 12:00 A.M. del 1 de enero del año 1 (01/01/0001 12:00:00 A.M.)12:00 AM of January 1 of the year 1 (01/01/0001 12:00:00 AM)

Cada elemento de una estructura se inicializa como si fuese una variable independiente.Each element of a structure is initialized as if it were a separate variable. Si se declara la longitud de la matriz pero no se inicializan sus elementos, cada elemento se inicializa como si fuese una variable independiente.If you declare the length of an array but do not initialize its elements, each element is initialized as if it were a separate variable.

Duración de la Variable Local estáticaStatic Local Variable Lifetime

Un Static variable local tiene una duración más larga que el procedimiento en el que se declara.A Static local variable has a longer lifetime than that of the procedure in which it is declared. Dependen de los límites de duración de la variable donde se declara el procedimiento y si es Shared.The boundaries of the variable's lifetime depend on where the procedure is declared and whether it is Shared.

Declaración de procedimientoProcedure declaration Variable inicializadaVariable initialized Detiene la variable existenteVariable stops existing
En un móduloIn a module La primera vez que se llama al procedimientoThe first time the procedure is called Cuando detiene la ejecución del programaWhen your program stops execution
En una clase o estructura, el procedimiento es SharedIn a class or structure, procedure is Shared La primera vez que se llama al procedimiento en una instancia específica o en la propia clase o estructuraThe first time the procedure is called either on a specific instance or on the class or structure itself Cuando detiene la ejecución del programaWhen your program stops execution
En una clase o estructura, no es el procedimiento SharedIn a class or structure, procedure isn't Shared La primera vez que se llama al procedimiento en una instancia específicaThe first time the procedure is called on a specific instance Cuando se libera la instancia de la colección de elementos no utilizados (GC)When the instance is released for garbage collection (GC)

Atributos y modificadoresAttributes and Modifiers

Puede aplicar atributos solo a variables de miembro, no a las variables locales.You can apply attributes only to member variables, not to local variables. Un atributo proporciona información a los metadatos del ensamblado, que no son significativos para el almacenamiento temporal, como las variables locales.An attribute contributes information to the assembly's metadata, which is not meaningful for temporary storage such as local variables.

En el nivel de módulo, no puede usar el Static modificador para declarar variables de miembro.At module level, you cannot use the Static modifier to declare member variables. En el nivel de procedimiento, no puede usar Shared, Shadows, ReadOnly, WithEvents, o cualquier acceso modificadores para declarar variables locales.At procedure level, you cannot use Shared, Shadows, ReadOnly, WithEvents, or any access modifiers to declare local variables.

Puede especificar qué código puede tener acceso a una variable proporcionando un accessmodifier.You can specify what code can access a variable by supplying an accessmodifier. Clase y el módulo predeterminado de variables (fuera de cualquier procedimiento) miembro a acceso privado y predeterminada de variables de miembro de estructura para acceso público.Class and module member variables (outside any procedure) default to private access, and structure member variables default to public access. Los niveles de acceso se pueden ajustar con los modificadores de acceso.You can adjust their access levels with the access modifiers. No se puede usar modificadores de acceso en variables locales (dentro de un procedimiento).You cannot use access modifiers on local variables (inside a procedure).

Puede especificar WithEvents solo en las variables de miembro, no en las variables locales dentro de un procedimiento.You can specify WithEvents only on member variables, not on local variables inside a procedure. Si especifica WithEvents, el tipo de datos de la variable debe ser un tipo de clase concreto, no Object.If you specify WithEvents, the data type of the variable must be a specific class type, not Object. No se puede declarar una matriz con WithEvents.You cannot declare an array with WithEvents. Para obtener más información acerca de los eventos, vea eventos.For more information about events, see Events.

Nota

Código fuera de una clase, estructura o módulo debe calificar el nombre de la variable de un miembro con el nombre de esa clase, estructura o módulo.Code outside a class, structure, or module must qualify a member variable's name with the name of that class, structure, or module. Fuera de que un procedimiento o bloque no puede hacer referencia a cualquier variable local dentro de ese procedimiento o bloque de código.Code outside a procedure or block cannot refer to any local variables within that procedure or block.

Liberar los recursos administradosReleasing Managed Resources

El recolector de elementos no utilizados de .NET Framework se deshace de los recursos administrados sin ninguna codificación adicional por su parte.The .NET Framework garbage collector disposes of managed resources without any extra coding on your part. Sin embargo, puede forzar la eliminación de un recurso administrado en lugar de esperar el recolector de elementos no utilizados.However, you can force the disposal of a managed resource instead of waiting for the garbage collector.

Si una clase contiene en un recurso particularmente valioso y escaso (por ejemplo, un identificador de conexión o el archivo de base de datos), es posible que no desea esperar hasta la siguiente recolección de elementos no utilizados para limpiar una instancia de clase que ya no está en uso.If a class holds onto a particularly valuable and scarce resource (such as a database connection or file handle), you might not want to wait until the next garbage collection to clean up a class instance that's no longer in use. Una clase puede implementar la IDisposable interfaz para proporcionar una manera de liberar los recursos antes de una colección de elementos no utilizados.A class may implement the IDisposable interface to provide a way to release resources before a garbage collection. Una clase que implementa esa interfaz expone un Dispose método que se puede llamar para forzar recursos valiosos para liberarse inmediatamente.A class that implements that interface exposes a Dispose method that can be called to force valuable resources to be released immediately.

El Using instrucción automatiza el proceso de adquisición de un recurso, ejecutar un conjunto de instrucciones y, a continuación, desechar los recursos.The Using statement automates the process of acquiring a resource, executing a set of statements, and then disposing of the resource. Sin embargo, debe implementar el recurso de la IDisposable interfaz.However, the resource must implement the IDisposable interface. Para obtener más información, vea Using (Instrucción).For more information, see Using Statement.

EjemploExample

En el ejemplo siguiente se declara las variables utilizando la Dim instrucción con distintas opciones.The following example declares variables by using the Dim statement with various options.

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

EjemploExample

El ejemplo siguiente enumeran los números primos entre 1 y 30.The following example lists the prime numbers between 1 and 30. El ámbito de las variables locales se describe en los comentarios de código.The scope of local variables is described in code comments.

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

EjemploExample

En el ejemplo siguiente, la speedValue variable se declara en el nivel de clase.In the following example, the speedValue variable is declared at the class level. El Private palabra clave se usa para declarar la variable.The Private keyword is used to declare the variable. La variable puede tener acceso a un procedimiento en el Car clase.The variable can be accessed by any procedure in the Car class.

' 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énSee also