Desenvolvimento - Visual Basic .NET

VB.NET: Estudo da linguagem - Parte 4

Esta seção tem por objetivo estudar os tipos de dados fundamentais e apresentar um novo tipo de dado composto, além de outros recursos de programação aplicados aos tipos de dados

por Paulo Cesar Macedo



Importante:
Esse estudo foi uma compilação dos seguintes textos feita pelo autor:
MSDN Visual Studio 2002/2003 (tradução da fonte original do site da Microsoft)
Livro: Programando em Visual Basic de Michael J. Young.
Livro: Visual Basic for Windows de Steven Holzner.
Livro: Visualização e realidade virtual de Lee Adams.

1.10 – Tipos de Dados

Esta seção tem por objetivo estudar os tipos de dados fundamentais e apresentar um novo tipo de dado composto, além de outros recursos de programação aplicados aos tipos de dados.

O VB .NET, por default, obriga a declaração de todos os elementos antes de usá-los no código. Exemplo :

Dim MinhaVariável as string

Se não for declarado o elemento no código, o compilador acusa o problema e gera erro. Este tipo de recurso chama-se Declaração Explícita. Para desligar esse recurso utiliza-se o comando Option Explicit Off.

Toda vez que o compilador encontrar a declaração Option Explicit Off, qualquer variável não declarada em código irá ser considerada do tipo Object, entretanto esse tipo de comportamento do compilador gera potenciais erros de execução além de gerar um aplicativo de desempenho ruim.

É recomendável utilizar em todos os códigos fontes o comando Option Explicit On para obrigar o compilador varrer todas as variáveis não declaradas.

Quando todas as variáveis são declaradas com o tipo de dados em Option Explicit On, diz-se que os elementos são Altamente tipificados (Strong Typing), que além de aumentar a velocidade do aplicativo, se beneficia dos recursos do editor de códigos do Visual Studio, como por exemplo :

  • IntteliSense – É um recurso que exibe as propriedades e métodos de um classe, simultaneamente enquanto se digita no editor.
  • Verificação de sintaxe – O compilador verifica a sintaxe do código escrito simultaneamente enquanto se digita no editor.

1 – Usando tipos de dados Short

As variáveis do tipo Short podem guardar valores de 16 bits (2 bytes). É o menor tipo de dados numérico disponível.

As normas aplicadas ao tipo de dados Integer logo abaixo, se aplicam ao tipo de dados Short.

Exemplo :

Dim MeuNúmero as short

Dim NossoNúmero as int16

MeuNúmero = 32767

NossoNúmero = 32768 ‘O VB exibe uma mensagem “NaM Não é um nùmero”

No exemplo acima há duas variáveis declaradas do tipo Short (int16 é a mesma coisa que Short), a primeira variável recebeu o valor máximo de armazenamento, enquanto que a segunda recebeu um valor superior a capacidade de armazenamento. O VB acusa o erro exibindo uma mensagem de erro na compilação “Existem erros, deseja continuar?“.

2 – Usando tipos de dados Integer

Qualquer tipo de dados numérico exige maior processamento do sistema , assim é necessário definir o tipo adequadamente antes de usar. O tipo Integer armazena dados em 16-bit (2 byte) dentro da faixa especificada acima, podendo ser utilizada para criar um enumerador (veja posteriormente).

A atribuição de um valor a variável é simples, utilizando apenas o operador de atribuição ( = ) e nunca utilize separadores de milhares. Qualquer caractere diferente de número não será aceito pelo VB, gerando erro de Type Mismatch.

VariávelInteger = 1234

Qualquer valor digitado entre aspas ( “ “ ) é uma string por definição, entretanto o VB ativa uma interpretação correta para o tipo de dados da variável. Veja abaixo :

VariávelInteger = “1234”

O VB não se incomoda com aspas, já que a variável é do tipo numérica, podendo até efetuar operações matemáticas corretamente, entretanto se houvesse um caractere diferente de número, o sistema geraria um erro de Type Mismatch. Como no exemplo :

VariávelInteger = “1234A” ‘Tipo Integer não suporta caracteres diferentes de número

