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 New
o , 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 Friend
e 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
, Shared
Private
Static
Shadows
, 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 , 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 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
, WithEvents
ou quaisquer modificadores de acesso para declarar variáveis locais.
Você pode especificar qual código pode acessar uma variável fornecendo um accessmodifier
arquivo . 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
- Declaração Const
- Declaração ReDim
- Declaração explícita da opção
- Declaração de inferência de opção
- Declaração Estrita de Opção
- Página de compilação, Project Designer (Visual Basic)
- Declaração de Variável
- Matrizes
- Inicializadores de objeto: tipos nomeados e anônimos
- Tipos Anônimos
- Inicializadores de objeto: tipos nomeados e anônimos
- Como: Declarar um objeto usando um inicializador de objeto
- Inferência de tipo local