Compartilhar via


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. Pode ser um dos seguintes:

    Consulte Níveis de acesso no Visual Basic.

  • Shared

    Opcional. Consulte Shared.

  • Shadows

    Opcional. Confira Sombras.

  • Static

    Opcional. Veja Estático.

  • ReadOnly

    Opcional. Consulte 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. Consulte WithEvents.

  • variablelist

    Obrigatório 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ó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 instrução Dim é 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á fazendo 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 New, não usará uma expressão de inicializador. Em vez disso, você fornece argumentos, se necessários, para o construtor da classe 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. 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 de seu procedimento ou bloco.

Os modificadores de acesso a seguir são usados para declarar variáveis fora de um procedimento: Public, , Protected, Friend, e Protected FriendPrivate. Para obter mais informações, consulte os 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, 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ê usar. Para obter mais informações, consulte Option Explicit Statement.

Especificando 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 As cláusula, 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 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 a instrução Option Infer e a 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 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 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 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 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 contém uma matriz, siga-a variablename imediatamente com 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 boundslist entre parênteses. Para cada dimensã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é seu valor de limite superior.

As duas instruçõ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 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 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ê 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 comprimento zero não tem o valor Nothing. Matrizes de comprimento zero são exigidas por determinadas funções de common language runtime. 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, 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 é colocada entre chaves na dimensão externa. Os elementos são especificados na ordem principal da linha.

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

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

Tipos e valores de dados 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 Resultado
Não Não Dim qty Se a opção Strict estiver desativada (o padrão), a variável será definida como Nothing.

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

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

Se Option Infer estiver desativado e Option Strict estiver ativado, ocorrerá um erro de tempo de compilação.
Yes Não Dim qty As Integer A variável é inicializada para o valor padrão do tipo de dados. Consulte a tabela mais adiante nesta seção.
Yes Yes 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 de seu 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, Stringe todas as matrizes) Nothing
Boolean False
Date 12:00 da manhã 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 de variável local estático

Uma Static variável local 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 seu 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 seu 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 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 o armazenamento temporário, como variáveis locais.

No nível do módulo, você não pode usar o Static modificador para declarar variáveis de membro. No nível do procedimento, você não pode 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 accessmodifier. 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 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, consulte Eventos.

Observação

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 se referir a nenhuma variável local dentro desse procedimento ou bloco.

Liberação de 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 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 a liberação imediata de recursos valiosos.

A Using instrução 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 IDisposable interface. Para obter mais informações, consulte Declaração de uso.

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