Pode-se utilizar um separador de precedência “( ) “ para atribuir o valor numérico a uma variável integer sem alterar a interpretação do VB. Exemplo :

VariávelInteger = (1234)

Embora o parênteses não seja um caractere numérico, ele possui um significado de ativar a precedência de primeiro plano em cálculos do compilador, pois desta forma não interfere na interpretação do compilador VB. Entretanto quando se combina aspas + parênteses na atribuição de um valor numérico, o resultado é ligeiramente diferente :

VariávelInteger = “(1234)”

Msgbox VariávelInteger

No exemplo acima, a VariávelInteger terá um valo negativo –1234 exibido na caixa de mensagem Msgbox. A combinação de aspas e parênteses “( )” troca o sinal de um valor numérico positivo, transformando-o em negativo. Essa funcionalidade foi inserida neste contexto como simples curiosidade.

Conclui-se que um parênteses e aspas podem criar uma interpretação diferente no compilador do VB quando atribuirmos valores a variáveis Integer, portanto devemos nos ater sempre as formas mais simples e corretas de programação, não devemos portanto “inventar” coisas novas para o sistema “descobrir” e que poderá levar a resultados imprevisíveis.

Uma variável do tipo Integer, quando não devidamente inicializada com um valor atribuído, tem como Default o valor zero (0) , assim por exemplo, se um desenvolvedor esquecesse de atribuir um valor a uma variável Integer, esse valor seria Zero (0) devido a natureza do tipo de dados Integer, assim é completamente diferente de uma variável String vazia “”.

Exemplo :

Dim MeuInteiro as int32 ‘Mesma coisa que Integer

Dim NossoInteiro as integer

MeuInteiro = 1234

NossoInteiro = 1234

3 – Usando tipos de dados Long

Os tipos de dados Long são armazenados em 32–bits (4 byte), que irremediavelmente necessitam de mais memória do sistema. Todas as observações referentes ao tipo de dados integer, se aplicam ao tipo de dados Long, com uma ressalva na capacidade de faixa de dados que este suporta.

Exemplo :

Dim MeuLong As Int64

MeuLong = 10

MsgBox(MeuLong.MaxValue)

MsgBox(MeuLong)

No exemplo acima, foi declarado uma variável do tipo Long (ou Int64) atribuindo o valor 10. Em seguida foi utilizada uma função interna dessa classe que retorna o valor máximo de armazenamento desse tipo de dados.

Observe que todos os tipos de dados possuem funções específicas, pois fazem parte de classes da tecnologia .NET Framework.

4 – Usando tipos de dados Double e Single

Os tipos de dados Double armazenam informações em 64-bits (8 byte) e são especialmente utilizados para cálculos precisos com números decimais. Os tipo de dados Single armazenam informações em 32-bits (4-bite). Todas as observações referentes ao tipo de dados integer se aplicam aos dados Double e Single

VariávelDouble = 12.123456789 ‘O grande benefício deste tipo de dados são as casas decimais e

‘sua precisão nos cálculos.

Note porém que o VB somente aceita o separador decimal ponto ( . ) ao invés da vírgula, veja explicações no tipo de dados Decimal logo mais adiante.

5 – Usando tipos de dados Byte

O tipo de dados Byte armazenam informações em 8-bit (1-byte), e são utilizados para conter dados binários. Pode-se observar que o tipo de dados Byte é também referenciado em banco de dados, onde é semelhante ao tipo de dados SmallInt em SGBD SQL Server.

Como um exemplo de utilização de dados binários é copiar o conteúdo de um campo de dados no formato de imagem binária (*.bmp, *.jpg, etc) para outro campo de dados :

Dim MinhaFoto as Byte

MinhaFoto = recordset.Fields(“Foto”).value

No fragmento de código acima, a variável MinhaFoto foi declarada explicitamente como Byte, e foi atribuída a ela, o campo “Foto” de um objeto de banco de dados Recordset. Assim o conteúdo binário dessa foto foi armazenada no tipo de dados Byte, que pode ser transferida para outro campo do banco de dados.

O tipo de dados Byte quando não devidamente inicializado pelo desenvolvedor, terá sempre como valor Default o zero (0).

6 – Usando o tipo de dados Boolean

