Desenvolvimento - Visual Basic .NET

VB.NET: Estudo da linguagem - Parte 3

Nesta terceira parte do estudo sobre Visual Basic .NET veremos como declarar elementos.

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.9 – Declarando Elementos

A linguagem utiliza alguns tipos de instruções tais como :

Palavras-Chaves (KeyWords) – São palavras reservadas da linguagem para construir uma estrutura de comandos, e não podem ser usadas individualmente.

Comandos (Statements) – São instruções completas que fazem sentido ao compilador e podem conter palavras chaves, operadores, constantes, expressões. Os comandos são divididos em duas categorias :

  1. Comandos de declaração – Usados para nomear variáveis, constantes, matrizes, definir procedimentos e objetos.
  2. Comandos de execução – Usados para executar uma ação, e englobam todos os comandos de loop, comandos de decisão e todos os comandos que utilizam operadores matemático ou condicionais.

Expressões – São séries de elementos que representam valores, separados por operadores que resultam em outro valor. Utilizam de operadores de comparação para comparar dois valores; utilizam operadores matemáticos para efetuar operações entre dois ou mais valores; utilizam de elementos Booleanos para fazer comparações e parênteses para alterar a ordem de cálculos.

A Microsoft não reconheceu os Comandos de atribuição como uma terceira categoria, mas incluiu na documentação como todos aqueles que utilizam operadores de atribuição.

Para declarar elementos para uso no código utiliza-se Comandos de declaração ou Palavras-Chaves. O elemento declarado fica retido na memória do computador sendo gerenciado diretamente pela tecnologia .NET Framework.

Os elementos declarados no código podem ser constantes, variáveis, objetos, classes, enumerações, estruturas, propriedades, métodos, funções, eventos, interfaces, delegates (delegar).

O VB ignora letras maiúsculas e minúsculas quando se referir a elementos declarados, portanto pode-se usar MinhaVariável quanto minhavariável.

Quando se declara elementos, o processo envolve as seguintes considerações :

  1. Variáveis – É o espaço reservado dentro da memória do computador, para ser usado no programa.
  2. Comandos de Declaração – São comandos do VB que declaram elementos na memória.
  3. Tipo de Dados – É o tipo de dados fundamental que o elemento deverá pertencer.
  4. Vida útil (LifeTime) – É o período de execução que o elemento está disponível para ser usado.
  5. Escopo – É a extensão que o elemento deve atingir, sem ser declarado novamente.
  6. Acessibilidade – É a forma que o código deve fazer uso do elemento.
  7. Nomes Ambíguos – Quando dois elementos têm o mesmo nome, e como o VB resolve este problema.

1 – Variáveis

Uma variável é um espaço reservado dentro da memória para armazenar valores desconhecidos. Diferentemente de um ponteiro que representa o local onde ela está endereçada.

Para usar variáveis é necessário aplicar os Comandos de Declaração, utilizando as técnicas de codificação e programação já explicadas acima. Observe que quando se declara uma variável , o compilador reserva um espaço na memória para o valor, mas não a cria explicitamente. Para criar explicitamente uma variável, é preciso declarar a variável e atribuir um valor.

O comando Option Explicit obriga que todas as variáveis sejam declaradas antes do uso.

2 – Comandos de Declaração

Os comandos de declaração são Dim e Const. As palavras chaves (Keywords) são Private, Public, Shared, Protected, Friend e Static. Exemplo :

Private I As Integer

Dim Amount As Double

Static YourName As String

Public BillsPaid As Decimal

Const Modulus As Single = 4.17825 ‘Esse valor não pode ser alterado.

Public I, J, K As Integer " Declara três variáveis inteiras.

Dim FirstName, MiddleName, LastName As String " Declara três variáveis string.

Private S, SArray() As Short " Uma variável Shor e uma variável de matriz.

Friend B1, B2 As Byte, C1, C2 As Char " Duas variáveis Byte e duas variáveis Char.

O comando Dim é semelhante as palavras chaves Private e Public. E pode ser usado em procedimentos, módulos, classes , blocos e estruturas, mas só podem ser acessadas no código que foram declaradas. A diferença entre Private, Public e Dim é que as duas primeiras permitem ou não que essa variável fique disponível a outros blocos de código, portanto são também chamados de Modificadores de Acesso.

Alguns autores até recomendam não usar o Comando Dim por se tratar de um declarador pouco expressivo.

A palavra chave Private é um modificador de acesso e declara variáveis em todos os blocos de código, e assim como o comando Dim, só podem ser acessadas no código que foram declaradas. E não podem ser acessadas por outros blocos de código.

A palavra chave Public é um modificador de acesso e declara variáveis em todos os blocos de código, e diferentemente de Dim e Private, permitem que outros códigos exteriores utilizem a variável.

A palavra chave Shared é um modificador de acesso que declara variáveis em classes, e permitem que outros códigos acessem essa variável sem fazer uma referência a classe.

