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. Consulte Lista de Atributos.

  • accessmodifier

    Opcional. Pode ser um dos seguintes:

    Consulte Níveis de acesso no Visual Basic.

  • Shared

    Opcional. Ver Partilhado.

  • Shadows

    Opcional. Veja Sombras.

  • Static

    Opcional. Veja Estática.

  • ReadOnly

    Opcional. Consulte Somente leitura.

  • WithEvents

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

  • variablelist

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

    variable [ , variable ... ]

    Cada variable um tem a seguinte sintaxe e partes:

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

    Parte Description
    variablename Obrigatório. Nome da variável. Consulte 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 Dim instrução é executada.
    datatype Opcional. Tipo de dados da variável.
    With Opcional. Apresenta a lista de inicializadores de objetos.
    propertyname Opcional. O nome de uma propriedade na classe da qual você está criando uma instância.
    propinitializer Necessá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.

Observações

O compilador do Visual Basic usa a Dim instrução 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 Integer valor.

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 New palavra-chave para criar uma nova instância da classe ou estrutura especificada pelo tipo de dados. Se você usar Newo , não usará uma expressão inicializadora. Em vez disso, você fornece argumentos, se forem necessários, para o construtor da classe a partir da qual você está criando a variável.

Dim bottomLabel As New System.Windows.Forms.Label

Você pode declarar uma variável em um procedimento, bloco, classe, estrutura ou módulo. Não é possível 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 que é declarada no nível do módulo, fora de qualquer procedimento, é uma variável membro ou campo. As variáveis de membro estão no escopo em toda a sua 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 de seu procedimento ou bloco.

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

A Dim palavra-chave é opcional e geralmente omitida se você especificar qualquer um dos seguintes modificadores: Public, Protected, Friend, Protected Friend, SharedPrivateStaticShadows, 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ê usar. Para obter mais informações, consulte Declaração explícita de opção.

Especificando um valor inicial

Você pode atribuir um valor a uma variável quando ela é criada. Para um tipo de valor, use um inicializador para fornecer uma expressão a ser atribuída à variável. A expressão deve ser avaliada para 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 As cláusula, a inferência de tipo será usada para inferir o tipo de dados do inicializador. No exemplo a seguir, ambos num1 e num2 são fortemente tipados como inteiros. Na segunda declaração, a inferência de tipo infere o tipo a partir do valor 3.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

A inferência de tipo aplica-se ao nível do procedimento. Ele 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 tipo, consulte Instrução de inferência de opção e Inferência de tipo local.

Para obter informações sobre o que acontece quando um tipo de dados ou inicializador não é especificado, consulte Tipos de dados e valores padrão posteriormente 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 Student classe 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, consulte Como declarar um objeto usando um inicializador de objeto, Inicializadores de objeto: tipos nomeados e anônimos e Tipos anônimos.

Declarando múltiplas 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 entre 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 As cláusula, não poderá fornecer um inicializador para esse grupo de variáveis.

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

Matrizes

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

Você pode especificar os limites inferior e superior de cada dimensão de uma matriz. Para fazer isso, inclua um boundslist dentro dos parênteses. Para cada dimensão, o especifica o boundslist 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é o seu valor limite superior.

As duas afirmações a seguir são equivalentes. Cada instrução declara uma matriz de 21 Integer elementos. 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 maior valor 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 especificado, mas não será inicializada. Ele tem um valor de Nothing até que você inicialize pelo menos alguns de seus elementos. A Dim instrução 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ê deve 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 comprimento zero não tem o valor Nothing. Matrizes de comprimento zero são exigidas por certas funções comuns de tempo de execução de linguagem. Se você tentar acessar essa matriz, ocorrerá uma exceção de tempo de execução. Para obter mais informações, consulte Matrizes.

Você pode inicializar os valores de uma matriz usando um literal de matriz. Para fazer isso, envolva 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 é incluída em chaves na dimensão externa. Os elementos são especificados em ordem de linha maior.

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

Para obter mais informações sobre literais de matriz, consulte Matrizes.

Tipos de dados e valores padrão

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

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

Se Option Strict estiver ativado, ocorrerá um erro em tempo de compilação.
Não Sim Dim qty = 5 Se Option Infer estiver ativado (o padrão), a variável usará o tipo de dados do inicializador. Consulte Inferência de tipo local.

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

Se Option Infer estiver desativado e Option Strict ativado, ocorrerá um erro em tempo de compilação.
Sim No Dim qty As Integer A variável é inicializada com o valor padrão para o tipo de dados. Consulte a tabela mais adiante 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 em tempo de compilação.

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

Tipo de dados Default value
Todos os tipos numéricos (incluindo Byte e SByte) 0
Char Binário 0
Todos os tipos de referência (incluindo Object, Stringe 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 seus elementos, cada elemento será inicializado como se fosse uma variável separada.

Tempo de vida da variável local estática

Uma Static variável local tem uma vida útil mais longa do que a do procedimento em que é 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 Variável para existente
Num módulo A primeira vez que o procedimento é chamado Quando o programa para a execução
Numa 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 para a execução
Em uma classe ou estrutura, o procedimento não é Shared A primeira vez que o processo é chamado a uma instância específica Quando a instância é liberada para coleta de lixo (GC)

Atributos e modificadores

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

No nível do módulo, não é possível usar o Static modificador para declarar variáveis de membro. No nível do procedimento, não é possível usar Shared, Shadows, ReadOnly, WithEventsou quaisquer modificadores de acesso para declarar variáveis locais.

Você pode especificar qual código pode acessar uma variável fornecendo um accessmodifierarquivo . Variáveis de membro de classe e módulo (fora de qualquer procedimento) padrão para acesso privado e variáveis de membro de estrutura padrão para acesso público. Você pode ajustar seus níveis de acesso com os modificadores de acesso. Não é possível 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. Não é possível declarar uma matriz com WithEvents. Para obter mais informações sobre eventos, consulte Eventos.

Nota

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

Liberando recursos gerenciados

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

Se uma classe mantém 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 IDisposable interface para fornecer uma maneira de liberar recursos antes de uma coleta de lixo. Uma classe que implementa essa interface expõe um Dispose método que pode ser chamado para forçar recursos valiosos a serem liberados imediatamente.

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

Exemplo 1

O exemplo a seguir declara variáveis usando a Dim instrução 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 primos 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 speedValue variável é declarada no nível da classe. A Private palavra-chave é usada para declarar a variável. A variável pode ser acessada por qualquer procedimento na Car classe.

' 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 também