Instrução Dim (Visual Basic)

Declara e aloca espaço de armazenamento para uma ou mais variáveis.

Sintaxe

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

Partes

  • attributelist

    Opcional. Veja Lista de atributo.

  • accessmodifier

    Opcional. Um dos seguintes pode ser feito:

    Consulte Níveis de acesso no Visual Basic.

  • Shared

    Opcional. Consulte Shared.

  • Shadows

    Opcional. Confira Sombras.

  • Static

    Opcional. Confira Estático.

  • ReadOnly

    Opcional. Confira ReadOnly.

  • WithEvents

    Opcional. Especifica que essas são variáveis de objeto que se referem a instâncias de uma classe que podem gerar eventos. Confira WithEvents.

  • variablelist

    Obrigatórios. Lista de variáveis que estão sendo declaradas nesta instrução.

    variable [ , variable ... ]

    Cada variable tem a sintaxe e as partes a seguir:

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

    Parte Descrição
    variablename Obrigatórios. Nome da variável. Confira Nomes de elementos declarados.
    boundslist Opcional. Lista de limites de cada dimensão de uma variável de matriz.
    New Opcional. Cria uma nova instância da classe quando a instrução Dim é executada.
    datatype Opcional. O tipo de dados da variável.
    With Opcional. Apresenta a lista de inicializadores de objeto.
    propertyname Opcional. O nome de uma propriedade na classe da qual você está fazendo uma instância.
    propinitializer Obrigatório após propertyname =. A expressão que é avaliada e atribuída ao nome da propriedade.
    initializer Opcional se New não for especificado. Expressão que é avaliada e atribuída à variável quando ela é criada.

Comentários

O compilador do Visual Basic usa a instrução Dim para determinar o tipo de dados da variável e outras informações, como qual código pode acessar a variável. O exemplo a seguir declara uma variável para manter um valor Integer.

Dim numberOfStudents As Integer

Você pode especificar qualquer tipo de dados ou o nome de uma enumeração, estrutura, classe ou interface.

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

Para um tipo de referência, use a palavra-chave New para criar uma nova instância da classe ou estrutura especificada pelo tipo de dados. Se você usar New, não usará uma expressão do inicializador. Em vez disso, você fornecerá argumentos, se forem necessários, para o construtor da classe da qual está criando a variável.

Dim bottomLabel As New System.Windows.Forms.Label

Você pode declarar uma variável em um procedimento, um bloco, uma classe, uma estrutura ou um módulo. Você não pode declarar uma variável em um arquivo de origem, namespace ou interface. Para obter mais informações, consulte Contextos de declaração e níveis de acesso padrão.

Uma variável declarada no nível do módulo, fora de qualquer procedimento, é uma variável de membro ou campo. As variáveis de membro estão no escopo em toda a classe, estrutura ou módulo. Uma variável declarada no nível do procedimento é uma variável local. As variáveis locais estão no escopo apenas dentro do procedimento ou do bloco.

Os seguintes modificadores de acesso são usados para declarar variáveis fora de um procedimento: Public, Protected, Friend, Protected Friend e Private. Para obter mais informações, consulte Níveis de acesso no Visual Basic.

A palavra-chave Dim é opcional e geralmente omitida se você especificar qualquer um dos seguintes modificadores: Public, Protected, Friend, Protected Friend, Private, Shared, Shadows, Static, ReadOnly ou WithEvents.

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

Se Option Explicit estiver ativado (o padrão), o compilador exigirá uma declaração para cada variável que você usa. Para obter mais informações, confira a Instrução Option Explicit.

Especificar um valor inicial

Você pode atribuir um valor a uma variável quando ela for criada. Para um tipo de valor, você usa um inicializador para fornecer uma expressão a ser atribuída à variável. A expressão deve ser avaliada como uma constante que pode ser calculada em tempo de compilação.

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

Se um inicializador for especificado e um tipo de dados não for especificado em uma cláusula As, a inferência de tipo será usada para inferir o tipo de dados do inicializador. No exemplo a seguir, num1 e num2 são classificados como inteiros. Na segunda declaração, a inferência de tipo infere o tipo do valor 3.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

A inferência de tipo se aplica no âmbito do procedimento. Ela não se aplica fora de um procedimento em uma classe, estrutura, módulo ou interface. Para obter mais informações sobre inferência de tipos, confira Instrução Option Infer e Inferência de Tipo de Variável Local.