A palavra chave Static é um modificador de acesso e declara variáveis em todos os blocos de código , exceto Classes e Módulos. Variáveis declaradas com Static retém o último valor na memória mesmo quando o procedimento em que foi declarado é encerrado.

O Comando Const declara variáveis que não podem ser alteradas, e são utilizadas em todos os blocos de código, entretanto a variável constante fica disponível somente ao código em que foi declarada.

A palavra chave Protected declara variáveis somente dentro de Classes. Variáveis declaradas com protected só podem ser acessadas dentro da classe que a declarou ou de classes derivadas.

A palavra chave Friend declara variáveis em todos os blocos de código, exceto procedimentos. Variáveis declaradas com Friend podem ser acessadas por todo o programa.

3 – Tipos de Dados

Para organizar como as variáveis gravam informações na memória, foram criados tipos de dados elementares, que podem ser numéricos ou caracteres.

Os tipos de dados numéricos podem ser integrais (números inteiros) e não integrais (números decimais fracionários). Os números inteiros são mais rápidos em processamento que os não integrais.

Para cada tipo de Dados há uma faixa máxima de informações que podem ser gravados, além disso certos tipos de dados podem ser sinalizados ou não sinalizados, isto significa que a faixa de informações podem variar de números negativos até números positivos.

O VB .NET manipula os tipos de dados elementares de duas formas :

  • Tipo Valor – Quando a variável grava os dados dentro da memória. Assim enquadram-se todos os tipos de dados numéricos, Boolean, Char, Date, Estruturas e Enumerações.
  • Tipo Referência – Quando o sistema aponta para um endereço de memória onde está os dados. Assim enquadram-se os tipos de dados String, Matrizes, Classes e Forms (Janelas).

A partir do VB .NET cada tipo de dado listado acima, é implementado como uma estrutura e Classe da tecnologia .NET Framework. Isto significa que cada tipo de dado tem suas próprias funções e métodos internos.

Basta verificar na coluna Common language runtime (CLR) qual classe pertence o tipo de dado elementar.

Exemplo :

Dim strTeste as string

Dim intTeste2 as System.Int32

strTeste.Trim ( )

intTeste2.ToString ( )

No Exemplo acima, foi declarado uma variável do tipo String, e foi invocada a função Trim que remove os espaços em seu conteúdo. Em seguida a variável intTeste2 foi declarada como um tipo de dados Inteiro da classe .NET Framework, invocando a função ToString que converte os dados para string.

Outra forma de declarar variáveis, é forçar a variável para tornar-se de um tipo utilizando os “caracteres de tipo”. Veja a tabela abaixo:

4 – Vida Útil (LifeTime)

Vida útil é o período em que a variável mantém o valor na memória. Dependendo como foi declarada a variável, sua vida útil é igual ao período de tempo que o aplicativo estiver em execução.

Por outro lado, uma variável declarada dentro de um bloco de código, sua vida útil é igual ao tempo que o procedimento estiver em execução. Assim quando o procedimento termina, a variável finda sua vida útil e a memória é limpa e fica disponível novamente ao Sistema Operacional.

Quando uma variável é declarada com a palavra chave Shared, sua vida útil é extendida até quando o aplicativo estiver em uso.

Quando uma variável é declarada com a palavra chave Static, sua vida útil é extendida entre procedimentos que estiver em uso.

5 – Escopo

O Escopo de uma variável é a seção de um aplicativo que pode ver e manipular uma variável. Deste modo, uma variável declarada em um procedimento, só pode ser manipulada nesse procedimento, as outras seções ou blocos de código não podem ver nem manipular essa variável.

O Escopo tem esses níveis :

Escopo de Bloco – A variável fica disponível somente no bloco de código em que foi declarada.

Escopo de Procedimento – A variável fica disponível somente no procedimento que foi declarada.

Escopo de Módulo – A variável fica disponível para todo o código do módulo, classe ou estrutura que foi declarada.

Escopo de EspaçoNomeado (NameSpace) – A variável fica disponível para todo o código desse Espaço Nomeado.

6 – Acessibilidade

Acessibilidade é a permissão que uma variável poderá ser acessada ou manipulada. Para definir sua acessibilidade usa-se as palavras chaves : Public, Private, Friend, Protected, Protected Friend.

Pode-se criar uma variável com escopo de Módulo, mas declarada com private, e nenhum outro bloco de código poderá ver e manipular essa variável.

7 – Nomes Ambíguos

Quando se declara elementos, o Compilador do VB procura a referência a este nome na declaração.

Se houver mais de um elemento com o mesmo nome, o Compilador utiliza o elemento que estiver no mesmo Escopo. Exemplo :

Module Mod1

Public Sub Perform() " A palavra Chave Public permite acesso de outros procedimentos.

" ...

End Module

Module Mod2

Public Sub Perform() " Pode ser diferente do cálculo executado em Perform( ) do Mod1.

" ...

Perform() " Chama somente Perform( ) do Mod2 que é o modulo ativo (mesmo escopo).

Mod1.Perform() " Chama Perfomr( ) do Mod1.

End Module

Module Mod3

" ...