Um tipo de dados Boolean armazena dois valores possíveis : Verdadeiro (-1) ou Falso (0) em números de 16-bit (2-byte). O tipo de dados Booleano contém informações do tipo yes/no, on/off, true/false. O valor padrão de uma variável do tipo de dados Boolean é sempre false (falso).

Os valores True e False são constantes pré-definidas no VB, que por outro lado poderiam ser referenciadas como –1 e 0 respectivamente. O uso do tipo Boolean é tipico para operações de comparação ou como retorno de funções específicas :

VariávelBoolean = ( 1 = 2)

A VariávelBoolean no exemplo acima, terá como resultado o valor 0 (False), decorrente de uma comparação 1 = 2. Se a expressão de comparação fosse 2 = 2 , o valor de VariávelBoolean seria –1 (True).

Um outro exemplo de comparação entre strings para uso em tipos de dados boolean, confirma a hipótese de que strings devem ser idênticas na sua construção, onde os caracteres maíusculos e minúsculos fazem a diferença, neste caso específico de comparação :

VariávelBoolean = ( “Campo” = “CAmpo”)

Os dois elementos são strings semelhantes, entretanto não são idênticas, pois “CA” maiúsculo faz a distinção com “Ca” , assim o resultado de VariávelBoolean será False.

As propriedades dos objetos, onde é informado true ou false (como por exemplo Enabled) são do tipo Boolean. Como já foi dito , uma variável Boolean não inicializada com a atribuição , terá como Padrão o valor False.

7 – Usando o tipo de dados Date

Os tipos de dados Date armazenam valores em números 64-bit (8-byte). Quando outros tipos de dados são transformados para o tipo de dados Date, os números representados a esquerda do valor decimal é a data, e os números representados a direita do valor decimal é o horário.

Há duas regras para atribuição de datas :

O sinal # ativa o reconhecimento de datas no VB.

Sempre digite datas no formato mm/dd/aa para certificar-se que o sistema interpretará corretamente os dados, em qualquer região.

Exemplo :

VariávelDate = #12/30/2002# ‘ data no formato mm/dd/aa

Portanto é necessário incluir o sinal # de forma a evitar uma interpretação indevida pelo compilador, no caso de uma data em string “12/30/2001” o compilador não seria capaz de executar operações com datas. Exemplo :

VariávelDate1= “12/30/2001”

VariávelDate2 =“11/30/2001”

MsgBox VariávelDate1 – VariávelDate2

O compilador do VB não gera mensagens de erro no caso do exemplo acima, mesmo que as expressões não estejam devidamente configuradas com o sinal #, entretanto no momento de efetuar operações com datas, o erro é iminente (Type mismatch).

O exemplo acima seria corretamente configurado quando transformássemos as expressões em datas, e o resultado final seria 1 mese de diferença entre as datas. Agora o compilador interpreta exatamente as expressões como datas, permitindo a execução de operações.

VariávelDate1= #12/30/2001#

VariávelDate2 =#11/30/2001#

MsgBox VariávelDate1 – VariávelDate2

O tipo de dados Date também pode receber uma função intrínseca de data do VB, de forma a retornar como resultado a data e o horário do sistema :

VariávelDate = Now ‘Função Now que retorna a data e hora atual do sistema

Msgbox VariávelDate

O resultado obtido na caixa de Mensagem será : 23/11/2001 18:46:13 como exemplo da construção acima.

Para um cálculo envolvendo dias, bastaria acrescentar ou subtrair da expressão data um inteiro simples, como mostrado abaixo :

VariávelDate = #12/01/2001#

Msgbox (VariávelDate –1 )

A mensagem final seria 01/11/2001, pois foi subtraído 1 dia da data originalmente atribuída a VariávelDate. Deve-se observar, entretanto que para efetuar operações com datas mais eficiente, usa-se as funções intrínsecas de datas do VB.

Note sempre que o formato atribuído é mm/dd/aa, caso essa regra não for obedecida, o VB trata de corrigir o erro, invertendo a ordem das datas automaticamente. Entretanto, não se pode esperar um bom resultado como por exemplo o dia 01/02/2001, o resultado final seria 02/01/2001 ao invés de 01/02/2001.