Para obter informações sobre o que acontece quando um tipo de dados ou inicializador não é especificado, confira Tipos e Valores de Dados Padrão mais adiante neste tópico.

Você pode usar um inicializador de objeto para declarar instâncias de tipos nomeados e anônimos. O código a seguir cria uma instância de uma classe Student e usa um inicializador de objeto para inicializar propriedades.

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

Para obter mais informações sobre inicializadores de objeto, confira Como declarar um objeto usando um inicializador de objeto, Inicializadores de objeto: tipos nomeados e anônimos e Tipos anônimos.

Declarar várias variáveis

Você pode declarar várias variáveis em uma instrução de declaração, especificando o nome da variável para cada uma e seguindo cada nome de matriz com parênteses. Várias variáveis são separadas por vírgulas.

Dim lastTime, nextTime, allTimes() As Date

Se você declarar mais de uma variável com uma cláusula As, não poderá fornecer um inicializador para esse grupo de variáveis.

Você pode especificar tipos de dados diferentes para constantes variáveis usando uma cláusula As separada para cada variável que você declarar. Cada variável usa o tipo de dados especificado na primeira cláusula Asencontrada após sua 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

Matrizes

Você pode declarar uma variável para manter uma matriz, que pode conter vários valores. Para especificar que uma variável contém uma matriz, variablename deve estar imediatamente entre parênteses. Para obter mais informações sobre matrizes, confira Matrizes.

Você pode especificar o limite inferior e superior de cada dimensão de uma matriz. Para fazer isso, inclua um parêntese boundslist. Para cada dimensão, boundslist especifica o limite superior e, opcionalmente, o limite inferior. O limite inferior é sempre zero, quer você o especifique ou não. Cada índice pode variar de zero até seu valor associado superior.

As duas instruções a seguir são equivalentes. Cada instrução declara uma matriz de 21 elementos Integer. Quando você acessa a matriz, o índice pode variar de 0 a 20.

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

A instrução a seguir declara uma matriz bidimensional do tipo Double. A matriz tem 4 linhas (3 + 1) de 6 colunas (5 + 1) cada. Observe que um limite superior representa o valor mais alto possível para o índice, não o comprimento da dimensão. O comprimento da dimensão é o limite superior mais um.

Dim matrix2(3, 5) As Double

Uma matriz pode ter de 1 a 32 dimensões.

Você pode deixar todos os limites em branco em uma declaração de matriz. Se você fizer isso, a matriz terá o número de dimensões especificadas, mas ela não será inicializada. Ele tem um valor de Nothing até que você inicialize pelo menos alguns de seus elementos. A instrução Dim deve especificar limites para todas as dimensões ou para nenhuma dimensão.

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

Se a matriz tiver mais de uma dimensão, você deverá incluir vírgulas entre os parênteses para indicar o número de dimensões.

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

Você pode declarar uma matriz de comprimento zero declarando uma das dimensões da matriz como -1. Uma variável que contém uma matriz de tamanho igual a zero não tem o valor Nothing. Matrizes de comprimento zero são exigidas por determinadas funções comuns de runtime de linguagem. Se você tentar acessar essa matriz, ocorrerá uma exceção de runtime. Saiba mais em Matrizes.

Você pode inicializar os valores de uma matriz usando um literal de matriz. Para fazer isso, cerque os valores de inicialização com chaves ({}).

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

Para matrizes multidimensionais, a inicialização para cada dimensão separada é colocada entre chaves na dimensão externa. Os elementos são especificados em ordem de linha principal.

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

Para obter mais informações sobre literais de matrizes, confira Matrizes.

Tipos de dados e valores padrão

A tabela a seguir descreve os resultados de várias combinações de especificar o tipo de dados e o inicializador em uma instrução Dim.

Tipo de dados especificado? Inicializador especificado? Exemplo Result
Não No Dim qty Se Option Strictestiver desativado (padrão), a variável é definida como Nothing.

Se Option Strict estiver ativado, ocorre um erro de tempo de compilação.
No Yes Dim qty = 5 Se Option Infer estiver ativado (padrão), a variável usa o tipo de dados do inicializador. Confira Inferência de tipo de variável local.

Se Option Infer estiver desativado e Option Strict estiver desativado, a variável usa o tipo de dados do Object.

Se Option Infer estiver desativado e Option Strict estiver ativado, ocorre um erro de tempo de compilação.
Sim Não Dim qty As Integer A variável é inicializada para o valor padrão para o tipo de dados. Consulte a tabela posteriormente nesta seção.
Sim Sim Dim qty As Integer = 5 Se o tipo de dados do inicializador não for conversível para o tipo de dados especificado, ocorrerá um erro de tempo de compilação.