Mod1.Perform() " Chama Perform( ) do Mod1.

Perform() " Chama Perform( ) que é um nome ambíguo e portanto gera um erro.

End Module

O Exemplo acima usa 3 Módulos, Mod1, Mod2 e Mod3. O módulo Mod1 possui um procedimento declarado como Público chamado Perform( ) e portanto está disponível para acesso por outros procedimentos. O módulo Mod2 possui outro procedimento declarado como Público também chamado Perform( ), também disponível para acesso por todos os outros procedimentos. E finalmente o módulo Mod3 que não possui nenhum procedimento declarado.

Note que tanto Mod1 quanto Mod2 têm um mesmo nome de procedimento Perform( ) (Nome ambíguo). Quando Mod2 chama esse procedimento, o compilador procura o elemento declarado no mesmo Escopo, isto é Perform( ) declarado no módulo ativo Mod2. Em seguida, quando Mod2 utiliza Perform( ) declarado em Mod1, utiliza uma descrição mais completa do lugar, informando ao compilador onde deverá procurar a referência do elemento. Neste caso houve uma qualificação do nome, e portanto não gera erros de execução.

Quando Mod3 utiliza Perform( ) declarado em Mod1, utiliza uma descrição mais completa do lugar onde o compilador deverá procurar a referência do elemento.

Quando Mod3 utiliza Perform( ) sem qualificar seu nome, o compilador encontra o procedimento em Mod1 e Mod2 portanto não sabe qual utilizar, gerando erro de execução.

No VB .NET há formas de tratar elementos ambíguos, utilizando a técnica de ocultar elementos, também conhecido como Shadow. Com Shadow um elemento fica ocultado de outro elemento com mesmo nome além de não ficar disponível.

Há duas formas de usar a técnica de ocultar elementos.

  1. Shadowing através do Escopo – No penúltimo exemplo, o procedimento Perform( ) de Mod2, ocultou o procedimento Perform( ) de Mod1, pois o compilador obedeceu a regra de Escopo.

Outro Exemplo :

Module Mod3

Public Num As Integer " Variável a nível de módulo.

Sub Show()

Dim Num As Integer " Variável Local

Num = 2 "Variável Local agora tem o valor 2.

MsgBox(CStr(Mod3.Num)) " Exibe o número 0.

End Sub

Sub UseModuleLevelNum()

Num = 1 " Atribui 1 à Mod3.Num

" ...

Show() " Chama Show, que exibe o valor da Variável de módulo Num, que agora é 1

End Sub

End Module

No exemplo acima, Mod3 tem uma variável a nível de módulo Num, e dois procedimentos Show( ) e UseModuleLevelNum( ). No procedimento Show( ) foi declarada uma variável local ambígua a Num.

Quando o procedimento Show( ) é acionado, o compilador usa a variável local declarada dentro deste procedimento, ou seja no mesmo escopo do procedimento ativo, portanto a variável local oculta (shadows) a variável de módulo. Portanto, no exemplo acima, para fazer referência a variável em shadow é preciso qualificar o seu nome, como Mod3.Num em MsgBox(CStr(Mod3.Num)).

Quando o procedimento UseModuleLevelNum( ) é acionado, o compilador usa a variável a nível de módulo, pois não há nomes ambíguos dentro desse procedimento.

  1. Shadowing através de Herança – Quando uma classe é derivada de outra, pode-se ocultar (Shadow) o elemento ambíguo existente na classe básica, utilizando a palavra chave Shadow. Não se deve confundir Shadow (Ocultar) com Override (Substituir), que será discutido mais tarde.

Exemplo :

Public Class BaseCls

Public Z As Integer = 100 " Elemento a ser ocultado (Shadowed).

End Class

Public Class DervCls

Inherits BaseCls

Public Shadows Z As String = "*" " O Elemento para ocultar o anterior

End Class

Public Class UseClasses

Dim BObj As BaseCls = New DervCls() " DervCls deriva de BaseCls.

Dim DObj As DervCls = New DervCls() " Acessa através da classe derivada.

Public Sub ShowZ()

MsgBox("Classe básica: " & BObj.Z) " exibe o número 100.

MsgBox("Classe derivada: " & DObj.Z) " exibe a string "*".

End Sub

End Class

No exemplo acima, há três classes : BaseCLS que é classe básica e DervCLS que é a classe derivada, e finalmente a Classe UseClasses que utiliza as duas primeiras. A classe básica possui uma variável numérica pública Z que pode ser acessada por todos os códigos que utilizam essa classe. A Classe Derivada possui outra variável Z string mas configurada com a palavra chave Shadows que oculta a variável numérica da classe básica.

UseClasses faz referência as duas classes básica e derivada que muda o valor de cada variável. Note que a referência de BObj é BaseCls por isso a variável numérica é utilizada pelo compilador, enquanto que DObj, a variável string é utilizada pelo compilador.

No caso de DObj, o elemento String ocultou (Shadowed) o elemento numérico.

Paulo Cesar Macedo

Paulo Cesar Macedo