O VB foi concebido em língua Inglesa/U.S. , que considera as datas no formato mm/dd/aa, descartando qualquer possibilidade de formatação diferente, portanto trate sempre de usar essas regras daqui para frente, de modo a evitar confusões em cálculos e atribuições.

O tipo de dados Date quando não devidamente inicializado pelo desenvolvedor, isto é não for atribuído um valor de data, terá como valor Default 00:00:00.

8 – Usando o tipo de dados Decimal

Os tipos de dados Decimal são armazenados em números de 128-bit (12-byte) inteiros a potência de 10, que representa o número de casas decimais. Esse tipo de dados, trabalha com números de grande precisão.

Exemplo :

Dim a As Decimal = 328.558

Dim b As Decimal = 12.4051

Dim c As Decimal

c = a * b

MsgBox(c)

9 – Usando o tipo de dados Object

O tipo de dados Object armazena endereços de 32-bit (4-byte) dos objetos em referência. Esse tipo de dados é suficientemente flexível para fazer referência a qualquer tipo de objeto reconhecido pelo sistema. Essa definição de armazenar endereços assemelha-se a um conceito de ponteiros em C++, guardando suas proporções. Exemplo :

Dim objDb As Object

Set objDb = OpenDatabase("c:\Vb5\Biblio.mdb")

A variável objDb foi declarada explicitamente como um objeto de banco de dados. Note, que a declaração foi explicitamente genérica com object, de forma a piorar o desempenho do sistema, como regra geral tente sempre declarar objetos como Classes a que pertencem ( discussão em capítulos posteriores), uma forma de pesquisar a classe a que pertence o objeto é o Object Browser.

As variáveis do tipo Object podem ser tratadas do Tipo Valor ou do Tipo Referência já estudadas anteriormente.

O Valor Nothing é usado para desassociar um objeto a variável. É recomendado desassociar (limpar da memória) todas as variáveis Object que não forem mais utilizadas no programa. Exemplo :

Dim brush As System.Drawing.Brush

brush = New System.Drawing.Brush(bmap)

. . . . . .

brush = Nothing

No exemplo acima, foi utilizado uma variável de objeto que faz referência a um classe da tecnologia .NET Framework para criar um instrumento de desenho, em seguida após o uso, foi desassociado a variável do objeto, liberando a memória ao sistema.

10 – Usando o tipo de dados Char

O tipo de dados Char aceita somente caracteres Unicode 2 bytes (16 bit). Pode usar métodos como IsDigit e IsPunctuation em variáveis desse tipo para determinar sua classificação.

Se o comando de verificação Option Strict estiver ligado, é preciso anexar o caracter Literal para que o compilador identifique o tipo de variável corretamente. Exemplo


    

Option Strict On

" ...

Dim CharVar As Char

CharVar = "@" " Não pode converter String em Char com Option Strict On.

CharVar = "@"C "Assim pode

11 – Usando tipos de dados String

O tipo de dados String armazenam caracteres alfanuméricos e símbolos padrões de código ASCII ( 0 até 255) que representam todos os caracteres existentes, entretanto há de se mencionar que nem todos os caracteres dentro dessa faixa são suportados pelo Windows. Há somente um tipo de strings :

Os strings de tamanho variável (variable-length) que diminui ou cresce a medida que os dados são adicionados a variável.

Para atribuirmos valores em strings, basta colocarmos esse valor entre aspas “ “ , para ativar a interpretação do VB para tipos de dados string. Assim :

VariávelString = “Carro”

No caso de uma abstenção no uso de aspas, o VB não interpreta a expressão como string, desde que ela não ultrapasse uma palavra simples :

VariávelString = Carro ‘O VB não interpreta essa expressão como string

VariávelString = Carro Azul ‘O VB não interpreta como string, mas como uma linha de comando

No exemplo acima, a primeira atribuição não ocorre porque o VB não interpreta a expressão como uma string válida, assim a VariávelString terá string vazio “”. No último exemplo, o VB interpretou a expressão como uma linha de comando de código ao compilador, e não como uma expressão String, neste caso o VB gera uma mensagem de erro em execução ( Esperado final do comando !) , pois a expressão não é uma palavra simples.