Se você especificar um tipo de dados, mas não especificar um inicializador, o Visual Basic inicializará a variável para o valor padrão para o tipo de dados. A tabela a seguir mostra os valores de inicialização padrão.

Tipo de dados Valor padrão
Todos os tipos numéricos (incluindo Byte e SByte) 0
Char Binário 0
Todos os tipos de referência (incluindo Object, String e todas as matrizes) Nothing
Boolean False
Date 12:00 AM de 1º de janeiro do ano 1 (01/01/0001 12:00:00 AM)

Cada elemento de uma estrutura é inicializado como se fosse uma variável separada. Se você declarar o comprimento de uma matriz, mas não inicializar os respectivos elementos, cada elemento será inicializado como se fosse uma variável separada.

Tempo de vida de variável local estático

Uma variável local Static tem um tempo de vida maior do que o do procedimento no qual é declarada. Os limites do tempo de vida da variável dependem de onde o procedimento é declarado e se é Shared.

Declaração de procedimento Variável inicializada A variável para de existir
Em um módulo A primeira vez que o procedimento é chamado Quando o programa interrompe a execução
Em uma classe ou estrutura, o procedimento é Shared A primeira vez que o procedimento é chamado em uma instância específica ou na própria classe ou estrutura Quando o programa interrompe a execução
Em uma classe ou estrutura, o procedimento não Shared A primeira vez que o procedimento é chamado em uma instância específica Quando a instância é liberada para GC (coleta de lixo)

Atributos e modificadores

Você pode aplicar atributos somente a variáveis membro, não a variáveis locais. Um atributo contribui com informações para os metadados do assembly, o que não é significativo para o armazenamento temporário, como variáveis locais.

No nível do módulo, você não pode usar o modificador Static para declarar variáveis membro. No nível do procedimento, você não pode usar Shared, Shadows, ReadOnly, WithEvents nem modificadores de acesso para declarar variáveis locais.

Você pode especificar qual código pode acessar uma variável fornecendo um accessmodifier. Variáveis de membro de classe e módulo (fora de qualquer procedimento) assume o padrão de acesso particular e variáveis de membro de estrutura assumem o padrão e acesso público. Você pode ajustar os níveis de acesso com os modificadores de acesso. Você não pode usar modificadores de acesso em variáveis locais (dentro de um procedimento).

Você pode especificar WithEvents apenas em variáveis de membro, não em variáveis locais dentro de um procedimento. Se você especificar WithEvents, o tipo de dados da variável deve ser um tipo de classe específico, não Object. Você não pode declarar uma matriz com WithEvents. Para obter mais informações sobre eventos, confira Eventos.

Observação

O código fora de uma classe, estrutura ou módulo deve qualificar o nome de uma variável de membro com o nome dessa classe, estrutura ou módulo. O código fora de um procedimento ou bloco não pode se referir a nenhuma variável local dentro desse procedimento ou bloco.

Liberar recursos gerenciados

O coletor de lixo do .NET Framework descarta recursos gerenciados sem nenhuma codificação extra de sua parte. No entanto, você pode forçar o descarte de um recurso gerenciado em vez de aguardar o coletor de lixo.

Se uma classe mantiver um recurso particularmente valioso e escasso (como uma conexão de banco de dados ou identificador de arquivo), talvez você não queira esperar até a próxima coleta de lixo para limpar uma instância de classe que não está mais em uso. Uma classe pode implementar a interface IDisposable para fornecer uma maneira de liberar recursos antes de uma coleta de lixo. Uma classe que implementa essa interface expõe um método Dispose que pode ser chamado para forçar a liberação imediata de recursos valiosos.

A instrução Using automatiza o processo de aquisição de um recurso, a execução de um conjunto de instruções e, em seguida, a eliminação do recurso. No entanto, o recurso deve implementar a interface IDisposable. Para obter mais informações, consulte Instrução using.

Exemplo 1

O exemplo a seguir declara variáveis usando a instrução Dim com várias opções.

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

Exemplo 2

O exemplo a seguir lista os números principais entre 1 e 30. O escopo das variáveis locais é descrito em comentários 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

Exemplo 3

No exemplo a seguir, a variável speedValue é declarada no nível da classe. A palavra-chave Private é usada para declarar a variável. A variável pode ser acessada por qualquer procedimento na classe 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

Confira também