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 As
encontrada 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
- Instrução Const
- Instrução ReDim
- Instrução Option Explicit
- Instrução Option Infer
- Instrução Option Strict
- Página de Compilação, Designer de Projeto (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 de Variável Local