O VB tem uma sensibilidade especial para caracteres numéricos, de forma que não há necessidade de utilizar-se de aspas para sua atribuição , conforme o exemplo :

VariávelString = 1234

Ou

Variável String = “1234”

Logicamente, não haverá maneira de efetuar qualquer operação matemática, o que pode ser feito é uma concatenação de variáveis, com resultado de 12341234 (use sempre o operador & , veja em capítulo posterior). Por outro lado, se fosse atribuído uma expressão 1234B sem aspas, o caractere não numérico geraria um erro de execução.

De qualquer forma , é sempre necessário utilizar aspas “ “ para atribuirmos strings a variáveis string, como uma forma correta de programação, mesmo que seja expressões com números.

Se uma variável String não for inicializada, isto é, se o desenvolvedor não atribuir nenhuma expressão a ela, o seu valor será vazio “”.

12 – Infinity (Infinito) e outros tipos de dados

No VB .NET há dois tipos de dados não numéricos mas que são produzidos por cálculos numéricos.

  • Infinity – Qualquer cálculo que gera números infinitos. Por exemplo dividir um inteiro por zero.
  • NaN – Not a Number (Não é um Número). É qualquer resultado que não corresponde a valores numéricos.

Exemplo1 :

Dim dblVar As Double = 999

Dim infVar as Double

infVar = dblVar / 0

msgbox (InfVar)

No exemplo acima, não há formas de dividir números inteiros por zero, portanto o resultado da tela em msgbox é “+Infinito”. Observe que não há um tipo específico de dados que represente Infinity, portanto é um recurso da linguagem do que propriamente um tipo de dados.

Exemplo2 :

Dim var1, var2 As Double

Dim result As Double

var1 = 0

var2 = 0

result = var1 / var2

MsgBox(result)

No exemplo2, o resultado da divisão de 0 / 0 não é um número, portanto o resultado exibido em msgbox é “NaN (Não é um Número)”. Assim como Infinity, NaN não é representado por nenhum tipo de dados específico, mas como um recurso da linguagem.

Pode-se usar as funções IsInfinity e IsNaN para testar o resultado de cálculos matemáticos. Exemplo:

Dim var1, var2 As Double

Dim result As Double

var1 = 0

var2 = 0

result = var1 / var2

If result.IsInfinity(result) Then

If result.IsPositiveInfinity(result) Then

MsgBox(“Encontrei um número muito grande. Não posso continuar”)

Else

MsgBox(“Encontrei um número muito pequeno. Não posso continuar”)

End If

Else

If result.IsNaN(result) Then

MsgBox(“Erro no cálculo”)

Else

MsgBox(“O resultado é “ & result.ToString)

End If

End If

13 – Conversões entre tipos de dados

Conversão é um processo que muda um tipo de valor de uma variável para outro tipo de valor. O comportamento do compilador VB pode mudar quando a opção Option Strict estive ligada ou desligada, por isso justifica-se estudar esse assunto.

Há dois tipos de conversão no VB :

  • Conversão Widening - Conversão com alargamento significa converter um valor de um tipo de dados de pequena faixa para um tipo de dados de grande faixa de atuação. Assim pode-se mudar de um tipo de dados integer para um tipo de dados long.
  • Conversão Narrowing – Conversão com estreitamento significa converter um valor de um tipo de dados de grande faixa para um tipo de dados de pequena faixa de atuação. Só pode converter um tipo de dados long para integer, se o valor máximo da variável long for suportado pelo tipo de integer, caso contrário gera erro de overflow.

Exemplo 1 de uma conversão do tipo Widening :

Dim meuLongo As Long

Dim meuInteiro As Short

meuInteiro = 32767

meuLongo = meuInteiro

MsgBox(meuLongo) ‘ retorna 32767

Exemplo 2 de conversão Narrowing :

Dim meuLongo As Long

Dim meuInteiro As Short

meuLongo = 32767

meuInteiro = meuLongo

MsgBox(meuInteiro) ‘ retorna 32767

No exemplo 1 ocorreu uma conversão que alargou um valor de uma variável inteira para um valor long. Enquanto que no exemplo 2 ocorreu um estreitamento de um valor de uma variável long para um valor inteiro.

No exemplo 1 o compilador efetuou um conversão implícita, alargando um tipo de dados inteiro para long sem qualquer interferência do desenvolvedor. No exemplo 2 o compilador também efetuou uma conversão implícita estreitando um tipo de dados long para integer, pois a opção Option Strict estava desligada (Option Strict Off).

O compilador efetua uma conversão explícita, quando o desenvolvedor usa comandos de Conversão de modo a forçar uma conversão de um tipo de dados para outro, esse tipo de conversão é também conhecida como Casting. Exemplo

Dim meuInteiro as short

Dim MeuLongo as long

meuInteiro = CInt(MeuLongo)

Uma conversão do tipo Narrowing explícita, isto é converter um valor maior para menor com uma função de conversão do VB, pode gerar perdas nos dados. Uma conversão do tipo Widening explícita, isto é converter um valor menor para maior com uma função de conversão do VB, pode gerar perdas no arredondamento decimal de valores no caso de converter um dados do tipo Long para um Decimal. Pois o tipo Decimal aceita grande quantidade de números após a vírgula enquanto que Long não aceita números decimais.

A conversão de qualquer tipo de dados string para um tipo de dados numéricos é sempre do tipo Narrowing. O operador de concatenação ( & ) também funciona como conversor implícito. Exemplo:

Dim meu as integer = 1

Dim nosso as string

Nosso = “Número “ & meu ‘além de concatenar duas variáveis

‘o operador & também funciona como conversor implícito

A função Val do VB .NET pode ser utilizado para conversão de strings. A função varre toda a string até encontrar um dígito diferente quando termina o processo convertendo somente os números encontrados. Exemplo :

Dim m As Integer

m = Val ("142 kilômetros")

MsgBox(m) ‘exibe a mensagem 142

Resumindo : O compilador do VB .NET tem duas regras default:

  1. Toda variável deve ser declarada antes do uso.
  2. Toda conversão do tipo Narrowing deve ser efetuada com funções de conversão apropriada.

Esse comportamento pode ser alterado desligando o controle de verificação Option Strict Off. Deste modo todas as variáveis podem ser usadas sem declaração anterior e o tipo de conversão (Narrowing) pode ser feito implicitamente, isto é sem funções de conversão.

A Microsoft recomenda sempre utilizar conversões explícitas usando as funções de conversão, para criar um aplicativo de melhor desempenho. Além disso recomenda sempre utilizar o comando Option Strict On.

O compilador do VB considera alguns valores como default, como por exemplo qualquer valor numérico desde que não seja muito alto é considerado Integer; qualquer valor com dígitos decimais é considerado como Double; qualquer valor muito extenso é considerado Long, e finalmente qualquer valor com True ou False é considerado Boolean. Assim quando houver erro em atribuição de valores a constantes ou variáveis, basta forçar o valor da variável utilizando os comandos de tipo de dados. Exemplo :

Dim
    myDecimal as Decimal
myDecimal
    = 100000000000000000000  " Erro de
    compilação.

No exemplo acima e conforme as definições acima, o valor 100000000000000000000 é considerado Double (default) pelo compilador, e a variável myDecimal é do tipo Decimal. Mesmo que o tipo Decimal suporte o valor acima descrito, ele não pode aceitar o tipo de dados Double (que é muito maior), portanto o compilador gera um erro. A forma correta de utilização é :

Dim
    myDecimal as Decimal
myDecimal
    = 100000000000000000000D  " Ok.

    

14 – Sistema numérico no VB .NET

Muitos números usados em VB são decimais (base 10). Mas pode ocorrer o uso de números hexadecimais (base 16) ou números octal (base 8). O Visual Basic representa nrs. Decimais com o prefixo &H e octal com &O.

Decimal

Octal

Hexadecimal

9

&O11

&H9

15

&O17

&HF

16

&O20

&H10

20

&O24

&H14

255

&O377

&HFF

O computador pode trabalhar com qualquer número utilizado pelo sistema, entretanto o número hexadecimal é utilizado em certas tarefas, como o sistema de cores, tela e principalmente as APIs do Windows.
Paulo Cesar Macedo

Paulo Cesar Macedo