Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila VB
Apostila VB
Net
Autor:
Paulo Cesar Macedo
O pacote Visual Studio .NET substitui e aposenta o Visual Studio 6.0 e anteriores, assim como o
Visual Basic .NET substitui e aposenta o VB 6.0, 5.0 e 4.0. O VB .NET faz parte do pacote Visual
Studio .NET.
Agora, o Visual Basic 7.0 ou Visual Basic .NET (pronuncia-se DOT NET) pode ser usado para criar
qualquer aplicativo Windows Cliente, Servidor, Internet, no precisando usar nenhuma outra
ferramenta.
O Visual Basic s trabalha com a Tecnologia .NET e de agora em diante qualquer aplicativo criado
com o Visual Basic .NET GERENCIADA e no mais interpretada ou nativa (VB 6.0), alm disso,
utiliza novos recursos de desenvolvimento procedentes do C++.
O Visual Basic uma ferramenta denominada pela Microsoft de RAD Rapid Application
Development que possibilita a criao de aplicativos rapidamente sem preocupar-se com os detalhes
da programao Windows, portanto uma ferramenta de alta produtividade.
O Visual Basic a combinao de trs componentes :
Visual o componente que usado para criar a Interface Grfica de Usurio (GUI), assim voc
usa os objetos pr-construdos para criar a sua tela. Se no fosse por intermdio desse componente,
voc seria obrigado a digitar linhas e mais linhas de cdigo para desenhar uma simples janela,
alm de utilizar as centenas de funes API do Windows. O ambiente visual conhecido como IDE
(integrated Development Enviroment) que possui um kit de ferramentas para o desenvolvimento.
Basic a linguagem Basic criada em 1964, adicionado de Mtodos, Funes, Comandos,
Propriedades e Eventos. Tudo isso foi herdado do Ambiente grfico do Windows.
Plataforma .NET um conjunto de centenas de classes e objetos pr-construdos pela Microsoft
para serem utilizados na codificao do aplicativo, alm disso possui vrios arquivos distribudos a
serem compilados junto com o aplicativo.
O VS vem originalmente em 4 verses Academic, Professional, Enterprise Developer e Enterprise
Architect, sendo que a ltima a verso mais completa.
Enterprise Architect
Enterprise
Professional
Academic
3
Processador
Developer
Mesmo
Mesmo
Mesmo
Mesmo
mesmo
Mesmo
mesmo
Mesmo
mesmo
Recomendado
Recomendado
Mesmo
mesmo
Mesmo
mesmo
Para o programador VB a fase mais importante das descritas acima o Modelo de Deesenvolvimento
(Model Development) que o intermedirio entre o Modelo de Negcios e os Modelos do Usurio,
Lgico e Tecnolgico.
1 - O Modelo de desenvolvimento
O modelo de desenvolvimento envolve trs etapas :
O Desenho Conceitual ir considerar o perfil do usurio, isto quem o usurio e como ele ir
trabalhar com o sistema, alm disso o perfil do usurio engloba sua funo ou cargo.
O desenho conceitual tambm deve considerar o cenrio atual em uso, isto quantos usurios
utilizam o sistema atual e as situaes de uso.
E finalmente o desenho conceitual deve considerar o cenrio proposto para o uso, isto quantos
usurios devero utilizar o novo sistema e as situaes de uso.
2 O Desenho Lgico
Para criar o desenho lgico preciso seguir os passos abaixo :
1.
2.
3.
4.
5.
Uma entidade que representa os modelos lgicos ou fsicos chamado de business object (Objeto
de Negcio, ou Objeto comercial), isto representar as situaes ou funes de uma empresa em
um objeto no sistema. Um business object pode retratar :
Contas
Clientes
Vendas
Faturas
O desenvolvimento do software ir implementar esses objetos para criar seus membros tais como
propriedades e mtodos para interagirem com outros objetos. Para identificar um business object
necessrio determinar os nomes dos cenrios em uso e os verbos dos cenrios em uso.
Os nomes dos cenrios podem ser determinados pelos diversos departamentos ou sees que iro
utilizar o aplicativo, e serve como base para identificar os verbos para compor o objeto.
Os verbos podem ser indicados pelos termos Possui ou Tem; Usa; Contm ou Guarda ou Consiste;
um exemplo de ou um.
5
3 O Desenho Fsico
Para criar o desenho Fsico a partir do Desenho Lgico preciso seguir estes passos :
Definir o tipo de servio aos componentes Cria os componentes a partir dos objetos lgicos
j definidos e determina se cada objeto um usurio, um negcio ou um objeto de servios de
dados.
Distribuir o componente na rede Definir o local do componente na rede.
Refinar a distribuio dos componentes Agrupar os componentes de acordo com as
necessidades do sistema.
Definir os membros do componente Define o relacionamento entre os componentes.
Validar o desenho fsico Certificar que cada componente corresponde ao servio no objeto
lgico.
Um desenho lgico bem efetuado vai ter um impacto positivo na criao do desenho Fsico. A forma
de medir o impacto do desenho lgico no desenho fsico observar se as consideraes abaixo
podem ser alcanadas.
Performance (Desempenho)
Maintainability (Manutenciabilidade)
Extensibility (Extensibilidade)
Scalability (Escalabilidade)
Availability (Disponibilidade)
Security (Segurana)
Performance
A performance (desempenho) a velocidade e a eficincia que o sistema executa as tarefas. O
desempenho tem que ser considerado pelo ponto de vista dos recursos do sistema, isto o total de
recursos que o sistema utiliza para executar a tarefa. E do ponto de vista do usurio, isto o tempo
gasto que o sistema utiliza para executar a tarefa.
Entretanto necessrio ter um ponto de equilbrio entre o desempenho e outras consideraes em
relao ao software, pois o cdigo que incrementa a performance pode afetar outros aspectos do
sistema.
Maintainability
O sistema que permite uma boa manuteno, isto reviso do cdigo fonte pelos programadores,
aquele que evita um longo trabalho de reviso e a participao de usurios no processo.
O sistema pode centralizar todos os componentes em um nico lugar de forma a substituir o
componente debilitado pelo componente corrigido. Outro caso seria dividir os componentes em
pequenos pedaos de forma a isolar o problema em reas especficas
O ideal dividir os componentes em pequenos pedaos de cdigo e centraliz-los em um nico
lugar, assim um sistema cliente servidor pode centralizar os pedaos dos componentes no servidor e
permitir que a manuteno seja feita no prprio servidor sem a participao do usurio no processo.
Extensibility
Scalability
A escalabilidade a capacidade que um sistema possui de mudar de um ambiente de pouca utilizao
para um ambiente de intensa utilizao do sistema sem afetar suas funcionalidades. O ambiente de
intensa utilizao pode envolver :
rea local
Rede
Internet
INtranet
Security
A segurana de um aplicativo est voltado a formas de evitar acessos externos e total controle da
administrao do sistema. Para melhor segurana o sistema deve estar centralizado em um nico
lugar para melhor administrao e evitar acessos externos.
Descrio
Janela para aplicativos Desktop.
Arquivo de cdigo para classes
Arquivo que agrupa funes
Uma classe de componentes.
Controle para aplicativos
Uma janela de dados
Arquivo DataSet para criar esquemas XML
Arquivo XML
Arquivo para criar Esquemas de documentos XML.
Arquivo de cdigo
Classe para criar controles para aplicativos Windows.
Pgina HTML que inclui cdigo.
Janela baseada em outra janela existente.
Classe para criar um controle servidor ASP.NET.
Novo controle baseado em um controle existente.
Classe para criar Servios Windows.
Classe baseada em componente COM
Classe para usar componentes transacionais.
Arquivo de texto
Arquivo HTML que possui vrias pginas HTML.
Arquivo usado para transformar documentos XML
Arquivo estilo planilha para definies HTML
Classe para ser chamada em processos de instalao.
Um relatrio Crystal Report
Arquivo bitmap.
Cursor padro
cone padro
Arquivo usado para armazenar recursos para o aplicativo
Arquivo que contm informaes do Assembly.
Arquivo usado para configuraes do aplicativo.
8
Arquivo JScript
.js
Arquivo VBScript
.vbs
Windows Script Host .wsf
Extenso
Descrio
2 arquivos: .aspx Uma janela WEB.
.vb
Web Service
2 arquivos: .asmx Componente que troca mensagens usando os protocolos
.vb
padres HTTP, XML, XSD, SOAP e WSDL.
Class
.vb
Arquivo de classe.
Modulo (Visual Basic) .vb
Arquivo que agrupa funes
Component Class
.vb
Classe de componentes
Data Form Wizard
.aspx (.vb para Uma janela de dados para aplicativos WEB.
projetos locais)
DataSet
.xsd
Arquivo para esquemas XML usando DAtaSet
Web User Control
.ascx
Controle servidor ASP.NET
Pgina HTML
.htm
Pgina HTML que inclui cdigo
Frameset
.htm
Um pagina HTMP que inclui vrias pginas HTML.
Style Sheet
.css
Arquivo estilo planilha usado para definies HTML
Arquivo XML
.xml
Arquivo XML .
Esquema XML
.xsd
Arquivo esquema para documentos XML.
Arquivo XSLT
.xslt
Arquivo usado para transformar documetnos XML
Web Custom Control .vb
Controle ASP.NET server.
Arquivo de cdigo
.vb
Arquivo de cdigo
Dynamic Discovery .vsdisco
Arquivo baseado em XML usado para descobrir o caminho
Document
do servidor WEB.
Static Discovery
.disco
Arquivo de mecanismo de procura para servidores XML
WEB.
Global Application
.asax
Arquivo para manipular eventos ASP.NET
Class
Web Configuration
.config
Arquivo de configurao para aplicativos WEB
Texto
.txt
Arquivo de texto
Installer Class
.vb
Classe chamada em processos de instalao..
Crystal Report
.rpt
Arquivo Crystal Report
Bitmap
.bmp
Imagem Bitmap
Cursor
.cur
Cursor Padro
Icon File
.ico
cone padro
Assembly Resource .resx
Arquivo de recursos utilizado pelo aplicativo
File
Assembly Information .vb
Informaes gerais do assembly
File
JScript File
.js
Cdigo JScript
VBScript File
.vbs
Cdigo VBScript
Windows Script Host .wsf
Arquivo para Windows scripting..
9
Em verses anteriores do VB, as janelas tinham extenses .frm, os controles tinham extenses .ctr, as
classes tinham a extenso .cls.
Ainda hoje, os arquivos do Vb podem ser abertos por qualquer programa de texto e podem ser
alterados diretamente sem usar o Ambiente de Desenvolvimento do Visual Studio.
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
No exemplo acima, O VS .net criou o prottipo central para ser modificado, contendo uma janela
Form1 que possui o cdigo inicial da janela Sub New que o construtor da janela onde colocado o
cdigo de inicializao da janela que substitui o antigo evento Initialize do VB 6.0.
Resumindo, quando a janela carregada na tela, o primeiro procedimento a ser executado ser o
cdigo dentro de Sub New, tambm conhecido como Construtor (proveniente da linguagem C++).
InitializeComponent( ) criado automaticamente pelo VStudio e substitui o antigo arquivo .frm que
era criado pelo VB 6, onde continha todo as propriedades e cdigos fonte da janela em formato de
Texto.
Resumindo, InitializeComponent( ) grava todas os controles, textos, figuras e outras coisas que
forem feitas na janela.
O comando inherits na primeira linha do exemplo acima herda todas as caractersticas de uma janela
normal. Assim pode-se alterar suas propriedades na janela de propriedades do VB.
Resumindo, para criar uma janela preciso acionar a classe Windows Form da tecnologia .NET
Framework.
11
3. Concatenao : Para combinar duas variveis Strings, utilize o operador de concatenao &.
Exemplo :
Var1 = "10.01"
Var2 = 11
Result = Var1 + Var2 ' Result = 21.01
Result = Var1 & Var2 ' Result = 10.0111
No use o operador + para concatenar duas string, pois pode gerar erros. Observe os
resultados do exemplo acima.
4. Operador de acesso ( . ) : O ponto utilizado para acessar funes, mtodos ou propriedades
de uma classe ou objeto. Exemplo : MyForm.Text = "This is my form"
5. Operador de acesso ( ! ) : A exclamao tambm utilizada para acessar mtodos ou
propriedades
somente
de
algumas
classes
ou
estruturas.
Exemplo
:
RS.Fields!CustomerID.Value = txtCustomerID.Text
6. Caracter de declarao de tipos de dados ( ! ) : O ponto de exclamao tambm pode ser
utilizado para declarar variveis do tipo Single. Exemplo : Var = 1234578!
A Microsoft recomenda criar comentrios para cada seo de cdigo dessa forma :
1. Propsito : Inclua esse tpico no comentrio, para identificar qual a descrio ou tarefa do
cdigo em questo.
2. Requisitos : Inclua esse tpico no comentrio, para identificar quais variveis, objetos,
classes e outros elementos utilizados no cdigo em questo.
3. Efeito : Inclua esse tpico para identificar quais variveis, objetos, classes e outros elementos
que sero afetados pelo cdigo em questo.
4. Argumentos : Inc.ua esse tpico para explicar os argumentos exigidos pelo cdigo em
questo.
5. Retorno : Inclua esse tpico para identificar o valor de retorno desse cdigo em questo.
No se pode quebrar linhas em comentrio, utilizando o caracter ( _ ). Pode-se utilizar o comando
REM para ativar comentrios, entretanto esse procedimento requer mais espao em memria que o
smbolo ( ), portanto utilize o smbolo somente.
No VB .NET existem limitaes fsicas, segundo a Microsoft, mas so to altas que no h chances
de serem atingidas pelo desenvolvedor, a ponto de no serem nem documentadas oficialmente.
MeuPas = "BRASIL"
Verso = "8.0.0012"
NmeroPadro = 36
Esse recurso torna fcil ler e administrar o cdigo fonte do desenvolvedor. Note que no possvel
usar esse recurso quando criar Funes, e qualquer cdigo ocultado ou expandido lido
normalmente pelo compilador.
Variveis
Quando nomear variveis que armazenaro dados calculados, finalize o nome com a
identificao do clculo utilizado. Como por exemplo : intSoma, intDiferena, intMax,
intMin,
pode-se utilizar at o nome de funes do VB para criar os nomes. intSum,
intAvg, intIndex, etc...
Use nomes complementares quando forem necessrios na mesma operao, tais como Incio
/ Fim, Mn / Max, Aberto / Fechado. Exemplo : intIncio, intFim, intMn, intMax.
Para nomear variveis utilize o primeira palavra em minsculas e as restantes em
maisculas. Exemplo : documentoFormatoIndexado., ou utilize a notao hngara *.
Para variveis do tipo Boolean pode utilizar a palavra , Esta ( Is) para designar se a varivel
est na condio True ou False. Exemplo : ArquivoEstAberto, ou FileIsOpen
Muitos programadores utilizam a palavra Flag para nomear suas variveis, entretanto
prefervel substituir a palavra Flag por outro nome que descreva melhor a varivel. Exemplo:
ao invs de documentoFlag , use
documentoFormatoIndexado.
Para variveis utilizadas em loops, d nomes simples como i, j, x, etc...
Utilize sempre constantes nomeadas para efetuar loops e outras condies de teste. Como
por exemplo : ao invs de
For i = 1 to 7
utilize For i = 1 to intContadorIndexado,
onde intContadorIndexado uma constante nomeada de valor 7.
* Uma notao especialmente popular a notao hngara. Ela costuma ser usada na programao
em Windows e no OS/2. No caso da notao hngara, pode-se antecer uma varivel String com str,
uma varivel Integer com int , um ponteiro como p, funes com fn, handles com h e assim
por diante. A regra compor o nome da varivel utilizando a abreviao das primeiras letras do
controle, tipo de dados ou uma combinao de suas primeiras letras com um nome de identificao
individual.
A notao hngara foi desenvolvida por um programador da Microsoft chamado Charles Simonyi.
Nos velhos tempos da Microsoft, Charles ficou famoso por dar rasantes de helicpteros nos
piqueniques da empresa.
Tipo do Controle
Prefixo
Exemplo
3D Panel
pnl
pnlGroup
ADO Data
ado
adoBiblio
Animated button
ani
aniMailBox
Check box
chk
chkReadOnly
cbo
cboEnglish
Command button
cmd
cmdExit
Common dialog
dlg
dlgFileOpen
Communications
com
comFax
Controles
ctr
ctrCurrent
Data
dat
datBiblio
15
dbcbo
dbcboLanguage
Data-bound grid
dbgrd
dbgrdQueryResult
dblst
dblstJobType
Data combo
dbc
dbcAuthor
Data grid
dgd
dgdTitles
Data list
dbl
dblPublisher
Data repeater
drp
drpLocation
Date picker
dtp
dtpPublished
dir
dirSource
drv
drvTarget
fil
filSource
fsb
fsbMove
Form
frm
frmEntry
Frame
fra
fraLanguage
Gauge
gau
gauStatus
Graph
gra
graRevenue
Grid
grd
grdPrices
Hierarchical flexgrid
flex
flexOrders
hsb
hsbVolume
Image
img
imgIcon
Image combo
imgcbo
imgcboProduct
ImageList
ils
ilsAllIcons
Label
lbl
lblHelpMessage
lwchk
lwchkArchive
lwcbo
lwcboGerman
lwcmd
lwcmdRemove
Lightweight frame
lwfra
lwfraSaveOptions
lwhsb
lwhsbVolume
lwlst
lwlstCostCenters
lwopt
lwoptIncomeLevel
lwtxt
lwoptStreet
16
lwvsb
lwvsbYear
Line
lin
linVertical
List box
lst
lstPolicyCodes
ListView
lvw
lvwHeadings
MAPI message
mpm
mpmSentMessage
MAPI session
mps
mpsSession
MCI
mci
mciVideo
Menu
mnu
mnuFileOpen
Month view
mvw
mvwPeriod
MS Chart
ch
chSalesbyRegion
MS Flex grid
msg
msgClients
MS Tab
mst
mstFirst
OLE container
ole
oleWorksheet
Option button
opt
optGender
Picture box
pic
picVGA
Picture clip
clp
clpToolbar
ProgressBar
prg
prgLoadFile
Remote Data
rd
rdTitles
RichTextBox
rtf
rtfReport
Shape
shp
shpCircle
Slider
sld
sldScale
Spin
spn
spnPages
StatusBar
sta
staDateTime
SysInfo
sys
sysMonitor
TabStrip
tab
tabOptions
Text box
txt
txtLastName
Timer
tmr
tmrAlarm
Toolbar
tlb
tlbActions
TreeView
tre
treOrganization
UpDown
upd
updDirection
vsb
vsbRate
17
Lista de nomes de Menus onde a regra criar um prefino Mnu + Nome do Menu utilizado :
Menu
Nome do Menu
File Open
mnuFileOpen
mnuFileSendEmail
mnuFileSendFax
Format Character
mnuFormatCharacter
Help Contents
mnuHelpContents
A Microsoft recomenda utilizar uma codificao modular, isto significa que se deve utilizar
variveis, constantes, controles agrupados dentro de um procedimento que execute uma tarefa nica
em um formulrio simples. Por exemplo, para acionar uma caixa de dilogo Abrir, devemos colocar
todas as variveis, controles e flags necessrios agrupados em um nico boto ou menu Abrir que
execute a tarefa de acionar essa Caixa de dilogo, uma vez terminado a execuo da tarefa todas as
variveis e controles so finalizados.
Lista de sugesto de escopo de variveis (esses prefixos eram muito utilizados em verses anteriores
do Visual Basic, entretanto com a nova formulao da linguagem, essa terminologia quase no se usa
mais) :
Escopo
Prefixo
Exemplo
Global
gstrUserName
Module-level
mblnCalcInProgress
Local to procedure
Nenhum
dblVelocity
Para se formar um nome de constante adequadamente, a regra utilizar o prefixo do escopo acima +
o prefixo do tipo de dados + as letras iniciais maisculas do significado/propsito da constante,
exemplo:
gintIdadeDoAluno Varivel global , do tipo de dados inteiro , Idade do aluno
(g + int + Idade Do Aluno)
mstrNomeDoAluno Varivel a nvel de mdulo, do tipo string, Nome do Aluno
(m + str + Nome Do Aluno)
Use os seguintes prefixos para indicar o tipo de dados da varivel (esses prefixos eram muito
utilizados em verses anteriores do Visual Basic, entretanto com a nova formulao da linguagem,
essa terminologia quase no se usa mais):
Tipo de Dado
Prefixo
Exemplo
Boolean
bln
blnFound
Byte
byt
bytRasterData
18
Collection object
col
colWidgets
Decimal
dec
decRevenue
Date (Time)
dtm
dtmStart
Double
dbl
dblTolerance
Error
err
errOrderNum
Integer
int
intQuantity
Long
lng
lngDistance
Object
obj
objCurrent
Single
sng
sngAverage
String
str
strFName
Compound-defined type
cdt
cdtEmployee
Os nomes de variveis de tipos definidos pelo usurio (tipos de dados compostos) podem ser
definidos com o prefixo cdt , assim cdt + nome da varivel / combinao das tres primeiras letras ,
exemplo :
cdtCliUma varivel do tipo de dados composto , Cliente
( cdt + Cli)
Tabelas
Quando nomear tabelas use nomes sempre no singular. Exemplo : ao invs de tabela Alunos
use tabela Aluno.
Quando nomear campos em tabelas, evite repetir o nome da tabela no Campo. Exemplo : ao
invs do nome do Campo AlunoEndereo utilize o nome Endereo.
No utilize o Tipo de Dados do campo para compor o seu nome.
Microsoft SQL Server
Evite o nome com abreviaes, somente use abreviaes quando tiver um significado
consistente.
Quando nomear funes no SQL Server utilize a descrio do valor retornado. Exemplo :
RetorneNomeJanelaAtual( ) .
Os nomes de arquivos, pastas, procedimentos armazenados devem descrever o seu propsito.
Evite reutilizar nomes de funes para variveis ou vice-versa. Exemplo : Funo com nome
ProcessarArquivo( )
Varivel com nome IProcessarArquivo.
Evite utilizar homnimos ou palavras com mesmo fonema . Exemplo Rigth e Write.
Certifique-se que no h erros quando soletrar palavras. Pois algumas palavras possuem
significados diferentes em certas regies do Globo. Exemplo Check e Cheque no tem o
mesmo significado, Color e Colour no tem o mesmo significado.
Evite usar marcaes especiais quando nomear elementos , tais como $ , %. (utilizadas para
string e inteiros repectivamente).
Comentrios
Quando modificar o cdigo fonte, coloque sempre a data da ltima modificao.
No incio de cada rotina, coloque os comentrios no formato Propsito, Descrio,
Parmetros, etc.. .( Ver item 3.5).
19
Evite criar comentrios no final de linha, pois fica mais difcil de ler. Se for imperativo,
coloque com uma tabulao padro para todos os comentrios desse tipo.
Evite asteriscos e outros caracteres para criar o comentrio, utilize somente espaos.
Apague qualquer comentrio improdutivo no cdigo.
Utilize palavras completas no Comentrio, evite portanto abreviaes e smbolos outros.
Crie comentrio para todo o cdigo no bvio.
Explique o que consiste o loop e outros blocos de cdigo.
Formato
Utilize sempre o mesmo tipo de formatao para o cdigo escrito. Isso inclui o tamanho da
letra, o tipo da letra, o espaamento da letra, a cor da letra, etc..
Utilize sempre parnteses , chaves e outros, para agrupar conjuntos de cdigos para a mesma
finalidade. Exempo if (x >5 and x<10) then ...
Crie uma tabulao padro que torne consistente o cdigo para cada bloco dentro de
procedimentos, loops, funes e etc...
Evite combinar muitas linhas de cdigo em uma linha nica , utilizando o separador ( : ).
Exemplo : x = 350 : intContador = 4 : ArquivoEstAberto = true
Quando escrever comandos em SQL, utilize letras maisculas para palavras chaves SQL e
somente iniciais maisculas para Tabelas, colunas e Vises.
Divida um cdigo complexo em pedaos menores, podendo ser em mdulos ou arquivos
separados
Coloque a Clusula SQL separados das linhas de comando para facilitar a leitura e edio do
cdigo. Exemplo :
SELECT FirstName, LastName
FROM Customers
WHERE State = 'WA'
Para declarar elementos para uso no cdigo utiliza-se Comandos de declarao ou Palavras-Chaves.
O elemento declarado fica retido na memria do computador sendo gerenciado diretamente pela
tecnologia .NET Framework.
Os elementos declarados no cdigo podem ser constantes, variveis, objetos, classes, enumeraes,
estruturas, propriedades, mtodos, funes, eventos, interfaces, delegates (delegar).
O VB ignora letras maisculas e minsculas quando se referir a elementos declarados, portanto podese usar MinhaVarivel quanto minhavarivel.
Quando se declara elementos, o processo envolve as seguintes consideraes :
1. Variveis o espao reservado dentro da memria do computador, para ser usado no
programa.
2. Comandos de Declarao So comandos do VB que declaram elementos na memria.
3. Tipo de Dados o tipo de dados fundamental que o elemento dever pertencer.
4. Vida til (LifeTime) o perodo de execuo que o elemento est disponvel para ser
usado.
5. Escopo a extenso que o elemento deve atingir, sem ser declarado novamente.
6. Acessibilidade a forma que o cdigo deve fazer uso do elemento.
7. Nomes Ambguos Quando dois elementos tm o mesmo nome, e como o VB resolve este
problema.
1 Variveis
Uma varivel um espao reservado dentro da memria para armazenar valores desconhecidos.
Diferentemente de um ponteiro que representa o local onde ela est endereada.
Para usar variveis necessrio aplicar os Comandos de Declarao, utilizando as tcnicas de
codificao e programao j explicadas acima. Observe que quando se declara uma varivel , o
compilador reserva um espao na memria para o valor, mas no a cria explicitamente. Para criar
explicitamente uma varivel, preciso declarar a varivel e atribuir um valor.
O comando Option Explicit obriga que todas as variveis sejam declaradas antes do uso.
2 Comandos de Declarao
Os comandos de declarao so Dim e Const. As palavras chaves (Keywords) so 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 no pode ser alterado.
Public I, J, K As Integer ' Declara trs variveis inteiras.
Dim FirstName, MiddleName, LastName As String ' Declara trs variveis string.
Private S, SArray() As Short ' Uma varivel Shor e uma varivel de matriz.
Friend B1, B2 As Byte, C1, C2 As Char ' Duas variveis Byte e duas variveis Char.
O comando Dim semelhante as palavras chaves Private e Public. E pode ser usado em
procedimentos, mdulos, classes , blocos e estruturas, mas s podem ser acessadas no cdigo que
foram declaradas. A diferena entre Private, Public e Dim que as duas primeiras permitem ou no
21
que essa varivel fique disponvel a outros blocos de cdigo, portanto so tambm chamados de
Modificadores de Acesso.
Alguns autores at recomendam no usar o Comando Dim por se tratar de um declarador pouco
expressivo.
A palavra chave Private um modificador de acesso e declara variveis em todos os blocos de
cdigo, e assim como o comando Dim, s podem ser acessadas no cdigo que foram declaradas. E
no podem ser acessadas por outros blocos de cdigo.
A palavra chave Public um modificador de acesso e declara variveis em todos os blocos de
cdigo, e diferentemente de Dim e Private, permitem que outros cdigos exteriores utilizem a
varivel.
A palavra chave Shared um modificador de acesso que declara variveis em classes, e permitem
que outros cdigos acessem essa varivel sem fazer uma referncia a classe.
A palavra chave Static um modificador de acesso e declara variveis em todos os blocos de cdigo
, exceto Classes e Mdulos. Variveis declaradas com Static retm o ltimo valor na memria
mesmo quando o procedimento em que foi declarado encerrado.
O Comando Const declara variveis que no podem ser alteradas, e so utilizadas em todos os blocos
de cdigo, entretanto a varivel constante fica disponvel somente ao cdigo em que foi declarada.
A palavra chave Protected declara variveis somente dentro de Classes. Variveis declaradas com
protected s podem ser acessadas dentro da classe que a declarou ou de classes derivadas.
A palavra chave Friend declara variveis em todos os blocos de cdigo, exceto procedimentos.
Variveis declaradas com Friend podem ser acessadas por todo o programa.
3 Tipos de Dados
Para organizar como as variveis gravam informaes na memria, foram criados tipos de dados
elementares, que podem ser numricos ou caracteres.
Os tipos de dados numricos podem ser integrais (nmeros inteiros) e no integrais (nmeros
decimais fracionrios). Os nmeros inteiros so mais rpidos em processamento que os no
integrais.
Para cada tipo de Dados h uma faixa mxima de informaes que podem ser gravados, alm disso
certos tipos de dados podem ser sinalizados ou no sinalizados, isto significa que a faixa de
informaes podem variar de nmeros negativos at nmeros positivos.
Tipo de Dados
Boolean
Byte
Char
Date
Common language
runtime
System.Boolean
System.Byte
System.Char
System.DateTime
Tamanho em
Bytes
2 bytes
1 byte
2 bytes
8 bytes
Decimal
System.Decimal
16 bytes
Faixa
True ou False
0 255 (no sinalizado).
0 65535 (no sinalizado).
0:00:00 de 1 Janeiro, 0001 11:59:59 da noite de 31
Dezembro, 9999.
0 +/-79,228,162,514,264,337,593,543,950,335 sem
virgula;
0 +/-7.9228162514264337593543950335 com 28
dgitos depois da vrgula; o nmero mais prximo do
zero
22
Double
(double-ponto
flutuante)
System.Double
8 bytes
Integer
Long
(long integer)
Object
Short
Single
(single-ponto
flutuante)
String
System.Int32
System.Int64
4 bytes
8 bytes
System.Object (classe)
System.Int16
System.Single
4 bytes
2 bytes
4 bytes
System.String (class)
Depende do
sistema
Depende do
sistema
User-Defined
Type
(estrutura)
(herda de
System.ValueType)
+/-0.0000000000000000000000000001 (+/-1E-28).
-1.79769313486231570E+308
-4.94065645841246544E-324 negativos; e
4.94065645841246544E-324
1.79769313486231570E+308 positivos.
-2,147,483,648 2,147,483,647.
-9,223,372,036,854,775,808
9,223,372,036,854,775,807.
Qualquer tipo de dados..
-32,768 32,767.
-3.4028235E+38 -1.401298E-45 negativos; e
1.401298E-45 3.4028235E+38 positivos.
0 at 2 bilhes de caracteres Unicode.
Determinado pela faixa de cada tipo de dados usado na
estrutura
Tipo Valor Quando a varivel grava os dados dentro da memria. Assim enquadram-se
todos os tipos de dados numricos, Boolean, Char, Date, Estruturas e Enumeraes.
Tipo Referncia Quando o sistema aponta para um endereo de memria 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 prprias funes e
mtodos 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 varivel do tipo String, e foi invocada a funo Trim que
remove os espaos em seu contedo. Em seguida a varivel intTeste2 foi declarada como um tipo de
dados Inteiro da classe .NET Framework, invocando a funo ToString que converte os dados para
string.
Outra forma de declarar variveis, forar a varivel para tornar-se de um tipo utilizando os
caracteres de tipo. Veja a tabela abaixo:
Caracter de tipo
%
&
@
!
#
$
Double
String
Static X#
Private V$ = "Secret"
Exemplo
I = 347S
J = 347I
K = 347L
H = 347D
Y = 347F
Z = 347R
Q = "."C
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 clculo 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 ambguo e portanto gera um erro.
End Module
O Exemplo acima usa 3 Mdulos, Mod1, Mod2 e Mod3. O mdulo Mod1 possui um procedimento
declarado como Pblico chamado Perform( ) e portanto est disponvel para acesso por outros
procedimentos. O mdulo Mod2 possui outro procedimento declarado como Pblico tambm
chamado Perform( ), tambm disponvel para acesso por todos os outros procedimentos. E
finalmente o mdulo Mod3 que no possui nenhum procedimento declarado.
Note que tanto Mod1 quanto Mod2 tm um mesmo nome de procedimento Perform( ) (Nome
ambguo). Quando Mod2 chama esse procedimento, o compilador procura o elemento declarado no
mesmo Escopo, isto Perform( ) declarado no mdulo ativo Mod2. Em seguida, quando Mod2
utiliza Perform( ) declarado em Mod1, utiliza uma descrio mais completa do lugar, informando ao
compilador onde dever procurar a referncia do elemento. Neste caso houve uma qualificao do
nome, e portanto no gera erros de execuo.
Quando Mod3 utiliza Perform( ) declarado em Mod1, utiliza uma descrio mais completa do lugar
onde o compilador dever procurar a referncia do elemento.
Quando Mod3 utiliza Perform( ) sem qualificar seu nome, o compilador encontra o procedimento em
Mod1 e Mod2 portanto no sabe qual utilizar, gerando erro de execuo.
25
Dim DObj As DervCls = New DervCls() ' Acessa atravs da classe derivada.
Public Sub ShowZ()
MsgBox("Classe bsica: " & BObj.Z) ' exibe o nmero 100.
MsgBox("Classe derivada: " & DObj.Z) ' exibe a string "*".
End Sub
End Class
No exemplo acima, h trs classes : BaseCLS que classe bsica e DervCLS que a classe
derivada, e finalmente a Classe UseClasses que utiliza as duas primeiras. A classe bsica
possui uma varivel numrica pblica Z que pode ser acessada por todos os cdigos que
utilizam essa classe. A Classe Derivada possui outra varivel Z string mas configurada com a
palavra chave Shadows que oculta a varivel numrica da classe bsica.
UseClasses faz referncia as duas classes bsica e derivada que muda o valor de cada
varivel. Note que a referncia de BObj BaseCls por isso a varivel numrica utilizada
pelo compilador, enquanto que DObj, a varivel string utilizada pelo compilador.
No caso de DObj, o elemento String ocultou (Shadowed) o elemento numrico.
27
As variveis do tipo Short podem guardar valores de 16 bits (2 bytes). o menor tipo de dados
numrico disponvel.
As normas aplicadas ao tipo de dados Integer logo abaixo, se aplicam ao tipo de dados Short.
Exemplo :
Dim MeuNmero as short
Dim NossoNmero as int16
MeuNmero = 32767
NossoNmero = 32768 O VB exibe uma mensagem NaM No um nmero
No exemplo acima h duas variveis declaradas do tipo Short (int16 a mesma coisa que Short), a
primeira varivel recebeu o valor mximo 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 compilao Existem erros, deseja continuar?.
2 Usando tipos de dados Integer
Qualquer tipo de dados numrico exige maior processamento do sistema , assim necessrio 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 atribuio de um valor a varivel simples, utilizando apenas o operador de atribuio ( = ) e
nunca utilize separadores de milhares. Qualquer caractere diferente de nmero no ser aceito pelo
VB, gerando erro de Type Mismatch.
VarivelInteger = 1234
Qualquer valor digitado entre aspas ( ) uma string por definio, entretanto o VB ativa uma
interpretao correta para o tipo de dados da varivel. Veja abaixo :
VarivelInteger = 1234
O VB no se incomoda com aspas, j que a varivel do tipo numrica, podendo at efetuar
operaes matemticas corretamente, entretanto se houvesse um caractere diferente de nmero, o
sistema geraria um erro de Type Mismatch. Como no exemplo :
VarivelInteger = 1234A
Pode-se utilizar um separador de precedncia ( ) para atribuir o valor numrico a uma varivel
integer sem alterar a interpretao do VB. Exemplo :
VarivelInteger = (1234)
Embora o parnteses no seja um caractere numrico, ele possui um significado de ativar a
precedncia de primeiro plano em clculos do compilador, pois desta forma no interfere na
interpretao do compilador VB. Entretanto quando se combina aspas + parnteses na atribuio de
um valor numrico, o resultado ligeiramente diferente :
VarivelInteger = (1234)
Msgbox VarivelInteger
28
No exemplo acima, a VarivelInteger ter um valo negativo 1234 exibido na caixa de mensagem
Msgbox. A combinao de aspas e parnteses ( ) troca o sinal de um valor numrico positivo,
transformando-o em negativo. Essa funcionalidade foi inserida neste contexto como simples
curiosidade.
Conclui-se que um parnteses e aspas podem criar uma interpretao diferente no compilador do VB
quando atribuirmos valores a variveis Integer, portanto devemos nos ater sempre as formas mais
simples e corretas de programao, no devemos portanto inventar coisas novas para o sistema
descobrir e que poder levar a resultados imprevisveis.
Uma varivel do tipo Integer, quando no devidamente inicializada com um valor atribudo, tem
como Default o valor zero (0) , assim por exemplo, se um desenvolvedor esquecesse de atribuir um
valor a uma varivel Integer, esse valor seria Zero (0) devido a natureza do tipo de dados Integer,
assim completamente diferente de uma varivel String vazia .
Exemplo :
Dim MeuInteiro as int32 Mesma coisa que Integer
Dim NossoInteiro as integer
MeuInteiro = 1234
NossoInteiro = 1234
Portanto necessrio incluir o sinal # de forma a evitar uma interpretao indevida pelo compilador,
no caso de uma data em string 12/30/2001 o compilador no seria capaz de executar operaes
com datas. Exemplo :
VarivelDate1= 12/30/2001
VarivelDate2 =11/30/2001
MsgBox VarivelDate1 VarivelDate2
O compilador do VB no gera mensagens de erro no caso do exemplo acima, mesmo que as
expresses no estejam devidamente configuradas com o sinal #, entretanto no momento de efetuar
operaes com datas, o erro iminente (Type mismatch).
O exemplo acima seria corretamente configurado quando transformssemos as expresses em datas,
e o resultado final seria 1 mese de diferena entre as datas. Agora o compilador interpreta exatamente
as expresses como datas, permitindo a execuo de operaes.
VarivelDate1= #12/30/2001#
VarivelDate2 =#11/30/2001#
MsgBox VarivelDate1 VarivelDate2
O tipo de dados Date tambm pode receber uma funo intrnseca de data do VB, de forma a retornar
como resultado a data e o horrio do sistema :
VarivelDate = Now
Msgbox VarivelDate
O resultado obtido na caixa de Mensagem ser : 23/11/2001 18:46:13 como exemplo da construo
acima.
Para um clculo envolvendo dias, bastaria acrescentar ou subtrair da expresso data um inteiro
simples, como mostrado abaixo :
VarivelDate = #12/01/2001#
Msgbox (VarivelDate 1 )
31
A mensagem final seria 01/11/2001, pois foi subtrado 1 dia da data originalmente atribuda a
VarivelDate. Deve-se observar, entretanto que para efetuar operaes com datas mais eficiente, usase as funes intrnsecas de datas do VB.
Note sempre que o formato atribudo mm/dd/aa, caso essa regra no for obedecida, o VB trata de
corrigir o erro, invertendo a ordem das datas automaticamente. Entretanto, no se pode esperar um
bom resultado como por exemplo o dia 01/02/2001, o resultado final seria 02/01/2001 ao invs de
01/02/2001.
O VB foi concebido em lngua Inglesa/U.S. , que considera as datas no formato mm/dd/aa,
descartando qualquer possibilidade de formatao diferente, portanto trate sempre de usar essas
regras daqui para frente, de modo a evitar confuses em clculos e atribuies.
O tipo de dados Date quando no devidamente inicializado pelo desenvolvedor, isto no for
atribudo um valor de data, ter como valor Default 00:00:00.
8 Usando o tipo de dados Decimal
Os tipos de dados Decimal so armazenados em nmeros de 128-bit (12-byte) inteiros a potncia de
10, que representa o nmero de casas decimais. Esse tipo de dados, trabalha com nmeros de grande
preciso.
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 endereos de 32-bit (4-byte) dos objetos em referncia. Esse tipo
de dados suficientemente flexvel para fazer referncia a qualquer tipo de objeto reconhecido pelo
sistema. Essa definio de armazenar endereos assemelha-se a um conceito de ponteiros em C++,
guardando suas propores. Exemplo :
Dim objDb As Object
Set objDb = OpenDatabase("c:\Vb5\Biblio.mdb")
A varivel objDb foi declarada explicitamente como um objeto de banco de dados. Note, que a
declarao foi explicitamente genrica com object, de forma a piorar o desempenho do sistema,
como regra geral tente sempre declarar objetos como Classes a que pertencem ( discusso em
captulos posteriores), uma forma de pesquisar a classe a que pertence o objeto o Object Browser.
As variveis do tipo Object podem ser tratadas do Tipo Valor ou do Tipo Referncia j estudadas
anteriormente.
O Valor Nothing usado para desassociar um objeto a varivel. recomendado desassociar (limpar
da memria) todas as variveis Object que no forem mais utilizadas no programa. Exemplo :
Dim brush As System.Drawing.Brush
brush = New System.Drawing.Brush(bmap)
......
brush = Nothing
32
No exemplo acima, foi utilizado uma varivel de objeto que faz referncia a um classe da tecnologia
.NET Framework para criar um instrumento de desenho, em seguida aps o uso, foi desassociado a
varivel do objeto, liberando a memria ao sistema.
captulo posterior). Por outro lado, se fosse atribudo uma expresso 1234B sem aspas, o caractere
no numrico geraria um erro de execuo.
De qualquer forma , sempre necessrio utilizar aspas para atribuirmos strings a variveis string,
como uma forma correta de programao, mesmo que seja expresses com nmeros.
Se uma varivel String no for inicializada, isto , se o desenvolvedor no atribuir nenhuma
expresso a ela, o seu valor ser vazio .
12 Infinity (Infinito) e outros tipos de dados
No VB .NET h dois tipos de dados no numricos mas que so produzidos por clculos numricos.
Infinity Qualquer clculo que gera nmeros infinitos. Por exemplo dividir um inteiro por
zero.
NaN Not a Number (No um Nmero). qualquer resultado que no corresponde a
valores numricos.
Exemplo1 :
Dim dblVar As Double = 999
Dim infVar as Double
infVar = dblVar / 0
msgbox (InfVar)
No exemplo acima, no h formas de dividir nmeros inteiros por zero, portanto o resultado da tela
em msgbox +Infinito. Observe que no h um tipo especfico 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 diviso de 0 / 0 no um nmero, portanto o resultado exibido em
msgbox NaN (No um Nmero). Assim como Infinity, NaN no representado por nenhum
tipo de dados especfico, mas como um recurso da linguagem.
Pode-se usar as funes IsInfinity e IsNaN para testar o resultado de clculos matemticos.
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
34
A funo Val do VB .NET pode ser utilizado para converso de strings. A funo varre toda a string
at encontrar um dgito diferente quando termina o processo convertendo somente os nmeros
encontrados. Exemplo :
Dim m As Integer
m = Val ("142 kilmetros")
MsgBox(m) exibe a mensagem 142
Resumindo : O compilador do VB .NET tem duas regras default:
1. Toda varivel deve ser declarada antes do uso.
2. Toda converso do tipo Narrowing deve ser efetuada com funes de converso
apropriada.
Esse comportamento pode ser alterado desligando o controle de verificao Option Strict Off. Deste
modo todas as variveis podem ser usadas sem declarao anterior e o tipo de converso (Narrowing)
pode ser feito implicitamente, isto sem funes de converso.
A Microsoft recomenda sempre utilizar converses explcitas usando as funes de converso,
para criar um aplicativo de melhor desempenho. Alm disso recomenda sempre utilizar o
comando Option Strict On.
36
O compilador do VB considera alguns valores como default, como por exemplo qualquer valor
numrico desde que no seja muito alto considerado Integer; qualquer valor com dgitos
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 atribuio de valores a constantes ou variveis, basta forar o valor da varivel utilizando os
comandos de tipo de dados. Exemplo :
Dim myDecimal as Decimal
myDecimal = 100000000000000000000 ' Erro de compilao.
No exemplo acima e conforme as definies acima, o valor 100000000000000000000 considerado
Double (default) pelo compilador, e a varivel myDecimal do tipo Decimal. Mesmo que o tipo
Decimal suporte o valor acima descrito, ele no pode aceitar o tipo de dados Double (que muito
maior), portanto o compilador gera um erro. A forma correta de utilizao :
Dim myDecimal as Decimal
myDecimal = 100000000000000000000D ' Ok.
14 Sistema numrico no VB .NET
Muitos nmeros usados em VB so decimais (base 10). Mas pode ocorrer o uso de nmeros
hexadecimais (base 16) ou nmeros octal (base 8). O Visual Basic representa nrs. Decimais com o
prefixo &H e octal com &O.
Decimal
Octal
Hexadecimal
&O11
&H9
15
&O17
&HF
16
&O20
&H10
20
&O24
&H14
255
&O377
&HFF
O computador pode trabalhar com qualquer nmero utilizado pelo sistema, entretanto o nmero
hexadecimal utilizado em certas tarefas, como o sistema de cores, tela e principalmente as APIs do
Windows.
Structure Empregado
Public Nome As String ' Nome do empregado.
Public NomeFamlia As String ' Sobrenome da Famlia.
Public Telefone As Long ' Telefone do empregado.
Private Salrio As Decimal ' Salrio do empregado.
End Structure
No Exemplo acima, a estrutura foi criada com o nome de Empregado e possui variveis pblicas
(Acesso a todos os blocos de cdigo) e privadas (Acesso no permitido a outros blocos de cdigo).
Como opo, pode-se declarar uma estrutura como Public ou Private antes do comando Structure.
Depois de criar uma estrutura, deve-se criar uma varivel e declar-la com o nome dessa estrutura,
em seguida utilize as propriedades e mtodos dessa estrutura. Exemplo
Dim MinhaVarivel as Empregado
...
MinhaVarivel.Nome = Antonio
Para se criar uma matriz pblica, use o comando Public na seo de declarao.
Para se criar uma matriz a nvel de mdulo (module-level) , use o comando Private na seo
de declarao.
Para se criar uma matriz local (procedure-level), use o comando Dim, Static dentro de um
procedimento para declarar uma matriz.
Pode-se utilizar matrizes dentro de classes utilizando os comandos Protected, Friend, Public,
Private e Dim.
As matrizes podem ser declaradas fixando os seus limites mximos com base na faixa do tipo de
dados Long ( -2,147,483,648 at 2,147,483,647). Exemplos :
Dim MeuArray (14) as integer Matriz de 15 elementos
Dim MeuArray (2147483646) Mximo permitido
No exemplo acima, a matriz MeuArray foi declarada com no mximo 14 elementos, entretanto o
limite inferior inclue o Zero (0), que utilizado para efeito de contagem , portanto existe 15 slots
para a matriz. A segunda declarao comporta o mximo de slots possvel.
As matrizes podem ser alocadas automaticamente pelo VB, de modo que o desenvolvedor no
precise determinar o limite mximo :
Dim MeuArray ( ) as integer
faixa mxima do tipo de dados Long. Esse procedimento utilizado, quando o desenvolvedor no
sabe de antemo quais os limites da matriz.
Por outro lado , nos exemplos anteriores, a matriz foi alocada nos limites mximos, de forma que a
matriz resultante conhecida como Matriz Esttica , e s pode ser utilizado quando o desenvolvedor
tiver completa certeza dos limites da matriz a ser utilizada.
As matrizes so classificadas tambm pela quantidade de dimenses a saber :
Matrizes Unidimensionais Que possuem apenas uma dimenso de valores mnimo e mximo .
Como por exemplo :
Dim MeuArray (2) as string
Matriz unidimensional
30
40
50
60
70
80
90
100
110
120
130
140
150
160
170
180
190
200
210
220
230
240
O valor de MeuArray (1,1,1) = 10 ; o valor de MeuArray (2,3,4) = 240 de forma muito simples.
Entretanto o valor de MeuArray (2,3,1) = 60, o valor de MeuArray (1,2,2) = 90. De forma geral temse :
Para se popular uma matriz, usa-se os ndices apropriados juntamente com o tipo de dados
corretamente, a forma recomendada pela Microsoft utilizar um Loop para manipular e popular as
matrizes.
Dim MeuArray (10, 10) as string
For i = 0 to 10
For j = 0 to 10
MeuArray ( i , j ) = Ol & (i + j)
Next j
Next I
39
meu (1,1) =
teu (1,1) = Empty
nosso (1,1) = 0
set vosso (1,1)= nothing
40
A nica forma de reter esses valores , aproveitando os valores antigos j criados, e aumentando
somente os slots para novos dados, utiliza-se o comando Preserve .
Redim Preserve Matrix1 (19 , 29)
De forma geral , esse comando til quando se deseja preparar a matriz para novos dados, mesmo
que este esteja populado com valores anteriormente armazenados por procedimentos anteriores.
Entretanto pode-se mudar apenas o ltimo limite mximo (UBound) da ltima dimenso de uma
matriz multidimensional, se tentarmos mudar um limite inferior (Lbound) ou de outra dimenso, um
erro de run time vai ocorrer.
ReDim Preserve Matrix(19, UBound(Matrix, 2) + 1)
O cdigo acima, pode ser usado, pois acrescenta a ltima dimenso da matriz Matrix um (1) slot a
mais. Note que foi usado a funo UBound para identificar o limite mximo da ltima dimenso (2).
ReDim Preserve Matrix(UBound(Matrix, 1) + 1, 10)
Entretanto o cdigo acima, no pode ser utilizado, pois a tentativa de acrescentar mais um slot para a
primeira dimenso, gera um erro de runtime.
Assim de forma resumida temos :
Pode-se atribuir um contedo de uma matriz para outra, de duas formas : A primeira copia-se slot por
slot de cada matriz e atribui para outra matriz slot por slot, mas mais eficiente utilizar a atribuio (
= ) para copiar uma matriz para outra :
Matriz A = Matriz B Considerando que Matriz B j tenha dados
Obviamente, deve-se obedecer regras para efetuar cpias de variveis, caso contrrio podem gerar
erros de compilao e de run-time :
As matrizes devem ter o mesmo tipo de dados, ou a varivel que receber a cpia seja Object.
As matrizes devem ter o mesmo nmero de dimenses.
Os tipos de elementos de cada matriz devem ser compatveis.
As matrizes s podem ser definidas com Base zero (0), isto inicia-se no zero (0), assim um matriz
do tipo MinhaMatriz(5) possui 6 slots vazios , pois o limite inferior zero.
1 Utilizando Matrizes
Pode-se declarar uma matriz e em seguida atribuir o valor, ou declarar e atribuir (inicializar) o valor
simultaneamente.
Exemplo 1 :
Dim MinhaVarivel ( ) as single Declara uma varivel dinmica com unidimensional
41
Exemplo 2 :
Dim MinhaVarivel ( ) as single = New single ( ) {3456 , 3457 } Declara e inicializa os valores
No exemplo 1, foi criado a matriz MinhaVarivel e atribudo os nmeros separadamente, enquanto
que no exemplo 2 foi criado a matriz MinhaVarivel e atribudo os nmeros simultaneamente.
Observe que no exemplo 2, a matriz inicializada como parte da sua declarao, e portanto deve
seguir as seguintes regras :
Use sempre o sinal de igual ( = ) seguido pela palavra chave New com o tipo de dados da
matriz.
Finalize sempre com chaves { } a atribuio de valores.
Exemplo 3 :
Dim Meu ( ) as Byte = New Byte ( )
Declarao errada pois falta chaves { }
Dim Minha ( ) as Byte = New Byte ( ) { } Declarao correta
No exemplo acima as duas declaraes foram feitas sem valores iniciais, mas somente a segunda
declarao Minha vlida.
Exemplo 4:
Dim Nossa (1,1) as Short
Nossa (0,0) =
Nossa (0,1) =
Nossa (1.0) =
Nossa (1,1) =
(5)
(6)
(7)
(8)
Atribui os valores
Exemplo 5 :
Dim Nossa ( , ) as Short = New Short ( , ) {{5,6},{7,8}} Declara e inicializa uma _
matriz multidimensional
msgbox (Nossa (0,0)) exibe o valor 5
msgbox (Nossa (0,1)) exibe o valor 6
msgbox (Nossa (1,0)) exibe o valor 7 .........
No Exemplo 4 e 5, a matriz Nossa tem duas dimenses de zero at hum, com declaraes e
atribuies vlidas, observe que no exemplo 5 a sintaxe diferente.
Aps a palavra chave New Short, obrigatrio incluir o nmero de vrgulas correspondentes a
declarada na varivel Nossa ( , ). Para atribuir os valores obrigatrio incluir chaves adicionais alm
de vrgulas { {5,6} , {8,8}}.
Exemplo 6 :
42
Dim Tua () () As Byte = {New Byte() {5, 6}, New Byte() {7, 8}}
Msgbox (Tua ( 0 ) ( 0 ) )
Msgbox ( Tua (0) ( 1) )
Msgbox ( Tua ( 1) ( 0) )
Msgbox ( Tua ( 1) (1 ))
exibe o nmero 5
exibe o nmero 6
exibe o nmero 7
exibe o nmero 8
No exemplo 6, foi criado uma matriz contendo outra matriz. Este tipo de tcnica chamado de
matriz no retangular ou recortada (jagged) e est disponvel somente no VB .Net.
A matriz no retangular (matriz de matriz) tem sintaxe diferente de uma matriz multidimensional. No
exemplo 6, a primeira matriz Tua foi inicializada com os valores 5 e 6 , enquanto que a segunda
matriz foi inicializada com 7 e 8.
Assim para utilizar o primeiro elemento da primeira matriz usa-se ( 0 ) e ( 0 ), para utilizar o segundo
elemento da primeira matriz usa-se (0) e (1). Para acessar o ltimo elemento da ltima matriz do
exemplo, usa-se (1) e (1).
Usa-se uma matriz de matriz quando o desenvolvedor deseja combinar matrizes mas no se deseja
criar uma matriz bidimensional.
Exemplo 7
Dim Nmero(1) as integer
Dim Letra(1) as char
Nmero(0) =1 : Nmero(1) = 2
Letra(0) = A : Letra(1) = B
Dim TudoJunto(1) as Object
TudoJunto(0) = Nmero
TudoJunto(1) = Letra
Msgbox (TudoJunto(0)(0))
Msgbox (TudoJunto(0)(1))
Msgbox (TudoJunto(1)(0))
Msgbox (TudoJunto(1)(1))
exibe 1
exibe 2
exibe A
exibe B
No exemplo 7, criou-se uma matriz TudoJunto do tipo Objeto que aceita qualquer tipo de dados do
sistema, alm de duas matrizes de tipos de dados diferentes entre si.
Observe que no foi atribudo valores para TudoJunto, mas sim recebeu como atribuio as outras
matrizes Nmero e Letra. Observe ainda, que este tipo de atribuio diminui o desempenho do
aplicativo.
2 Matriz um elemento da classe System.Array
Como j foi visto nos tpicos anteriores, todo o tipo de dados fundamental uma cpia de classes da
tecnologia .Net Framework. Desta forma, as matrizes tambm herdam os recursos da classe
System.Array, oferecendo seus prprios mtodos.
Exemplo 8 :
43
2.11 Objetos
O VB .Net foi projetado inteiramente para programao orientada a objeto (OOP), e todo o
desenvolvedor ir trabalhar com objetos. Objeto uma pequena parte de cdigo que engloba
funes, propriedades e mtodos num nico lugar, e no pode ser executado sozinho sem um
aplicativo principal. O processo que engloba funes, propriedades e mtodos num nico objeto
chamado de Encapsulamento.
Classes e Objetos
Geralmente os objetos so escritos em forma de arquivos dll, e podem ser utilizados declarando
variveis como referncia a eles. Outro conceito importante a diferena entre Classes e Objetos.
Classes o prottipo de criao dos objetos, isto o cdigo fonte que contm
procedimentos, funes para a criao do Objeto. Cada objeto no VB .Net uma classe,
basta fazer uma referncia no programa para utilizar seus recursos.
Objeto uma cpia, tambm conhecida de instncia, de uma classe. Pode-se utilizar
quantos objetos desejar, uma vez criado a classe . Assim a Toolbox (Barra de ferramentas) do
VB .Net uma coleo de classes, uma vez escolhido um controle e desenhado na janela, esta
classe se transforma em Objeto. As Janelas do VB .Net so classes e quando o aplicativo est
em execuo (Run Time) o compilador cria uma cpia da classe e se transforma em Objeto.
Membro de um objeto, obrigatrio nomear o Objeto, usar um ponto e nomear o nome do Membro
desejado.
Exemplo:
NomeDoObjeto . NomeDoMembro
Text1.Caption = Ol
Para utilizar um Objeto, preciso criar uma instncia (Cpia) da Classe, em seguida basta utilizar os
Membros.
Exemplo:
Dim MeuObjeto as New Class1 ( )
MeuObjeto.Cantar
No Exemplo acima, foi criada uma cpia de uma classe chamada Class1 utilizando a palavra chave
as e New, em seguida utilizou-se do membro Cantar que executa um pseudo procedimento. Observe
que se omitir o comando New , a varivel fica declarada e pronta para receber a cpia de uma classe,
mas efetivamente a varivel no criada e no recebe a atribuio.
Com o comando New, o compilador cria a varivel e atribui a ela a cpia da classe.
Fontes de objetos
Os objetos no VB .Net esto divididos em duas fontes diferentes :
Objetos Internos Objetos internos, tambm conhecidos como intrnsecos ou (Built In), so
os objetos nativos do VB, isto os que acompanham o ambiente de desenvolvimento VB
.Net. So objetos internos os tipos de dados elementares, tais como Integer, Long, String, etc..
No necessrio criar referncias a objetos internos antes de serem usados no aplicativo, mas
para algumas classes necessrio criar instncias (cpias) das classes para utiliz-las.
Objetos Externos So todos os objetos que no acompanham o ambiente de
desenvolvimento. obrigatrio criar uma referncia a estes objetos externos antes de utilizlos. As classes da tecnologia .NET Framework devem ser importadas usando o comando
Imports antes de serem usadas no cdigo.
Com o VB .NET pode-se utilizar Objetos Externos tais como as ferramentas de edio de texto do
Microsoft Word, as frmulas do Microsoft Excel, e tantos outros recursos do Office, Corel, AutoCad
e etc. Para isso basta criar uma referncia a fonte Externa no menu do Visual Studio .NET.
Os objetos Externos e Internos permitem mltiplas aes simultaneamente. Exemplo :
Private Sub UpdateForm()
Button1.Text = "OK"
Button1.Visible = True
Button1.Top = 24
Button1.Left = 100
Button1.Enabled = True
Button1.Refresh()
End Sub
45
With Button1
.Text = "OK"
.Visible = True
.Top = 24
.Left = 100
.Enabled = True
.Refresh()
End With
End Sub
Neste ultimo exemplo, o comando With End With melhora o desempenho do cdigo e torna mais
fcil a leitura do cdigo para outro desenvolvedores.
Janelas (Forms)
As Janelas, tambm conhecidas como Forms, Window, etc, so objetos grficos que fazem a
interface do usurio. No VB .NET as classes definem como as janelas sero exibidas e o que elas
faro. Quando um aplicativo est em execuo e uma janela exibida na tela, o VB .NET cria uma
instncia (cpia) da Classe denominada Form.
Pode-se alterar o comportamento das janelas, ou criar novos procedimentos e mtodos. Por exemplo,
para criar um procedimento (mtodo) para a janela basta escrever o procedimento e declar-lo como
pblico . Exemplo
Public Sub Som( )
Beep
End sub
O Exemplo acima cria um procedimento pblico Som, que pode ser acessado por outras partes do
cdigo. Exemplo :
Dim NovaJanela as Form1
Form1.Som ( )
No exemplo acima, foi criado uma instncia da Janela para acessar o mtodo Som ( ).
2.12 Strings
Strings um tipo de dados elementar que representa uma matriz de caracteres ( tipo de dados Char),
que aceita qualquer expresso desde que estejam entre aspas. Exemplo :
Dim minhaVarivel as String = No sei como
Para usar aspas na criao da string, necessrio criar uma dupla marcao de aspas. Exemplo
Dim minhaVarivel as String = Eu quero usar aspas
Toda string imutvel , isto significa que o seu valor no pode ser alterado uma vez que foi criado.
O que acontece que, qualquer varivel do tipo de dados String um tipo Referncia e portanto
aponta para a memria onde o valor est armazenado, uma vez que o valor alterado por outra
string, essa varivel destruda e criada em seguida com a nova string. Exemplo :
Dim minhaVarivel as String = Eu quero usar aspas
46
O compilador trata o tipo de dados especial Nothing igual a string vazia , entretanto o compilador
no pode fazer operaes com este string. Exemplo :
Dim Minha as string
Dim i as integer
Minha =
Minha = Nothing
i = Minha.Length
string vazia
string vazia
Ocorre um erro de execuo, pois a varivel Minha recebeu Nothing
Pode-se comparar strings utilizado o mtodo Compare da classe String, ou a funo StrComp do
VB. Exemplo :
Dim m as string
Dim n as string
Dim resultado as integer
47
m = Nosso
n = Meu
resultado = String.Compare (m,n )
Esse mtodo retorna um nmero que indica o resultado da comparao, se o nmero for positivo
ento a primeira string (m) maior que a segunda string (n). Se o resultado for negativo, ento a
segunda string (n) maior que a primeira string (m), ao passo que se o resultado for zero, ento as
duas strings so iguais.
possvel procurar Strings dentro da string, utilizando o ndice da matriz ou procurando pela letra na
matriz. Pode-se tambm utilizar as funes InStr do VB. Exemplo :
Dim myString As String = "ABCDE"
Dim myChar As Char
myChar = myString.Chars(3) ' myChar = "D"
Observe que Strings so matrizes de caracteres (Char) e portanto possui ndices, a propriedade Char
usada para retornar a letra da matriz informando o seu ndice. No exemplo acima o ndice 3
corresponde ao caracter D.
Dim myString As String = "ABCDE"
Dim myInteger As Integer
myInteger = myString.IndexOf("D") ' myInteger = 3
No exemplo acima, a propriedade IndexOf utilizada para retornar o nmero do ndice (posio do
caracter no string) com base no caractere informado. O caractere D est na posio 3 (ndice).
possvel concatenar (combinar) duas ou mais strings, utilizando o mtodo Concat ou os operadores
& , + do VB. Exemplo :
Dim aString As String = "A"
Dim bString As String = "B"
Dim cString As String = "C"
Dim dString As String = "D"
Dim myString As String
' myString = "ABCD"
myString = String.Concat(aString, bString, cString, dString)
Uma das funes mais importantes para strings Trim, que remove os espaos no texto. Usa-se a
funo Trim do VB ou o mtodo Trim da classe String para remover os espaos na string. Exemplo :
Dim spaceString As String = _
"
Este texto possui espaos
"
Dim oneString As String
Dim twoString As String
' Remove todos os espaos usando o mtodo da classe String
oneString = spaceString.Trim
' Remove todos os espaos usando a funo do VB
twoString = Trim(spaceString)
48
No exemplo acima, foram utilizados tanto as funes do VB quanto o mtodo da classe String para
remover os espaos. Note que possvel eliminar somente os espaos iniciais com LTrim quanto os
espaos finais com RTrim. Exemplo:
Dim m As String
Dim a As String
m = "&&&&Caco&&&&&"
a = m.Trim("&")
MsgBox(a) mostra a string Caco
Acima, o exemplo demonstra o uso de Trim para remover caracteres especficos na string.
Conclui-se que a tecnologia .NET Framework encapsulou todas as funes do VB em classes,
substituindo algumas e aprimorando outras, de forma a facilitar o trabalho do desenvolvedor.
Entretanto necessrio estudar as classes bsicas para saber como us-las no cdigo, veja as
explicaes no captulo sobre o assunto.
49
As constantes definidas pela linguagem VB, podem ser examinadas no Object Browser do ambiente
de desenvolvimento Visual Studio .NET, veja no captulo referente ao Ambiente de
Desenvolvimento Integrado do Visual Studio.
Exemplo de criao de constantes definidas pelo usurio utilizando constantes pr-definida pelo VB.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs)
Handles Button1.Click
Const Sim = vbYes
Const No = vbNo
MsgBox(Sim & " e " & No) exibe 6 e 7
End Sub
No exemplo acima as duas constantes so Sim e No e foram atribudas os valores de vbYes e vbNo,
respectivamente 6 e 7. Observe que as constantes foram criadas dentro de procedimento local
(Evento clique de um boto), portanto no permitido incluir comandos de declarao como por
exemplo Dim, Public, Private, etc..
Assim como as variveis, as constantes devem ser coagidas a receber alguns tipos de dados de
valores muito altos, dependendo do estado da opo Option Strict, veja a explicao no captulo
Elementos de Dados. Exemplo :
Option Strict Off Opo ligada ento e preciso coagir as constantes a receber os valores
Public Const DefaultInteger = 100 ' Default Integer.
Public Const DefaultDouble = 54.3345612 ' Default Double.
Public Const MyCharacter = "a"C ' Fora a constante a ser do tipo Char.
Public Const MyDate = #01/15/01# ' constant do tipo Date.
Public Const MyTime = #1:15:59 AM# idem acima
Public Const MyLong = 45L ' Fora o tipo de dados Long.
Public Const MySingle = 45.55! ' Fora o tipo de dados Single.
O compilador do VB considera alguns valores como default, como por exemplo qualquer valor
numrico desde que no seja muito alto considerado Integer; qualquer valor com dgitos
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 atribuio de valores a constantes ou variveis, basta forar o valor da varivel utilizando os
comandos de tipo de dados. No exemplo acima, todas as constantes esto declaradas corretamente,
portanto o compilador no gera erros em execuo.
Exemplo :
Dim myDecimal as Decimal
myDecimal = 100000000000000000000 ' Ocorre um erro de execuo.
50
Exemplo :
Public Enum Dias
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
End Enum
Como Default, o valor da primeira constante do Enumerador Dias zero (0), e os valores
subseqentes so incrementados automaticamente com um (1), assim Segunda teria o valor 0, Tera
o valor 1, Quarta o valor 2 e etc. Pode-se ainda, atribuir explicitamente valores as constantes, usando
a operador de atribuio igual ( = ), mas certifique-se em no criar enumeradores com valores do
tipo ponto flutuante.
51
Para um correto uso de enumeradores, utiliza-se a estrutura hierrquica para acessar as constantes,
desta forma evita-se conflitos de referncias, quando h enumeradores com constantes iguais :
Dias . Saturday
Assim como as constantes, os enumeradores podem ser tanto intrnsecos ao VB, isto enumeradores
definidos pelo sistema VB, quanto enumeradores definidos pelo usurio. Por exemplo a funo
MsgBox do VB possui as seguintes enumeraes e constantes definidas pelo sistema :
Enumeraes
Constantes
Descrio
Boto OK somente (default).
OKOnly
vbOKOnly
Botes OK e Cancelar.
OKCancel
vbOKCancel
Botes Anular, Repetir, and Ignorar
AbortRetryIgnore
vbAbortRetryIgnore
Botes Sim, No, e Cancelar.
YesNoCancel
vbYesNoCancel
Botes Sim e No.
YesNo
vbYesNo
Botes Repetir and Cancelar.
RetryCancel
vbRetryCancel
cone de mensagem crtica.
Critical
vbCritical
cone de pergunta
Question
vbQuestion
cone de exclamao
Exclamation
vbExclamation
cone de informao
Information
vbInformation
O primeiro boto o default (default).
DefaultButton1
vbDefaultButton1
O segundo boto o default
DefaultButton2
vbDefaultButton2
O terceiro boto o default
DefaultButton3
vbDefaultButton3
A janela de mensagem modal (default).
ApplicationModal
vbApplicationModal
A janela de mensagem System modal.
SystemModal
vbSystemModal
MsgBoxSetForeground vbMsgBoxSetForeground Janela de mensagem de fundo
Alinhamento de texto a direita
MsgBoxRight
vbMsgBoxRight
Alinhamento da direita para a esquerda
MsgBoxRtlReading
vbMsgBoxRtlReading
(Sistema Hebreu and Arbico).
Ajuda
MsgBoxHelp
vbMsgBoxHelp
Exemplo :
MsgBox ("ol", MsgBoxStyle.Critical + MsgBoxStyle.OKOnly + MsgBoxStyle.SystemModal)
No exemplo acima, foi necessrio nomear a classe MsgBoxStyle a que pertence as enumeraes,
alm disso foi possvel combinar vrias enumeraes para criar a mensagem Ol.
2.14 Operadores
52
Operadores so unidades de cdigo que executam uma operao e retornam elementos como
resultado. Podem ocorrer operaes aritmticas; operaes de concatenao; operaes de
comparao; operaes lgicas.
Os operaes de atribuio e os operadores gerais, entretanto podem no retornar elementos como
resultado, apenas executam operaes gerais.
1. Operadores aritmticos
Considere as variveis abaixo :
Dim X as integer
Dim Y as integer
Dim Z as double
Soma :
Subtrao :
X=4+3
retorna 7
X=43
retorna 1
Y=X
ainda utilizando o exemplo acima X retorna -1 (Muda o sinal)
Multiplicao :
Y = 5 * 5.55 retorna 28 porque Y Integer e arredonda nmeros decimais
Diviso :
Y =4/3
retorna 1 porque Y Integer e arredonda nmeros decimais
Exponenciao :
Y=4^2
retorna 16
Diviso Inteira :
Y = 23 \ 5
retorna 4
A diviso inteira retorna o nmero de vezes que um nmero pode ser divido por outro, no
exemplo acima 23 pode ser dividido por 5 apenas 4 vezes. Em outras palavras, diviso inteira
retorna apenas a parte inteira da diviso.
Mdulo Aritmtico : Y = 5 Mod 2 retorna 1
O mdulo aritmtico retorna apenas o resto da diviso entre dois inteiros.
Z = 100.3 Mod 4.13 retorna 1.18
O mdulo aritmtico retorna apenas o resta da diviso em ponto flutuante se os dois divisores
forem ponto flutuante.
Diviso por Zero :
Pode retornar NaN se for zero.
Pode retornar +Infinito (>0)
Pode retornar Infinito (<0)
2. Operadores de Comparao
Esses operadores comparam duas expresses e retornam um valor Boolean como resultado.
Comparao entre nmeros :
Igualdade ( = ) :
23 = 23
Diferena (<>) :
23 <> 23
Maior que (>) :
23 > 2
Menor que (< ) :
23 < 2
Menor ou igual (<=) 23 <= 23
Maior ou igual (>=) 23 >= 23
retorna True
retorna False
retorna True
retorna False
retorna True
retorna True
retorna True
53
73 = 73
aaa > aa
retorna True
retorna True
No primeiro exemplo o compilador usou um padro de ordem de classificao para comparar duas
strings, o padro especifica que 73 est em ltimo lugar na ordem de classificao ento a
comparao > True. No segundo exemplo, as duas strings tm a mesma ordem de classificao e a
comparao = , portanto o resultado True. No terceiro exemplo, a string aaa tem um prefixo a
mais que aae toda a string maior classificado primeiro que a string menor, logo o resultado
True.
O padro de comparao alterado pelo comando de comparao Option Compare.
Option Compare
O comando Option Compare indica ao compilador o padro para comparar strings. O comando
possui esta sintaxe :
Option Compare Text
Option Compare Binary
Option Compare Binary (Default) O compilador reconhece o ordem de classificao dos caracteres
da seguinte forma :
A < B < E < Z < a < b < e < z < < < < < <
cpia do objeto. O ltimo comando executa um teste comparando o valor de uma com o valor de
outra, em caso afirmativo vai exibir uma mensagem So Iguais.
Dim x As New MyClass()
Dim y As New MyClass()
If x Is y Then
msgbox (So iguais)
end if
No exemplo acima, foram tambm criadas duas variveis que so cpias da classe MyClass ( ),
observe porm que as cpias so do mesmo objeto, isto MyClass, mas as instncias (cpias) so
diferentes. A varivel X criou uma cpia separada do objeto, pois utilizou o comando New, enquanto
que a varivel Y criou outra cpia separada do mesmo objeto, pois tambm utilizou o comando New.
possvel descobrir o tipo do objeto criado utilizando o operador TypeOf...Is. Exemplo :
Dim x As Button
x = New Button()
If TypeOf x Is Control Then
' Continuao do programa.
No exemplo acima, o operador chamado para verificar se a varivel X uma instncia de uma
classe, neste caso o resultado True.
3. Operadores de Concatenao
Os operadores de concatenao juntam duas strings em uma nica string. Dois so os operadores de
concatenao : & , + .
O operador & foi especialmente criado para junes de variveis do tipo string :
Dim X as string = Meu fusca
X = X & Amarelo
O operador + alm de ser um operador aritmtico, tambm pode ser usado para concatenar strings. O
compilador do VB tem comportamentos diferentes quando a opo Option Strict est ligada (on) ou
desligada (off).:
Strict On o compilador utiliza tanto & quanto + para concatenar variveis strings da mesma
forma.
Strict Off o compilador utiliza + para fazer converses implcitas entre diversos tipos,
enquanto que & no pode executar essas converses.
Exemplo :
Dim myNumber As Integer
Dim var1 As String
Dim var2 As Integer
myNumber = 2 + 2 ' Retorna 4.
myNumber = 4257.04 + 98112 ' Retorna 102369.04.
Option Strict On
' inicializa as variveis de diferentes tipos.
55
var1 = "34"
var2 = 6
myNumber = var1 + var2 ' Gera um erro de compilao.
Option Strict Off
Var1 = "34"
Var2 = 6
myNumber = var1 + var2
' Retorna o nmero 40 como resultado da soma aps a
string Var1 ser convertida para nmero. O uso de
Option Strict Off no recomendada.
No ltimo exemplo acima, o operador + faz uma converso implcita de Var1 para integer, e o
resultado final a soma de duas variveis do tipo integer.
4. Operadores Lgicos
Os operadores lgicos comparam duas expresses do tipo verdadeiro ou false e retornam um valor
do tipo Boolean, alm disso, os operadores lgicos tambm podem processar comparaes em
Bitwise que comparam dois valores em formato binrio (base 2).
Os operadores lgicos so : And, Or, AndAlso, OrElse, Xor, Not.
Operaes com Expresses
Dentre os operadores acima, todos trabalham com dois operadores, mas somente Not trabalha com
um operador (unrio). Exemplos
Dim x As Boolean
x = Not 23 > 12 ' x False.
x = Not 23 > 67 ' x True.
No exemplo acima, o operador Not executa uma operao de negao, e simplesmente muda a
forma de avaliao proposta. Assim X no avalia 23 > 2, portanto falso, em seguida X no avalia
23 > 67 ento verdadeiro.
Dim x As Boolean
x = 23 > 12 And 12 > 4 ' x = True
x = 12 > 23 And 12 > 4 ' x = False
Acima, o operador And executa uma operao de juno entre duas expresses, e retorna
verdadeiro se todas as expresses forem verdadeiras. Se todas as expresses forem falsas, o resultado
falso. Se uma delas for verdadeira e outra false, ainda assim o resultado falso.
Dim x As Boolean
x = 23 > 12 Or 4 > 12` ' x = True
x = 23 > 45 Or 4 > 12 ' x = False
O operador Or acima, executa uma operao de disjuno entre duas expresses, Se ambas as
expresses forem verdadeiras o resultado True. Se ambas as expresses forem false, o resultado
false. Mas se uma das expresses forem verdadeiras, ento o resultado True.
Dim x As Boolean
56
Dim x As Integer
x = 3 or 5 ' x = 7
No exemplo acima, o compilador transforma os nmeros em binrio e executa uma comparao em
bitwise com o operador Or a seguir :
011 3 em decimal
101 5 em decimal
111 O resultado em formato binrio.
Convertendo para o formato decimal, 111 o formato binrio do nmero 7, ento x = 7
Dim x As Integer
x = 3 Xor 5 ' x = 6
No exemplo acima, o compilador transforma os nmeros em binrio e executa uma comparao em
bitwise com o operador XOr a seguir :
011 3 em decimal
101 5 em decimal
110 O resultado em formato binrio.
Convertendo para o formato decimal, 110 o formato binrio do nmero 6, ento x = 6
Dim x As Integer
x = Not 5 ' x = -6
No exemplo acima, o compilador transforma os nmero em binrio e executa uma comparao em
bitwise com o operador Not, que inverte a ordem dos bits incluindo o sinal, por isso o resultado -6.
Resumindo : As operaes em Bitwise s podem ser efetuadas com tipos de dados Integer. Os outros
tipos de dados devem ser convertidos obrigatoriamente para Integer.
5. Operadores de atribuio
Os operadores de atribuio executam a tarefa de pegar um valor a direita do operador e atribu-lo a
varivel a esquerda do operador. Os valores de atribuio podem ser outras variveis, expresses,
funes, entretanto todas devem obedecer as formas de converso j estudadas.
Operador =
Usado para atribuir um valor a uma varivel ou propriedade. Exemplo :
myInt = 42
Operador ^=
Usado para elevar o valor da varivel potncia definida a direita do operador, e atribui o resultado a
varivel. Exemplo :
Dim var1 As Integer = 10
Dim var2 As Integer = 3
var1 ^= var2 ' O valor de var1 agora 1000.
Observe que o operador substitui a expresso var1 = 10 ^ 3. Essa a forma mais eficiente para
efetuar clculos.
58
Operador *=
Usado para multiplicar o valor da varivel pelo valor definido a direita do operador, e atribui o
resultado a varivel. Exemplo :
Dim var1 As Integer = 10
Dim var2 As Integer = 3
var1 *= var2 ' O valor de var1 agora 30.
Observe que o operador substitui a expresso var1 = 10 * 3. Essa a forma mais eficiente para
efetuar clculos.
Operador /=
Divide o valor da varivel pelo valor definido a direita do operador, e atribui o resultado a varivel.
Exemplo :
Dim var1 As Integer = 12
Dim var2 As Integer = 3
var1 /= var2 ' O valor de var1 4.
O operador substitui a expresso var1 = 12 / 3. a forma mais eficiente para efetuar esse clculo.
Operador \=
Usado para dividir os inteiros da varivel pelo valor definido a direita do operador, e atribui o
resultado a varivel. Exemplo :
Dim var1 As Integer = 10
Dim var2 As Integer = 3
var1 \= var2 ' O valor agora de var1 3.
O operador substitui a expresso var1 = 10 \ 3. a forma mais eficiente para efetuar esse clculo.
Operador +=
Adiciona o valor definido a direita do operador a varivel. Alm disso concatena a string definida a
direita do operador a varivel string. Todos os resultados obtidos so atribudos a varivel. Exemplo :
Dim var1 As Integer = 10
Dim var2 As Integer = 3
var1 += var2 ' O valor agora da var1 13.
' Este exemplo usa variveis string.
Dim var1 As String = "10"
Dim var2 As String = "3"
var1 += var2 ' O string agora da varivel var1 "103".
O operador substitui as expresses var1 = 10 + 3, e var1 = 10 & 3. So as formas mais eficientes
para executar essas operaes. As converses devem obedecer o comportamento de acordo com a
opo Option Strict.
Operador -=
Usado para subtrair o valor definido a direita do operador da varivel, e atribui o resultado a varivel.
Exemplo :
Dim var1 As Integer = 10
59
possvel alterar a ordem de precedncia dentro de uma expresso, utilizando parnteses entre os
membros da expresso. Exemplo :
x = ((4 +2) ^2) (5 * 3) x retorna 21
x = 4 + (2 ^ 2) - (5 * 3) x retorna -7
Todos os procedimentos Sub so iniciados com o comando Sub e finalizados com End Sub. Alm
disso podem ser precedidos por qualquer comando de declarao Public, Private, Protected, Friend e
Protected Friend. Observe que qualquer procedimento Sub declarado como Public por Default,
quando no h comandos de declarao explcitos. Exemplo:
Sub ChamarOPerador ( )
procedimento Pblico por default
Dim dataChamada As Date
' Stamp is local to TellOperator.
dataChamada = TimeOfDay() ' funo que retorna o dia hora atual.
' Usa a classe MessageBox do espao nomeado System.Windows.Forms
MessageBox.Show("Iniciando a chamada s " & CStr(dataChamada))
End Sub
No exemplo acima o procedimento Sub ChamarOperador exibe uma mensagem do horrio atual da
chamada, e apesar de exibir a mensagem Iniciando a chamada s XX:XX:XX no retorna nenhum
valor.
Para utilizar o procedimento ChamarOperador de um cdigo qualquer, basta fazer referncia ao
nome do procedimento finalizando com parnteses ( ). Como alternativa pode-se usar a palavra
chave Call. Exemplo :
62
End Sub
No exemplo acima o procedimento sub chamado no evento clicar de um boto de comando.
Os procedimentos de Manipulao de Eventos ou simplesmente Eventos so cdigos dentro de
manipuladores de eventos que executam aes em resposta a eventos invocados pelo usurio ou pelo
prprio sistema, como por exemplo o evento clicar sobre um boto de comando como no cdigo
acima. Os procedimentos de Eventos sero estudados no captulo Visual Basic e a programao
orientada a objeto.
Todos os procedimentos em Funo so iniciados com o comando Function e finalizados com End
Function. Alm disso podem ser precedidos por qualquer comando de declarao Public, Private,
Protected, Friend e Protected Friend e devem obrigatoriamente retornar um tipo de dados ou objeto.
Todas as funes so Public por default, quando no h comandos de declarao explcitos.
Alm disso o cdigo da funo executada automaticamente at encontrar os comandos Exit
Function, Return ou End Function. Exemplo:
Exit Function Finaliza uma funo sem antes ter atingido o final das instrues.
Return Palavra chave que retorna um valor para o cdigo de chamada (Calling Code).
End Function Comando para finalizar a funo normalmente.
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click
Dim Nmero as integer
Nmero = Somar2e2 ( )
Msgbox (Nmero)
End Sub
No exemplo acima, a funo Somar2e2 demonstra uma funo, muito simples e totalmente sem
propsito, como retornar valores integer para o cdigo de chamada.
63
Conforme o fragmento acima, a regra principal para utilizar uma funo igualar os tipos de dados,
se a varivel do caso acima for Integer e a funo TotalArquivosTexto retornar um valor numrico
integer, o objetivo foi alcanado.
H duas formas de se retornar valores para o cdigo de chamada :
NomeDaFuno = ValorRetornado Faz com que o controle do processamento no saia da
funo at encontrar os comandos Exit Function ou End Function. Isto significa que quando o
valor da funo retornada com esse esquema, o controle no repassado para o cdigo
chamador at que a funo encontre o comando Exit Function ou End Function.
No exemplo anterior, se o desenvolvedor utilizasse Soma2e2 = (a + b) para a funo, o
controle do sistema atribuiria 4 para o evento a varivel Nmero do evento Click, mas
voltaria a funo at encontrar os comandos Exit Function ou End Function, e em seguida
retornaria ao evento Click quando exibiria a mensagem.
No exemplo abaixo demonstrado o esquema geral para usar funes, com esse tipo de valor
retornado.
Funes Intrnsecas So as funes includas no VB, assim com : Sqr, Cos, Chr, e esto
includas no espao nomeado Microsoft.VisualBasic.
Funes Extrnsecas So as funes personalizadas criadas pelo desenvolvedor.
65
Se dois ou mais mdulos possurem funes ou procedimentos com o mesmo nome, necessrio
excepcionalmente nestes casos, utilizar a estrutura hierrquica (nomear o mdulo) onde esto
localizadas. Exemplo :
Module2.TocarArquivosSom
Os procedimentos Property so comandos que manipulam propriedades de classes, mdulos ou
objetos. Para definir procedimentos Property utiliza-se os comandos Property e End Property
combinado com as palavras chaves Get e Set para determinar se as propriedades so somente leitura
ou leitura-gravao.
Class MinhaClasse
' Varivel local para armazenar o valor de uma propriedade.
Private ValorDaPropriedade As String
' Cria e define a propriedade.
Public Property Propriedade1() As String
Get
' Get chamado quando a propriedade retorna
' Isto quando algum cdigo de chamada tenta ler o valor dessa propriedade
Return ValorDaPropriedade
End Get
Set (ByVal Valor As String)
' Set chamado quando o valor da propriedade modificada
' O valor a ser atribudo passado no argumento Valor
ValorDaPropriedade = Valor
End Set
End Property
End Class
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Dim m As New MinhaClasse()
m.Propriedade1 = "caco"
MsgBox(m.Propriedade1)
End Sub
O exemplo acima, resume todas as tarefas necessrias para criar propriedades em uma classe
chamada MinhaClasse. Observe que a regra geral sempre criar variveis locais para guardar os
valores das propriedades e utilizar as palavras chaves Get e Set para tornar as propriedades LeituraGravao. Em seguida o evento clique de um boto de comando criar uma instncia (uma cpia) da
classe MinhaClasse e manipula a propriedade do objeto criado. Os procedimentos Procedures sero
estudados no captulo VB e a programao orientada a objeto.
1. Argumentos em procedimentos
Algumas funes e procedimentos podem necessitar de informaes adicionais para executarem suas
tarefas, essas informaes so enviadas pelo cdigo de chamada e podem ser variveis; constantes;
expresses e objetos. Cada valor passado para o procedimento chamado de argumento. Exemplo :
66
No exemplo acima, a funo Somar possui dois argumentos Nmero1 e Nmero2 que so utilizados
no clculo da soma dos valores. Cada argumento deve ser explicitamente declarado com um tipo de
dados, alm disso podem haver vrios argumentos em conjunto. A forma correta para a funo acima
seria :
Private Function Somar (ByVal Nmero1 as integer, ByVal Nmero2 as Integer) as Integer
Return (Nmero1 + Nmero2)
End Function
H duas formas de passar argumentos para funes ou procedimentos :
Os argumento ByVal, so ponteiros de dados, e no valores de dados , isto implica dizer que no h
como mudar um valor se o VB no tem acesso ao contedo da memria, somente o endereo. Ao
passo que, argumento por referncia, o VB tem acesso ao contedo da memria no endereo
especfico, assim qualquer alterao do valor dessa varivel, afetar o contedo da memria e
conseqentemente a varivel original ser alterada permanentemente.
O compilador do VB no trata os tipos de dados dos parmetros da mesma forma entre ByVal e
ByRef. Veja o quadro abaixo :
Elementos variveis (ByRef)
Variveis gerais, incluindo variveis de objeto
Campos ou propriedades (de classes)
Matrizes
Estruturas
Assim os argumentos por Valor so considerados elementos no variveis, pois no podem ser
alterados pela funo ou procedimento, portanto o compilador trata os tipos de variveis como
constantes, literais, enumeradores e expresses.
67
Observe que ByVal no permite alterar os prprios valores, entretanto possvel alterar os membros
do objeto que ele aponta. Por exemplo, possvel alterar, mas no atribuir uma nova matriz para um
argumento matriz. Exemplo:
Public Sub Increase (ByVal A() As Long)
Dim J As Integer
For J = 0 To UBound(A)
A(J) = A(J) + 1
Next J
End Sub
' ...
Public Sub Replace(ByVal A() As Long)
Dim J As Integer
Dim K() As Long = {100, 200, 300}
A=K
For J = 0 To UBound(A)
A(J) = A(J) + 1
Next J
End Sub
' ...
Dim N() As Long = {10, 20, 30, 40}
Increase(N)
' N agora 11, 21, 31, and 41. Porque N no foi substitudo por novos valore apenas alterado
Replace(N)
' N() ainda 11, 21, 31, and 41. Pois N foi passado por Valor
' O procedimento Replace no pode modificar a varivel criando uma nova matriz a varivel
'Quando Replace cria uma matriz K e atribui valores para ela, a referncia a N( ) perdida.
'Assim quando ocorrem mudanas em A ( ) somente K ( ) afetado.
No exemplo acima, o procedimento Increase alterou os elementos da matriz (membros), enquanto
que Replace tenta alterar a prpria matriz, substituindo por outra.
Quando um argumento varivel do tipo objeto passado por Referncia, pode-se atribuir um novo
objeto a esse argumento e a alterao tambm se refletir no cdigo chamador. Assim no exemplo
acima, se Replace utilizasse argumentos por Referncia, e K ( ) fosse atribuda a N ( ), os valores
teriam sido os seguintes:
' N() agora seria 101, 201, and 301. Porque N foi passado por ByRef
' Replace tambm modificaria N e tambm atribuiria uma nova matriz para ele.
A tabela a seguir resume toda a explicao acima :
Tipo do elemento
Tipo Valor (Contm
somente um valor)
Tipo Referncia (contm
um ponteiro para a classe
ou estrutura)
ByVal
O procedimento no pode mudar
o valor nem seus membros.
O procedimento no pode mudar
a varivel mas pode mudar os
membros da instncia (cpia)
que ele aponta)
ByRef
O procedimento pode mudar o valor e
seus membros.
O procedimento pode mudar tanto a
varivel como os membros da instncia
que ele aponta)
O compilador VB pode forar o uso de argumentos ByRef em ByVal atravs do cdigo Chamador,
incluindo os argumentos entre parnteses. Exemplo :
68
No exemplo acima foi criado um procedimento chamado StudentInfo com 3 argumentos. Para o
cdigo chamador, basta preencher os argumentos e separ-los com vrgula para cada posio.
Observe porm que em um dos cdigos foi omitido o parmetro Age pois foi definido no
procedimento original como Opcional (Optional). O parmetro omitido deve ser seguido por vrgula
normalmente.
Para passar argumentos por nome, basta nomear os argumentos seguidos por dois pontos e igual ( :=
) e atribuir os valores. Exemplo :
StudentInfo(Age:=19, Birth:=#21 Sep 1981#, Name:="Mary")
Observe que no preciso obedecer as posies dos argumentos quando se passar argumentos por
nome. Alm disso pode-se combinar argumentos por nome e por posio como no exemplo abaixo :
StudentInfo("Mary", Birth:=#21 Sep 1981#)
Note ainda que no preciso incluir vrgulas no argumento omitido, pois os argumentos por nome j
indicam ao compilador que um dos argumentos opcionais devem ser omitidos. Outra observao
69
importante que, uma vez um argumento fornecido por nome, todos os argumentos posteriores
devem ser fornecidos por nome.
Resumidamente, as regras para forneceder parmetros so :
Para fornecer parmetros por posio inclua vrgulas entre os parmetros obedecendo sempre
a ordem dos parmetros.
Para fornecer parmetros por Nome inclua vrgulas entre os parmetros, nomeie os
parmetros e digite : = (dois pontos e vrgula). No preciso obedecer a ordem dos
parmetros.
S possvel omitir os parmetros quando o procedimento original definir o parmetro como
Optional. Alm disso, os parmetros omitidos devem ser seguidos de vrgula, exceto quando
fornecer parmetros por Nome.
possvel fornecer tanto parmetros por Nome e por posio no mesmo procedimento,
entretanto uma vez fornecido um parmetro por Nome, todos os outros parmetros devem ser
informados por nome.
No possvel fornecer parmetros Matriz por Nome.
70
Um procedimento s pode ter uma matriz de parmetros, e deve ser sempre o ltimo
argumento de um conjunto de argumentos.
Toda matriz de parmetros sempre passado por valor. Use sempre a palavra chave ByVal.
O cdigo dentro do procedimento deve trabalhar a matriz de parmetros como uma matriz
unidimensional.
Todos as matrizes de parmetros so automaticamente opcionais por default.
Todos os argumentos antes da matriz de argumentos no podem ser opcionais (Optional). A
matriz de parmetros deve ser o nico argumento opcional.
O cdigo de chamada pode omitir um argumento do tipo matriz de argumentos, alm disso
possvel enviar a palavra chave Nothing como argumento que tem o mesmo efeito.
Pode-se enviar no cdigo chamador uma lista indefinida de elementos para a matriz.
Pode-se enviar no cdigo chamador uma matriz diretamente como argumento desde que seja
do mesmo tipo.
A palavra-chave ParamArray deve utilizar mais recursos do sistema em comparao a uma funo
construda com nmero definido de argumentos, pois tratando-se de colees ou matrizes, o VB tem
um trabalho maior em manipular essas estruturas.
5. Procedimentos recursivos
Um procedimento chamado de recursivo quando ele chama a si prprio. Recurso uma tcnica
caracterstica de linguagens avanadas que permite que um cdigo dentro de um procedimento
chame o prprio procedimento. Exemplo :
Function Factorial(ByVal N As Integer) As Integer
If N <= 1 Then
.
Return 1
Else
Return Factorial(N - 1) * N
71
End If
End Function
O exemplo acima cria uma funo que calcula o fatorial de um nmero, a simplicidade do cdigo
est na linha Return Factorial (N 1) * N que chama o prprio procedimento.
Para utilizar recurso preciso colocar o nome do procedimento em seguida incluir parnteses,
mesmo que o procedimento no utilize argumentos, caso contrrio o compilador entende que a
funo termina neste ponto e retorna um valor qualquer.
preciso certificar-se que os procedimentos recursivos no iro causar erro de falta de espao em
memria, por utilizar indefinidamente a recurso. Alm disso possvel substituir normalmente
loops por recurso.
6. Sobrecarregando procedimentos (Overloading)
Sobrecarregar um procedimento ou Overloading significa utilizar um nico procedimento com
vrios tipos diferentes de argumentos ou verses. J foi visto anteriormente que um procedimento
pode ser definido com vrios argumentos, entretanto com a sobrecarga possvel utilizar esse mesmo
procedimento utilizando uma lista de argumentos diferentes, sem precisar criar novos procedimentos
para argumento novo.
Overloads Sub Z(ByVal X As Byte, ByVal Y As Double)
' Overload 1.
Overloads Sub Z(ByVal X As Short, ByVal Y As Single, ByVal Z as Double) ' Overload 2.
Overloads Sub Z(ByVal X As Integer, ByVal Y As Single, Byval Z as Decimal) ' Overload 3.
No exemplo acima, h um nico procedimento Z implementado com verses contendo uma lista de
argumentos diferentes. Para criar um overloading necessrio seguir as regras abaixo :
Exemplo :
Overloads Sub Z(ByVal X As Byte, Optional ByVal Y As Double)
' Overload 1.
Overloads Sub Z(ByVal X As Short, ByVal Y As Single) ' Overload 2.
No exemplo acima, Overloading no permitido pois somente o modificador de argumento
(Optional) diferente entre as duas verses e conforme as regras acima, somente permitido
Overloading quando os argumentos forem diferentes pelo tipo de dados ou pela ordem.
Utilizando a palavra chave Overloads e o nome de um procedimento, define-se vrias verses desse
procedimento.
72
Exemplo :
Sub P (ByVal D As Date, ByVal ParamArray C() As Char)
' O procedimento anterior equivalente as seguintes verses sobrecarregadas:
' Overloads Sub P (ByVal D As Date, ByVal C() As Char)
' Overloads Sub P (ByVal D As Date)
' Overloads Sub P (ByVal D As Date, ByVal C As Char)
' Overloads Sub P (ByVal D As Date, ByVal C1 As Char, ByVal C2 As Char)
' Pode-se prosseguir adicionando um argumento Char para cada verso sobrecarregada.
No exemplo acima, h um procedimento P definido com parmetros D e uma matriz de Parmetros
C. Para simplificar o procedimento, foi feito uma sobrecarga em 4 ou mais verses deste
procedimento, isto possvel porque um parmetro do tipo matriz de dados e outro parmetro foi
criado sem matriz.
Descrio
Adiciona itens a coleo.
Retorna o nmero de itens da coleo. Somente-leitura.
Retorna um item pelo ndice ou pela chave (identificao nica)
Apaga um item da coleo pelo ndice ou pela chave.
Essas propriedades e mtodos da interface de um objeto Collection, permitem utilizar todos os seus
servios.
Uma chave (Key) um valor em String, que um nome de identificao para o elemento.
Um ndice (Index) um nmero Long que vai de 1 (hum) at o nmero de elementos do
Collection.
A Microsoft recomenda utilizar uma estrutura For eachNext, para interagir com uma collection,
(ver estruturas de controle e deciso).
73
Collection tambm se beneficia de um mtodo Default em sua interface, pois Collection realmente
um objeto. O mtodo Default do objeto Collection Item, assim para retornar o valor de um item,
usa-se :
Set woCurrent = colWorkOrders(3)
ou
Set woCurrent = colWorkOrders("W017493")
necessrio ter em mente que quando apagamos ou adicionamos novos membros a coleo, o VB
automaticamente ajusta os ndices de cada membro, alterando-o. A Microsoft recomenda utilizar o
Key (identificao) para retornar valores de uma collection, para evitar confuso entre ndices
alterados.
Como Collection um conjunto de objetos relacionados e todos possuem sua interface, possvel
manipular suas propriedades e mtodos atravs do mtodo Item do objeto Collection. No exemplo
abaixo, utilizou-se a uma propriedade chamada Prioridade do item W017493 da coleo
colWorkOrders :
colWorkOrders.Item("W017493").Prioridade = 3
colWorkOrders("W017493").Prioridade = 3
Observa-se que os dois fragmentos de cdigo utilizam o mtodo Item da coleo para alterar a
propriedade Prioridade, sem que fosse declarado uma varivel com Set, conforme foi visto na sintaxe
no incio do tpico. Isso foi possvel, pois apenas uma propriedade do objeto em questo foi alterado,
no havendo a obrigao de criar uma varivel somente para essa tarefa.
Entretanto, mais vivel por questes de velocidade a utilizao de uma varivel altamente tipificada
para receber a cpia de uma coleo, e em seguida manipularmos as propriedades e mtodos do
membro da coleo :
Dim Meu as colWorkOrders
Meu(W017493).Prioridade = 3
A varivel Meu foi declarada implicitamente como um objeto colWorkOrders, e o VB interpreta uma
varivel de objeto mais rapidamente que Collection, pois este ltimo armazena os seus itens como
Object (Veja explicao acima) tornando-os muito lentos para acesso e manipulao.
A varivel Meu apenas uma cpia de colWorkOrders j totalmente carregada na memria,
permitindo ao VB acessar os elementos dessa coleo de forma mais simples possvel. Enquanto que
se acessarmos a Coleo colWorkOrders diretamente , sem intermediao da varivel Meu, o VB
seria obrigado a acessar os itens dessa coleo ativando o mecanismo de leitura de tipos de dados
Object que exige muito mais processamento e memria.
O VB possui colees pr-construdas no ambiente para uso do desenvolvedor. As colees so
cpias da classe System.Collections da plataforma .Net Framework.
75
cdigo na estrutura Try... Catch... Finally que o compilador intercepta o erro e permite que o
desenvolvedor crie um procedimento capaz de resolver o problema.
Qualquer cdigo dentro dessa estrutura inicia a execuo em Try, se no houver nenhuma incidncia
de excees (erros ) o VB vai diretamente para o comando Finally at o final do procedimento. Ao
passo que quando h excees o VB vai diretamente para o comando Catch (se houver) e ento
prossegue at o comando Finally ( se houver ) at o final, isto End Try. Portanto o bloco de
cdigo em Finally ser sempre o ltimo a ser executado.
O procedimento escrito dentro do bloco Catch dever ser criado para interceptar e corrigir o erro
gerado por um cdigo em particular, alm disso o bloco Catch permite especificar o tipo de exceo
(erro) que a estrutura dever interceptar e corrigir.
Se o tipo de erro em Catch no for especificado, esse bloco de cdigo ir interceptar todo e qualquer
tipo de erro gerado pelo cdigo em questo, neste caso quando o cdigo em Catch no foi projetado
para interceptar e corrigir esse tipo de erro, o Visual Studio exibe uma mensagem de erro
normalmente.
Public Sub Teste()
Dim x As Integer = 5
Dim y As Integer = 0
Try ' Estrutura para interceptar o erro.
x /= y ' Erro de "Diviso por zero".
Catch ex As Exception When y = 0 ' Intercepta o tipo de erro y = 0.
MsgBox(ex.toString) ' Mostra uma mensagem de erro amigvel ao usurio.
Finally
Beep() ' Beep aps o processamento completo.
End Try
End Sub
O exemplo acima demonstra o uso da estrutura Try, Catch, Finally que intercepta somente o erro de
diviso por zero. O cdigo que gerou o erro est em Try x /= y pois y = 0 , em seguida o comando
Catch intercepta o erro quando y = 0, observe que ex uma varivel qualquer que recebe o tipo de
erro retornado pelas classe de exceo do .Net Framework.
Dim DataQualquer As Object ' Varivel que recebe informaes de data/hora.
Dim PrximoSculo As Date
Try
PrximoSculo = DateAdd("yyyy", 100, DataQualquer)
Catch DeuPau As System.ArgumentException
Msgbox (Pelo menos um argumento tem um valor invlido)
Catch DeuPau As ArgumentOutOfRangeException
Msgbox (O resultado maior que 32 de Dezembro de 9999)
Catch DeuPau As InvalidCastException
Msgbox (A varivel DataQualquer no possui dados do tipo Data/Hora )
Catch
Msgbox (Ocorreu uma exceo desconhecida)
Finally
Msgbox (O erro foi avisado com sucesso)
End Try
O exemplo acima um fragmento de cdigo que aps receber uma data e horrio em DataQualquer
testa a adio de 100 anos para o valor original. Se o valor resultante ultrapassar o limite de data do
77
Do
comandos
Loop Until condio
Exemplos :
Do While InStr(position, longstring, target)
position = InStr(position, longstring, target)_
+1
count = count + 1
Loop
For i = 0 To Screen.FontCount
Print Screen.Fonts(i)
Next
For Each MyTableDef In objDb.TableDefs()
List1.AddItem MyTableDef.Name
Next MyTableDef
78
A estrutura For ... Next, usa um contador com incrementos variados, utilizando a palavra chave Step.
For i =1 to 14 Step 2
Next I
No antepenltimo exemplo, a estrutura For Next usa um objeto global Screen.FontCount como
contador (propriedade FontCount), enquanto que no penltimo exemplo a estrutra For Each... In...,
ligeiramente diferente, pois usado para colees de objetos, e tem a seguinte estrutura :
For Each elemento In grupo
comandos
Next element
Elemento pode ser um controle qualquer que faz parte de uma coleo e muito til quando o
desenvolvedor no sabe o nmero exato de elementos de uma coleo ou matriz. Entretanto
necessrio seguir algumas regras no uso dessa estrutura especfica :
Dentro de colees, o elemento no pode ser uma varivel objeto, ou uma varivel de objeto
genrica ou um objeto listado no Object Browser.
Para as matrizes, o elemento no pode ser uma varivel Objeto.
No se pode utilizar essa estrutura com uma matriz do tipo composta definidos pelo usurio
pois um Objeto no pode conter um tipo definido pelo usurio.
O comando Exit usado para finalizar um loop, um comando de deciso, um procedimento ou uma
funo bruscamente. A nica preocupao combinar o comando Exit com a estrutura utilizada.
For contador = incio To final [Step incremenot]
[comandos]
[Exit For]
[comando]
Next [contador[, contador] [,...]]
Do [{While | Until} condio]
[comandos]
[Exit Do]
[comandos]
Loop
Private Function Somar ( )
[Comandos]
Exit Function
[Comandos]
End Function
Private Sub Form1_Load ( )
[Comandos]
Exit Sub
[Comandos]
End Sub
79
As estruturas acima listadas podem trabalhar dentro de outras, essa caracterstica especial chamada
de estruturas aninhadas (A Microsoft utiliza o termo Nested), formando um conjunto de loops e
decises coexistentes, obedecendo nveis segundo a construo do bloco de cdigo. A indentao de
cdigo (tabulao das linhas) necessrio para tornar o cdigo mais legvel e de fcil identificao
dos nveis.
O fragmento de cdigo abaixo , apresenta uma estrutura aninhada , com indentao de linhas, cujo
primeiro nvel uma estrutura de loop, o segundo nvel uma estrutura de deciso e o terceiro e
ltimo nvel (mais profundo) tambm uma estrutura de deciso :
For i = 0 To frmVCR.Controls.Count - 1
If TypeOf frmVCR.Controls(i) Is Shape Then
If frmVCR.Controls(i).Name = MyControl Then
frmVCR.Controls(i).Visible = True
Else
frmVCR.Controls(i).Visible = False
End If
End If
Next
No VB, ainda h a estrutura WithEnd With que permite executar referncias repetidas a um
nico objeto, em outras palavras ao invs de repetir o mesmo nome do objeto ao usar sua interface
basta apenas colocar os cdigos do objeto dentro da estrutura With....End With precedidos com
ponto ( .) .
MeuLabel.Height = 2000
MeuLabel.Width = 2000
MeuLabel.Text = Este o meu Label
With MeuLabel
.Height = 2000
.Width = 2000
.Text = "Este o meu Label"
End With
Observe no cdigo acima que o controle Label MeuLabel foi invocado trs vezes para atribuir
valores para as propriedades Height, Width e Text respectivamente, enquanto que no cdigo seguinte
o mesmo controle foi invocado apenas uma vez na estrutura With...End With.
Alm de economizar tempo de digitao a Microsoft recomenda utilizar sempre esta estrutura para
criar um cdigo de alto desempenho e eficincia.
O Comando Exit usado em qualquer estrutura de controle, loop ou procedimento e permite
encerrar o cdigo imediatamente aps Exit.
Exit Select
Exit Try
Exit Do
Exit While
Exit For
Exit Sub
Exit Function
Exit Property
80
Exemplo :
Do Until y = -1
If x < 0 Then Exit Do
x = Sqrt(x)
If y > 0 Then Exit Do
y=y+3
If z = 0 Then Exit Do
z=x/z
Loop
O cdigo acima demonstra um loop com uma estrutura aninhada* que encerrada quando os
valores de x, y e z so zero. Observe que Exit completamente diferente de End, pois Exit transfere
o controle do sistema diretamente ao procedimento chamador (quando houver), ao passo que End
finaliza completamente a execuo do programa.
*Estrutura aninhada uma tcnica que consiste em criar comandos de deciso ou de desvios
dentro de outros comandos de deciso ou desvios, utilizando indentao de linhas.
Sub DemonstraoDoExit()
Dim I, MyNum As Integer
Do ' loop infinito
For I = 1 To 1000 ' Loop de 1000 vezes
MyNum = Int(Rnd * 1000) ' Cria um nmero aleatrio.
Select Case MyNum ' Avalia o nmero.
Case 7: Exit For ' se 7, exit For...Next.
Case 29: Exit Do ' se 29, exit Do...Loop.
Case 54: Exit Sub ' se 54, exit Sub procedure.
End Select
Next I
Loop
End Sub
No exemplo acima, o cdigo em DemonstraoDoExit utiliza Exit em diversas estruturas aninhadas,
observe a sintaxe de Exit para cada situao.
Alm das estruturas acima, h comandos e palavras chaves que tambm executam desvios de fluxo
do programa:
Comando GoTo : Desvia o fluxo do programa para uma linha nomeada dentro do procedimento.
Exemplo :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
GoTo LInhaDois
MsgBox("Nunca vai passar aqui")
LinhaDois:
MsgBox("entou na linha dois e fecha o procedimento")
End Sub
End Class
81
No exemplo acima o evento clique de um boto utiliza o comando GoTo para desviar o fluxo do
procedimento para uma linha nomeada LinhaDois e exibir a mensagem entrou na linha dois e
fecha o procedimento. Observe que a sintaxe do comando sempre GoTo NomeDaLinha, em
seguida preciso criar uma linha nomeada com dois pontos ( : ), no possvel utilizar indentao
em linhas nomeadas.
O comando GoTo cria cdigos difceis de ler e de serem revisados, portanto no utilize esse tipo de
comando no aplicativo.
Comando On Error : Permite desviar o fluxo do programa para uma linha nomeada que trata erros
de execuo do cdigo. O comando On Error especialmente til para interceptar e tratar erros de
execuo, quando um procedimento aciona um erro o programa desviado automaticamente para o
procedimento que trata o tipo de erro especfico.
Public Sub IniciarMatriz(Var1, Var2, Var3, Var4)
On Error GoTo ErrorHandler
' Cdigo qualquer que gera um erro
Exit Sub
ErrorHandler:
' Cdigo qualquer que intercepta o erro
Resume Next
End Sub
O exemplo acima IniciarMatriz disponibiliza uma manipulao de erro atravs do comando Goto
ErrorHandler, note que ErrorHandler o nome de uma linha nomeada no cdigo. Dentro da linha
nomeada deve ser escrito o cdigo que trata do erro especfico. Observe que sempre ao utilizar uma
linha nomeada preciso incluir o comando Exit Sub ou Exit Function antes da linha nomeada, para
evitar que o fluxo do programa processe os comandos da linha nomeada.
H dois momentos em um procedimento que manipula erros :
1. Disponibilizado (Enabled) Todo procedimento possui um manipulador de erro
disponibilizado quando o desenvolvedor coloca o comando de desvio Goto NomeDaLinha.
Significa que o manipulador de evento est ligado.
2. Ativo (Active) Quando ocorre um erro e o procedimento que trata do erro j est
processando os comandos. Portanto j ocorreu o desvio do fluxo do aplicativo e o sistema j
est processando o cdigo que trata o erro.
Alm disso o comando On Error pode ser combinado com os comandos :
Resume Next Faz com que a execuo do cdigo continue com o comando
imediatamente posterior ao comando que gerou o erro ( prefervel do que GoTo).
GoTo Desvia o fluxo do programa para uma linha nomeada que contm o cdigo
que trata o erro.
GoTo 0 Desliga o manipulador de erro para esse procedimento.
Goto 1 - Desliga as excees para esse procedimento.
On Error Goto ErrorHandler ' Disponibiliza a rotina de erro do procedimento
On Error Goto 0 ' Desliga a interceptao de erro.
On Error Resume Next ' Continua com os comandos aps o erro.
Comando End : Finaliza imediatamente a execuo do aplicativo.
Sub Form_Load()
82
Dim A as integer = 2
Dim B as integer = 2
Dim C as integer = 2
Msgbox (Microsoft.VisualBasic.Switch(A<2,Letra A < 2, B=2, Letra B = 2, C<3, Letra C<3))
Valor Impresso : Letra B = 2
A lista de argumentos da funo Switch consiste de pares de expresses e valores. As expresses so
avaliadas medida que aparecem na lista da esquerda para a direita e retornado o valor associado
primeira expresso para avaliar True. No exemplo acima as expresses so comparaes entre A,
B,C e os valores retornados so os string do tipo Letra A < 2.
Mtodo Call : Transfere o controle do aplicativo para um procedimento, Funo ou DLL definido
aps o mtodo Call.
Call ExibirJanela( )
Call Shell("C:\Windows\calc.exe", AppWinStyle.NormalFocus)
Comandos Property, Function, Sub : Comandos usados para declarar blocos de cdigo como
propriedades, funes e procedimentos Sub respectivamente. O controle do fluxo do programa
desviado para o cdigo entre a estrutura Property... End Property, Function .... End Function,
Sub ... End Sub.
3. Polimorfismo (Polymorphism) - a habilidade que uma classe deve possuir para permitir
que um mesmo nome de propriedade no importa que tipo de dados seja, execute diferentes
tarefas. Portanto no preciso criar vrios mtodos ou propriedades diferentes para criar
tarefas diferentes, basta utilizar a habilidade polimrfica para usar um nico nome de mtodo
ou propriedade com implementaes diferentes.
O polimorfismo utiliza trs tcnicas para criar membros com o mesmo nome :
A varivel FS foi declarada para receber um objeto do tipo texto, alm disso uma cpia da classe
FileStream da plataforma .NET Framework.
A tcnica para criar um objeto Early Bound declarar um objeto de um tipo especfico tambm
conhecido como criar um objeto Totalmente qualificado. Um objeto totalmente qualificado deve ter
a sintaxe : EspaoNomeado.NomeDaClasse.NomeDoObjeto, que semelhante ao caminho de
arquivo de Texto (C:/Meus Documentos/MeuTexto.txt).
Exemplo de um processo late bound :
DIM XLAPP AS OBJECT
DIM XLBOOK AS OBJECT
DIM XLSHEET AS OBJECT
XLAPP = CREATEOBJECT("EXCEL.APPLICATION")
'UMA CPIA LATE BIND DE UMA ARQUIVO DO EXCEL
XLBOOK = XLAPP.WORKBOOKS.ADD
UAM CPIA 'LATE BIND DE UMA PLANILHA DO EXCEL.
XLSHEET = XLBOOK.WORKSHEETS(1)
XLSHEET.ACTIVATE()
XLSHEET.APPLICATION.VISIBLE = TRUE ' MOSTRA O APLICATIVO
' COLOCA ALGUM TEXTO NA SEGUNDA LINHA DA PLANILHA
XLSHEET.CELLS(2, 2) = "ESTA A COLUNA B LINHA 2"
No exemplo acima, foram criadas 3 variveis do tipo Object que aceitam qualquer tipo de dados do
sistema. Em seguida foram atribudos instncias de uma automao do Excel, arquivo, planilha e etc.
Observe que as variveis no foram declaradas de um tipo especfico de dados ou classes, mas com
um tipo de dados genrico como o tipo Object.
O compilador precisa descobrir qual o tipo de dados do objeto e fazer uma referncia na memria
para esse objeto recm criado.
86
If TypeOf Ctrl Is Button Then Testa se uma varivel Objeto do tipo Boto de Comando
MsgBox("Esse controle um boto.")
End If
Observe com ateno que o operador TypeOf...Is sempre retorna True quando um objeto do tipo
especfico ou de uma classe derivada de um tipo especfico. Por isso quando se testa uma varivel do
tipo Integer ou String por exemplo, isto implica dizer que ambas os tipos de dados so herdados de
uma classe chamada System.Object, o operador TypeOf...Is sempre retorna True.
Sub CheckType(ByVal InParam)
' Ambos If sero verdadeiros quando um
' Integer passado como parmetro.
If TypeOf InParam Is Object Then
MsgBox("InParam um objeto")
End If
If TypeOf InParam Is Integer Then
MsgBox("InParam um inteiro")
End If
End Sub
A funo CallByName freqentemente utilizada para acessar objetos do tipo COM e objetos do
tipo .NET. Esta funo permite que o desenvolvedor possa descobrir as propriedades e mtodos de
um objeto em fase de criao (Design Time) simplesmente enviando strings para o objeto e
esperando que seja executado a operao sem a preocupao em saber se os dados enviados so do
tipo esperado pelo mtodo ou propriedade do objeto.
A sintaxe da funo CallByName :
Resultado = CallByName(Objeto, NomeProcedimento, TipoChamada, Argumentos())
Onde :
Objeto Nome do objeto que deseja executar as aes.
88
2.18.5 - Classes
O cdigo por trs dos objetos chamado de classes e definem as propriedades, mtodos, campos e
eventos desses objetos. De fato, classes so as estruturas dos objetos enquanto que os objetos so as
instncias das classes.
Para criar uma classe utilize a estrutura Class ... End Class com o nome da classe desejada.
Exemplo:
Public / Private Class MinhaClasse
End Class
89
possvel criar classes internas para as janelas quanto projetos exclusivamente para construir classes
gerais. Para isso basta usar o menu do Visual Studio .NET para criar novos projetos ou adicionar
novos itens de classe para o projeto.
Sempre que necessrio utilize o comando Imports para acessar as classes .NET, digitando-o sempre
no incio do cdigo fonte da classe. Por exemplo :
Imports Microsoft.Win32
Public / Private Class MinhaClasse
End Class
Para criar campos simples na classe declare variveis com os modificadores de acesso. Exemplo :
Imports Microsoft.Win32
Public Class MinhaClasse
Private localNome as string
Private localEndereo as string
End Class
Os campos acima foram declarados com Private, portanto s podem ser acessados de dentro da
classe, conforme as regras de escopo. Os campos so teis para trabalharem em conjunto com as
propriedades, essa tcnica recomendada para todos os procedimentos com classes.
As propriedades so ligeiramente diferentes dos campos conforme explicado em captulos anteriores.
Portanto para criar novas propriedades utilize a estrutra Property ... End Property declarados com
os modificadores de acesso e especificando um nome para a propriedade. Exemplo :
Imports Microsoft.Win32
Public Class MinhaClasse
Private localNome as string
Private localEndereo as string
Public Property Nome() As String
Get ' Retorna o valor da propriedade.
Return localNome
End Get
Set(ByVal Valor As String)
localNome= Valor
End Set
End Property
End Class
No exemplo acima foi criada uma propriedade chamada Nome que recebe um argumento Valor e
atribui diretamente para a varivel-campo localNome declarada anteriormente, alm disso pode
retornar esse valor simplesmente chamando novamente a varivel localNome. Observe que a palavra
90
chave Get permite somente ler um valor de propriedade enquanto que Set permite atribuir um valor
para uma propriedade.
Conclui-se que necessrio criar variveis locais para armazenar os valores de propriedades e
permitir a execuo de clculos mais abrangentes.
Para definir mtodos (aes que a classe executa) utilize a estrutura de procedimentos simples Sub ...
End Sub declarados com os modificadores de acesso para controlar o escopo, alm disso, informe
sempre o nome do mtodo. Exemplo :
Imports Microsoft.Win32
Public Class MinhaClasse
Private localNome as string
Private localEndereo as string
Public Property Nome() As String
Get ' Retorna o valor da propriedade.
Return localNome
End Get
Set(ByVal Valor As String)
localNome= Valor
End Set
End Property
Public Sub ContarPalavras( ) as integer
Dim intTotal as Integer
If localNome = then
Msgbox(No h nome algum informado)
Else
intTotal = Len(localNome)
Msgbox( intTotal )
End if
End Sub
End Class
Como visto em captulos anteriores, um procedimento que no retorna valores dentro de classes
chamado de mtodo, enquanto que funes sempre retornam valores.
Quando uma classe invocada pela primeira vez e o objeto baseado nessa classe criado, h um
cdigo especial que executado automaticamente dentro de todas as classes denominado
Construtor. O construtor permite a execuo de qualquer cdigo que se faa necessrio para
inicializar variveis, limpar estruturas, criar outros tipos de controles e tantos outros procedimentos,
assim o construtor o primeiro procedimento a ser executado pela classe.
O Construtor pode ou no receber parmetros assim como qualquer procedimento simples, para
codificar um construtor utilize a estrutura Sub New ( ) ... End Sub. Exemplo :
Imports Microsoft.Win32
Public Class MinhaClasse
91
End Sub
Public Property Nome() As String
Get ' Retorna o valor da propriedade.
Return localNome
End Get
Set(ByVal Valor As String)
localNome= Valor
End Set
End Property
Public Sub ContarPalavras( ) as integer
Dim intTotal as Integer
If localNome = then
Msgbox(No h nome algum informado)
Else
intTotal = Len(localNome)
Msgbox( intTotal )
End if
End Sub
Protected Overrides Sub FinalizarMinhaClasse()
Msgbox (Finalizando MinhaClasse)
MyBase.Finalize() ' padro criado pelo sistema.
End Sub
End Class
Observe ainda que a sintaxe para criar um destrutor deve obrigatoriamente incluir o comando
MyBase.Finalize( ) que atribudo automaticamente pelo sistema.
Tanto classes como mdulos Standard no VB .NET so referenciadas na memria e encapsulam
itens em sua implementao, mas so diferentes quanto a forma que so acessados. As classes so
instanciadas no cdigo e uma vez criadas cada cpia tem sua execuo prpria independente se
existe outra cpia em execuo. Enquanto que Mdulos Standard no so instanciados e dependem
unicamente da cpia em execuo.
Isto significa que se uma varivel de um Mdulo Standard alterado via cdigo na cpia em uso,
todos os outros cdigos que esto utilizando o mesmo Mdulo devero ter essa alterao em leituras
subseqentes. Ao passo que se um item de uma classe alterada para uma cpia, qualquer outra
cpia da classe no sofrer nenhum tipo de influncia, pois cada uma ter sua prpria execuo.
2.18.5.1 Vida til de um Objeto
A vida til de um Objeto comea quando o objeto criado com a palavra chave New. Alguns objetos
possuem tarefas de execuo inicial que so controlados pelo VB .NET atravs de um procedimento
chamado Construtor.
A vida til de um Objeto encerrando quando o objeto finalizado pelo cdigo de chamada e
liberado da memria pelo Common RunTime Language (CLR). O VB .NET controla a liberao dos
recursos do sistema atravs do procedimento chamado Destrutor.
93
Os procedimentos Sub New e Sub Finalize inicializam e finalizam os objetos substituindo os antigos
eventos Class_Initialize e Class_Finalize do VB 6.0. Toda vez que um objeto criado, o
procedimento dentro de Sub New invocado automaticamente pelo sistema antes de qualquer outro.
Alm disso se o desenvolvedor no cria o procedimento Sub New, o VB .NET por sua vez cria
automaticamente esse procedimento.
Antes de liberar um objeto da memria o CLR do VB .NET chama o mtodo Finalize (Destrutor)
automaticamente para os objetos que possuem este procedimento que pode, por exemplo salvar e
fechar arquivos necessrios.
H classes que utilizam recursos do Windows que no podem ser gerenciados pelo CLR do VB
.NET, como por exemplo os handles da API do Windows e conexes Banco de dados. Nessas
situaes a classe precisa implementar seu prprio Garbage Collection (Coletor de Lixo) utilizando
uma classe do VB .NET chamada interface IDisposable.
A interface IDisposable tem somente um mtodo chamado Dispose que pode liberar recursos do
sistema e fechar conexes a Banco de dados, entretanto o mtodo Dispose no invocado
automaticamente, necessrio que o Cliente (o desenvolvedor que estiver utilizando a classe) chame
o mtodo explicitamente quando finalizar a utilizao do objeto.
A plataform NET utiliza um sistema chamado de reference-tracing garbage collection (Coletor de
lixo por trilha e referncia) que periodicamente faz uma busca e liberao de recursos no mais
utilizados pelos objetos. Periodicamente o CLR (Common Language Run time) varre todo o sistema
e destri os objetos que no esto mais sendo utilizados, os recursos do sistema so liberados mais
rapidamente quando o computador tem recursos limitados.
H um atraso entre quando o objeto finalizado pelo cliente e quando o CLR libera-o da memria,
pois no h como saber quando este ltimo procedimento ser executado, portanto nesta situao um
objeto chamado de non-deterministic lifetime (tempo de vida indeterminado), assim o Destrutor
Finalize pode no ser executado imediatamente quando o objeto perde o escopo ( finalizado).
Outro aspecto interessante que o Garbage Collection do CLR no uitliza mais a palavra chave
Nothing para liberar recursos da memria, ao passo que outras verses do VB precisavam de
Nothing para liberar recursos imediatamente da memria. A palavra chave Nothing deve ser usado
no VB .NET somente quando os objetos tiverem uma vida til longa demais afetando o tempo que o
CLR ir liberar o objeto da memria.
2.18.5.2 Construtor e Destrutor
Construtores e Destrutores controlam a criao e a destruio de objetos.
possvel criar um construtor com um ou vrios parmetros da mesma forma que se cria parmetros
para procedimentos simples. Exemplo :
Sub New(ByVal sString As String)
Os construtores so frequentemente Overloaded (Sobrecarregados) conforme abaixo :
Sub New(Byval sString as String, iInt as Integer)
Quando se cria uma classe derivada de uma classe bsica necessrio incluir na primeira linha do
construtor da classe derivada uma chamada ao construtor da classe bsica se, e somente se o
construtor da classe bsica tiver parmetros. Por outro lado se o construtor da classe bsica no tiver
94
A tcnica geral sempre fazer uma instncia da classe e atribuir um valor propriedade, no caso
acima Um, em seguida a classe recebe o valor no argumento e atribui esse valor a varivel local que
armazenar o valor at que a classse seja finalizada.
2 Propriedades somente-leitura
Para criar propriedades somente-leitura no utilize a palavra chave Set. Para criar propriedades
somente-gravao no utilize a palavra chave Get. Exemplo :
Class MinhaClasse
Private m_PropVal As String
ReadOnly Public Property Um() As String
Get
Return m_PropVal ' Retorna o valor da varivel local.
' pode-se usar tambm a sintaxe Um = PropVal para retornar o valor a propriedade
End Get
End Property
End Class
No exemplo acima a classe bsica possui uma propriedade chamada UM que somente leitura pois
no existe a palavra chave Set, alm disso preciso criar um cdigo que inicialize o valor da
propriedade Um antes de retorn-la.
Os mtodos de uma classe so todos os procedimentos Sub ou Function declarados dentro dessa
classe. Como j foi visto Funes retornam valores mesmo dentro de classes enquanto que
procedimento Sub no retornam valores.
Utilize explicitamente os modificadores de restrio ReadOnly e WriteOnly na implementao
das propriedades. O comando ReadOnly no permite que seja utilizado o comando Set na criao da
propriedade e aumenta a velocidade do processamento dos comandos. WriteOnly no permite que o
comando Get seja utilizado na criao da propriedade.
3 Protegendo os mtodos de uma classe
Os mtodos da classe devem ser construdos utilizando os modificadores de acesso assim como se
faz com um procedimento normal. Exemplo :
Class MinhaClasse
Public Sub MensagemDeBomDia ( )
Dim Mensagem as string
Mensagem = Ol, Tenha um bom dia
Msgbox (Mensagem)
End Sub
Public Function Adicionar1 (byVal intNmero as integer) as Integer
Dim intResultado as Integer
intResultado = intNmero + 1
Return intResultado
End Class
No exemplo acima o mtodo MensagemDeBomDia exibe apenas uma caixa de mensagem. E a
funo Adicionar1 retorna o nmero do parmetro adicionado 1. Observe ainda que se os mtodos
99
(Sub e Function) fossem declarados como o modificador de acesso Private, ento o cdigo s estaria
disponvel para a chamada interna da classe, isto somente o cdigo da prpria classe poderia
utilizar os procedimentos.
Essa tcnica faz parte do encapsulamento e protege a implementao da classe de acessos externos.
Assim somente o criador da classe saber que essas funes ou Sub existem e sero utilizadas
somente dentro da prpria classe.
4 Membros Shared
Os membros Shared (ocultados) podem ser invocados sem criar uma instncia da classe. Exemplo :
Class MinhaClasse
Shared Sub MensagemDeBomDia ( )
Dim Mensagem as string
Mensagem = Ol, Tenha um bom dia
Msgbox (Mensagem)
End Sub
End Class
Sub Teste( )
Dim MinhaVarivel as MinhaClasse
No precisa utilizar a palavra chave New
MinhaVarivel.MensagemDeBomDia( )
End Sub
No exemplo acima a classe MinhaClasse possui um procedimento Shared que pode ser invocado sem
utilizar a palavra chave New que cria uma instncia da classe.
Os membros Shared so teis quando o desenvolvedor deseja que um mtodo (Sub ou Funo) no
esteja associada com uma instncia da classe, isto o mtodo esteja disponvel mesmo sem o uso de
New.
5 Diferenas entre propriedades e mtodos
As propriedades e mtodos so similares na sua construo porque podem receber parmetros.
Entretanto as propriedades podem receber parmetros e atribuies com o sinal de atribuio,
enquanto que os mtodos no podem receber novos valores com o sinal de atribuio, somente
atravs do argumento do parmetro:
MinhaClasse.Propriedade1(ndice) = 4
Recebe o novo valor 4 com o sinal de atribuio =
MinhaClasse.Mtodo1(NovoNmero) Somente recebe um novo valor no argumento NovoNmero
No exemplo acima no possvel atribuir um novo valor para o Mtodo1 sem que seja atravs do
argumento NovoNmero.
6 Propriedades Default (Padro)
As propriedades padres oferecem um meio de compactar o cdigo omitindo o nome de uma
propriedade na criao do cdigo. O VB .NET utiliza um valor default quando o desenvolvedor no
especifica uma valor para a propriedade. Exemplo :
TextBox = A propriedade Default de uma caixa de texto Text
100
No exemplo acima, foi utilizada a propriedade Default Text de uma caixa de texto simples, assim o
desenvolvedor no precisa nomear a propriedade como por exemplo TextBox.Text = Ol.
Regras para criar propriedades Default :
Para criar uma propriedade Default utilize a palavra chave Default antes de definir a
propriedade.
Toda classe s pode ter uma propriedade padro
Uma propriedade Default (Padro) no pode ser Shared ou Private.
Se uma propriedade Default overloaded, todas as propriedades resultantes com o mesmo
nome sero Default
As propriedades Default devem aceitar pelo menos um argumento.
Exemplo :
Class Class2
' Define a varivel local para armazenar o valor da propriedade
Private PropertyValues As String()
' Define a propriedade padro.
Default Public Property Propriedade1(ByVal Index As Integer) As String
Get
Return PropertyValues(Index)
End Get
Set(ByVal Value As String)
If PropertyValues Is Nothing Then
' A matriz contm Nothing que acessada pela primeira vez.
ReDim PropertyValues(0)
Else
' Redimensiona a matriz para armazenar os novos valores
ReDim Preserve PropertyValues(UBound(PropertyValues) + 1)
End If
' Value uma varivel implcita declarada pelo VB .Net que contm o valor
da atribuio
PropertyValues(Index) = Value
End Set
End Property
End Class
O exemplo acima cria uma classe que possui uma propriedade Default que uma matriz de
elementos strings, a cada atribuio a matriz redimensionada automaticamente.
Para acessar uma propriedade padro basta abreviar o cdigo escrito. Exemplo :
Dim C As New Class2()
' As duas linhas abaixo acessar a propriedade da classe da forma convencional.
C.Prop1(0) = "Valor um" Atribuio da propriedade.
MessageBox.Show(C.Prop1(0)) ' Retorno da propriedade.
' As duas linhas abaixo acessam uma propriedade Default.
C(1) = "Valor dois" ' Atribuio da propriedade.
MessageBox.Show(C(1)) ' Retorno da propriedade.
7 Propriedade e mtodos Overloaded (Sobrecarregados)
101
A Sobrecarga (Overloaded) uma tcnica que permite criar mais de um procedimento, mtodo ou
construtor com o mesmo nome mas com argumentos diferentes. Exemplo :
Overloads Sub Display(ByVal theChar As Char)
' Cdigo que exibe dados Char
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Cdigo que exibe dados Integer
End Sub
Overloads Sub Display(ByVal theDouble As Double)
' Cdigo que exibe dados Double
End Sub
Observe que sem Overloaded seria preciso criar nomes diferentes para cada procedimento que faa a
mesma coisa.
Regras para Overloading (Sobrecarga) :
A palavra chave Overloaded opcional, entretanto uma vez usada todos os outros membros tambm
devero usar explicitamente Overloaded.
Quando uma classe derivada utiliza overloaded de um membro herdado de uma classe bsica, isto
sobrecarrega um mtodo ou propriedade de uma classe bsica, esse mtodo ou propriedade criado
ser usado ao invs do mtodo da classe bsica. Esse processo conhecido como Shadowing por
nome e Assinatura (ocultao).
Observe com ateno que quando a palavra chave Overloaded usado em processo Shadowing por
Nome e Assinatura o membro overloaded implementado na classe derivada substitui o membro
implementado na classe bsica, entretanto os outros membros overloaded na classe bsica estaro
disponveis para a instncia da classe derivada.
Ao passo que se a palavra chave Overloade for omitida em um processo Shadowing ento o membro
overloaded implementado na classe derivada ainda substitui o membro implementado na classe
bsica, s que os outros membros overloaded da classe bsica no estaro disponveis para a
instncia da classe derivada.
8 Propriedades e mtodos Overriding (substituio)
As classes derivadas herdam todos os mtodos e propriedades de uma classe bsica, entretanto h
casos em que os membros de uma classe bsica precisam ser modificados completamente para o uso
de uma classe derivada.
O overriding (substituio) permite criar uma nova implementao de mtodos e propriedades para
serem usados na classe derivada.
Regras para criao de Overriding :
Somente possvel criar Overrides (substituio) para membros que j estejam marcados
com a palavra chave Overridable na classe bsica.
Os membros overridden (substitudos) devem ter os mesmos parmetros da classe bsica.
O membro overriden (substitudo) pode chamar a implementao original da classe bsica
utilizando a palavra chave Mybase antes do nome do mtodo.
Exemplo :
Const Bonus As Decimal = 1.45
Const Taxa As Decimal = 14.75
Class Pagamento
Overridable Function PagarEmpregados(ByVal HorasTrabalhadas As Decimal, _
ByVal Taxa As Decimal) As Decimal
PagarEmpregados = HorasTrabalhadas * Taxa
End Function
End Class
Class BonusPagamento
Inherits Pagamento
Overrides Function PagarEmpregados(ByVal HorasTrabalhadas As Decimal, _
ByVal Taxa As Decimal) As Decimal
' A linha seguinte chama o mtodo original da classe bsica e modifica o valor retornado
PagarEmpregados = MyBase.PagarEmpregados(HorasTrabalhadas, Taxa) * Bonus
End Function
End Class
Sub ExecutarPagamento()
Dim PagamentoItem As Pagamento = New Pagamento()
Dim BonusPagamentoItem As New BonusPagamento()
Dim HorasTrabalhadas As Decimal = 40
MessageBox.Show("Pagamento normal : " & _
PagamentoItem.PagarEmpregados(HorasTrabalhadas, Taxa))
MessageBox.Show("Pagamento com bnus : " & _
BonusPagamentoItem.PagarEmpregados(HorasTrabalhadas, Taxa))
End Sub
O exemplo acima define uma classe bsica Pagamento e uma classe derivada BonusPagamento que
substitui um mtodo da classe bsica PagarEmpregados. Em seguida foi criado um procedimento que
testa as duas classes fazendo uma referncias classe bsica e a classe derivada.
Concluindo, overrides substitui os membros de uma classe bsica alterando a forma com que o
procedimento executa uma tarefa. Ao passo que overloaded sobrecarrega os membros de uma
classe bsica modificando os parmetros do membro.
Para que um manipulador de evento se torne til preciso associar esse manipulador com o prprio
evento utilizando os comandos Handles ou AddHandler. As palavras chaves WithEvents e
Handles so as formas tradicionais para criar eventos em classes.
1 Adicionando eventos a uma classe
Para adicionar eventos a uma classe utilize o comando Event seguido pelo nome do evento e seus
parmetros. Exemplo:
Public Event PorcentagemAlcanada(ByVal Porcentagem As Single, ByRef Cancelar As Boolean)
Os eventos no podem retornar valores; no podem possuir parmetros opcionais e no podem
possuir argumentos ParamArray.
No momento em que se cria um evento para a classe, o objeto dessa classe, agora pode disparar um
evento especfico. Para que um evento possa realmente ocorrer preciso utilizar o comando
RaiseEvent, alm disso as palavras chaves Handles e AddHandler associam este evento a um
manipulador de eventos. Uma classe derivada no pode disparar eventos de uma classe bsica.
2 Criando manipuladores de eventos (Event Handlers)
Quando se cria um evento em uma classe necessrio associ-lo a um manipulador de evento. A
forma tradicional de criar um manipulador de eventos utilizar os comandos Handles e
WithEvents.
A palavra chave WithEvents permite criar variveis da classe ou de objetos de mdulo que podem
ser usados com a clsula Handles para manipular Eventos, seguindo estes passos :
1. Criar uma varivel a nvel de mdulo de um formulrio :
104
2. Escolher o nome dessa varivel na lista de objetos na janela Editor de cdigos do Visual
Studio .NET.
3. Escolher o evento da lista de eventos criados na janela do Editor de cdigos do Visual Studio
.NET.
4. Adicionar um cdigo para esse manipulador de evento.
cria uma classe fora do mdulo do formulrio
Public Class Classe1
Public Event Iniciar(ByVal Nmero As Integer)
Public Sub Somar()
RaiseEvent Iniciar(1)
End Sub
End Class
cdigo dentro do formulrio
Public Class Form1
Inherits System.Windows.Forms.Form
cdigo gerado automaticamente pelo Vb .NET
#Region " Windows Form Designer generated code "
Declara a varivel com WithEvents que vai ser o objeto com o manipulador de eventos
Public WithEvents var As Classe1
Um evento Clique de um boto qualquer que utiliza a nova classe
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
var = New Classe1()
var.Somar()
End Sub
Manipulador de evento com um cdigo de exemplo
Private Sub var_Iniciar(ByVal Nmero As Integer) Handles var.Iniciar
MsgBox("Evento disparado com o nr : " & Nmero)
End Sub
End Class
No exemplo acima, observe que o VB .NET cria automaticamente o manipulador de evento para a
varivel var, alm disso adiciona automaticamente Handles que vai associar o evento Iniciar com a
varivel var.
Portanto WithEvents permite criar uma varivel da classe que atuar como o objeto que possui os
eventos, isto a fonte de dados.
O comando AddHandler permite criar dinamicamente eventos que se conectam a manipuladores de
eventos em tempo de execuo (Run time). Portanto no preciso criar variveis com WithEvents.
Para criar eventos dinamicamente conectados a manipuladores de eventos basta seguir os passos
seguintes :
1. Criar uma varivel do tipo da classe desejada, podendo ser uma varivel local.
105
2. Usar o comando AddHandler para informar o nome do emissor do evento (event sender)
junto com o operador AddressOf que informa o nome do manipulador de evento desejado.
Qualquer procedimento pode ser um manipulador de evento, desde que tenha os parmetros
necessrios.
3. Adicionar o cdigo para o manipulador de evento.
Public Class Classe1
Public Event Iniciar(ByVal Nmero As Integer)
Public Sub Somar()
RaiseEvent Iniciar(1)
End Sub
End Class
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Dim var As Classe1
var = New Classe1()
AddHandler var.Iniciar, AddressOf varIniciar_Evento
var.Somar()
End Sub
Private Sub varIniciar_Evento(ByVal Nmero As Integer)
MsgBox("Evento disparado com o nr : " & Nmero)
End Sub
End Class
O exemplo acima reutiliza a classe do exemplo anterior mas cria uma varivel local que vai atuar
como o objeto emissor de eventos. Alm disso utiliza um ponteiro para um manipulador de eventos
personalizado varIniciar_Evento que no foi criado automaticamente pelo VB .NET.
O comando RemoveHandler desconecta dinamicamente um evento de um manipulador de evento
em tempo de execuo (Run Time), para isso necessrio seguir os passos abaixo :
1. Utilizar o comando RemoveHandler junto com o nome do emissor de eventos alm do
operador AddressOf informando o nome do manipulador de eventos a ser desconectado.
Observe que a sintaxe aps RemoveHandler deve ser completamente igual a AddHandler.
RemoveHandler var.Iniciar, AddressOf varIniciar_Evento
No exemplo acima reutiliza os exemplos anteriores e desconecta a varivel emissor de eventos var
do manipulador de eventos varIniciar_Evento.
As classes derivadas podem manipular eventos disparados pela classe bsica utilizando os comandos
Handles MyBase. Siga os passos a seguir para completar essa operao :
1. Declarar um manipulador de eventos na classe derivada utilizando os comandos Handles
MyBase <Nome do evento> na mesma linha do manipulador de evento a ser criado.
106
prprios eventos. Alm disso AddHandler permite associar mltiplos eventos para um simples
evento.
O comando AddHandler possui dois parmetros : o primeiro informa o nome do evento junto com o
emissor do evento e o segundo o operador AddressOf que delega o controle para um procedimento
especfico.
AddHandler conecta o evento de um emissor de eventos para um procedimento personalizado,
enquanto que RemoveHandler desconecta o evento de um emissor de eventos desse procedimento
personalizado. Exemplo :
AddHandler MeuObjeto.Evento1, AddressOf Me.MeuManipuladorEventos
RemoveHandler MeuObjeto.Evento1, AddressOf Me.MeuManipuladorEventos
5 Delegar (Delegates) e o operador AddressOf
Delegar um recurso que permite que objetos possam ser usados para chamar os mtodos de outros
objetos. O mtodo delegar tambm conhecido como Ponteiro de funes de segurana (type-safe
function pointers) que so similares aos ponteiros de funes de linguagens como C++.
O VB .NET utiliza delegate ao invs de ponteiros de funes que so tipos referncia da Classe
System.Delegates, que podem fazer referncias tanto a mtodos Shared ( que no precisam de
instncias de classes) quanto a mtodos padres ( que precisam de intncias de classes ).
Delegar til principalmente em eventos, pois um objeto que dispara eventos pode chamar diversos
manipuladores para cada situao diferente. O comando AddHandler cria um processo Delegar que
chama o manipulador de evento apropriado e O VB .NET cuida de todos os detalhes deste processo.
Outro comando que executa um processo delegar o comando Event que implicitamente cria um
processo delegate, alm disso o operador AddressOf cria uma instncia (cpia) de um processo
Delegate.
possvel criar os prprios processos Delegate personalizados. Para declarar eventos que utilizam
um tipo de Delegates existente basta utilizar a sintaxe abaixo :
Event EventoQualquer As TipoDelegate
Para criar delegates com outras tarefas especficas, declare procedimentos com o Comando Delegate.
Toda classe que foi delegada possui o mtodo Invoke que utilizado para acionar o mtodo
delegado.
Delegate Sub MeuProcedimento(ByVal ArgumentoQualquer as integer)
De forma resumida, Delegates significa transferir o controle de um procedimento para outros
procedimentos desde que tenham os argumentos necessrios. Assim tanto AddHandler, AddressOf e
Event transferem o controle de um procedimento, no caso o evento, para outro procedimento, no
caso um manipulador de evento. Exemplo :
Delegate Sub Contar(ByVal AtQuanto As Integer)
Public Class Classe1
Public Sub Contar1(ByVal QuantasVezes As Integer)
MsgBox("Este mtodo sabe contar at " & QuantasVezes)
End Sub
108
End Class
Public Class classe2
Public Sub Contar2(ByVal NmeroMximo As Integer)
MsgBox("Esta classe possui um mtodo que conta no mximo at " & NmeroMximo)
End Sub
End Class
Public Class Classe3
Public Sub Contar3(ByVal intMximo As Integer)
MsgBox("O mtodo da classe3 conta at " & intMximo)
End Sub
End Class
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Dim meuDelegate As Contar
Dim c1 As New Classe1()
Dim c2 As New classe2()
Dim c3 As New Classe3()
'primeiro teste
meuDelegate = AddressOf c1.Contar1
meuDelegate.Invoke(4)
'segundo teste
meuDelegate = AddressOf c2.Contar2
meuDelegate.Invoke(4)
'terceiro teste
meuDelegate = AddressOf c3.Contar3
meuDelegate.Invoke(4)
End Sub
End Class
O exemplo acima ilustra demonstra o uso de Delegate e AddressOf. De acordo com as definies
acima Delegate utiliza um objeto simples para acessar os mtodos e membros de outros objetos,
assim o objeto Contar foi utilizado como base para acessar os mtodos das classes 1, 2 e 3.
Ainda de acordo com as definies anteriores, o operador AddressOf transfere o controle de um
procedimento para outro, desta forma o objeto meuDelegate uma instncia do objeto Contar,
em seguida foi atribudo a referncia de vrios outros procedimentos definidos pelo operador
AddressOf.
O cdigo acima testa a melhor forma de exibir uma informao para o usurio, primeiro foi testado o
mtodo Contar1 que exibe um tipo de informao. Em seguida foi testado o mtodo Contar2 que
exibe a mesma informao, mas com um texto diferenciado, e por ltimo Contar3 exibe a ltima
informao mais diferenciada ainda.
109
Resumindo, Delegate permitiu no caso acima, escolher a melhor forma de exibio de texto para o
usurio, mas claro que o cdigo acima foi utilizado somente para ilustrao.
MeuInteiro
as
Integer
as
Integer
Implements
111
No exemplo acima foram criadas duas interfaces 1 e 2 com mtodos Sub1 e M1 alm de uma
propriedade somente leitura Num. A implementao das interfaces foram feitas nas classes
ClasseImplementao1 e ClasseImplementao2, cada qual com uma mensagem diferente ao
usurio.
Observe que a Interface2 herda a definio da Interface1, mas a implementao da Interface1 e
Interface2 so independentes.
1 Quando usar Interfaces ?
Interfaces uma poderosa ferramenta de programao que permite separar a definio de um objeto
da implementao desse objeto. Assim esse recurso permite que a implementao seja feita
livremente por outras classes independentes entre si.
Interfaces so mais flexveis do que herdar classes diretamente. A herana de classes possui um
problema, pois se a classe bsica possui erros na implementao, as classes derivadas tambm a
tero.
Assim quando a correo do erro feito na classe bsica as outras classes derivadas podem no
funcionar corretamente, pois os mtodos sobrecarregados (overloads) e substitudos (Overrides)
podem no ser compilados adequadamente.
A inteface resolve grande parte desses problemas publicando novas interfaces atualizadas. Alm
disso as interfaces so mais flexveis que herdar classes porque permitem criar cdigos livres para
cada interface.
Use interfaces quando :
Quando o aplicativo a ser construdo no possua relacionamento entre objetos, mas que
possuam algumas funcionalidades semelhantes.
Quando houver necessidade de meios mais flexveis de programao do que os encontrados
entre classes bsica e classes derivadas, isto herana entre classes.
Quando no necessrio herdar implementaes de classes bsicas, isto herana entre
classes.
Quando utilizar estruturas que no podem ser herdadas mas podem possuir interface.
Todas as classes so herdveis exceto aquelas marcadas pela palavra chave NotInheritable.
112
As classes derivadas podem ser criadas herdando somente uma classe bsica por vez. Assim
no possvel fazer uma herana de mltiplas classes, entretanto mltiplas classes que
implementam interfaces podem facilmente suprir essa limitao.
Os modificadores de acesso dos itens da classe derivada devem ser igual ou mais restritivas
que os modificadores de acesso dos itens da classe bsica. Isto significa que se uma classe
bsica for declarada como Friend, a classe derivada no pode expor a classe bsica mesmo
que a classe derivada for declarada como Public. Assim a classe derivada deveria ser
declarada como Friend ou outro modificador de acesso mais restritivo.
Para criar uma herana sempre inclua o comando Inherits.
Overridable Permite que um mtodo ou propriedade de uma classe bsica possa ser
substituda (overridden) pela classe derivada.
Overrides Substitui um mtodo ou propriedade Overridable de uma classe bsica.
NotOverridable Evita que mtodos e propriedades sejam substitudas (overriden) na classe
derivada. Todos os mtodos e propriedades pblicas so NotOverridable por default.
MustOverride Obriga que a classe derivada substitua (overrides) os mtodos e
propriedades da classe bsica. O modificador MustOverride deve ser usado em todas as
classes declaradas com MustInherit.
possvel chamar os mtodos de uma classe bsica mesmo que esteja sendo substitudo na classe
derivada utilizando o comando MyBase. Exemplo :
Class ClasseDerivada
Inherits ClasseBsica
Public Overrides Function Calcular(ByVal Distncia As Double, ByVal Tempo As Double) As
Double
' Chama o mtodo da classe bsica e modifica o valor retornado.
Return MyBase.Calcular (Distncia, Tempo) * 2
End Function
End Class
O comando MyBase tem as seguintes limitaes :
MyBase refere-se somente a classe bsica, no possvel acessar membros privates da classe.
MyBase um comando e no um objeto, portanto no pode ser atribudo a variveis nem ser
utilizado em comparaes.
MyBase pode se referir a classes bsicas imediatas ou classes herdadas indiretamente.
MyBase no pode invocar mtodos MustOverride de classes bsicas.
MyBase
no
pode
ser
usado
como
auto-qualificador.
Por
exemplo
MyBase.MyBase.BtnOK_Click() ' Erro.
113
MyBase no pode ser usado em mdulos e no pode acessar membros Friend de classes
bsicas de outros Assemblies.
MyClass chama um mtodo original da classe corrente mesmo que tenha sido susbstitudo por outra
implementao, como se os mtodos fossem declarados como NotOverridable. Exemplo :
Class ClasseBsica
Public Overridable Sub MeuMtodo()
MsgBox("Classe Bsica")
End Sub
Public Sub UseMe()
Me.MeuMtodo() 'Usa a verso da classe chamada mesmo se for substituda (override)
End Sub
Public Sub UseMyClass()
MyClass.MeuMtodo() ' Usa esta verso do mtodo e no a substituda (override)
End Sub
End Class
Class ClasseDerivada : Inherits ClasseBsica
Public Overrides Sub MeuMtodo()
MsgBox("Classe Derivada")
End Sub
End Class
Class TestarClasses
Sub Iniciar()
Dim TestObj As ClasseDerivada = New ClasseDerivada()
TestObj.UseMe() ' Exibe "Classe Derivada".
TestObj.UseMyClass() ' Exibe "Classe Bsica".
End Sub
End Class
O exemplo acima demonstra a diferena de comportamento entre os comandos Me e MyClass.
Primeiro foi criada uma classe bsica ClasseBsica que possui trs mtodos MeuMtodo,
UseMe e UseMyClass sendo que somente o primeiro mtodo substituvel, os outros mtodos
utilizam o comando Me e MyClass para ser referir ao mtodo corrente em uso.
Em seguida a classe derivada ClasseDerivada substitui (Overrides) o mtodo MeuMtodo com
uma nova implementao. Quando o objeto testado, o comando Me faz referncia ao mtodo
atualmente em uso, enquanto que MyClass faz referncia ao mtodo original em uso que anula os
efeitos da verso substituda da classe derivada e permite que o compilador resolva qual a verso
invocar.
Observe tambm como o comando Inherits foi utilizado na implementao da classe Derivada.
114
Para utilizar a tcnica da herana adicione o comando Inherits com o nome da classe bsica. Esse
comando deve ser sempre a primeira linha de implementao da classe derivada. Exemplo :
Class Classe1
Sub Metodo1()
MessageBox.Show("Este um mtodo da classe bsica.")
End Sub
Overridable Sub Metodo2()
MessageBox.Show("Este um outro mtodo da classe bsica.")
End Sub
End Class
Class Classe2
Inherits Classe1
Inherits deve ser sempre a primeira linha no comentada da implementao
Public Field2 as Integer
Overrides Sub Metodo2()
Messagebox.Show("Este um mtodo da classe derivada.")
End Sub
End Class
Protected Sub Testar()
Dim C1 As New class1()
Dim C2 As New class2()
C1.Metodo1() ' Chama o mtodo da classe bsica.
C1.Metodo2() ' Chama outro mtodo da classe bsica.
C2.Metodo1() ' Chama o mtodo herdado da classe bsica.
C2.Metodo2() ' Chama o mtodo da classe derivada.
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Testar()
End Sub
Quando o procedimento Testar executado, as mensagens abaixo so exibidas :
"Este um mtodo da classe bsica."
"Este um outro mtodo da classe bsica."
"Este um mtodo da classe bsica."
"Este um mtodo da classe derivada."
1 Quando usar heranas
A herana deve ser usado nos seguintes casos abaixo :
Resumidamente :
1. Use herana quando se deseja criar funcionalidades bsicas que possam ser melhoradas nas
classes derivadas
2. Use Inteface em situaes onde as funcionalidades sejam similares mas as implemetaes
sejam completamente diferentes.
1.2 Tipos de Hierarquias ( um Relacionamento e Tem um Relacionamento)
H duas formas de criar um relacionamento entre classes, um e Tem um relacionamento.
um Relacionamento uma classe derivada totalmente de uma classe bsica, isto a
classe derivada do mesmo tipo da classe bsica, possuindo os mesmos campos, mtodos e
propriedades.
Tem um Relacionamento A classe derivada no herda a classe bsica, isto alguns
membros da classe bsica no devem ser herdados pela classe derivada. Assim no ocorre a
herana num tipo Tem um Relacionamento.
Exemplo :
No exemplo acima uma Classe denominada Cliente possui uma classe derivada Cliente
Preferencial que foi completamente herdada da classe bsica. A classe Cliente Preferencial pode
possuir todos os membros de dados da classe Cliente pois um cliente j cadastrado e em
atividade, portanto a hierarquia conhecida como um Relacionamento.
A classe denominada Cliente Encaminhado um potencial cliente ainda no cadastrado e que no
comprou produto algum da loja, portanto no pode herdar os membros Preferncias e ltimo
Pedido da classe bsica. Assim essa hierarquia conhecida como Tem um Relacionamento.
Para classes Tem um Relacionamento o melhor recurso implementar Interfaces para alcanar o
objetivo proposto.
1.3 Reutilizao de cdigo
116
Todo cdigo reutilizvel altamente recomendado pelo simples fato de no ter o trabalho de
codificar e testar todos os procedimentos novamente. Uma vez criado o cdigo bsico todos as outras
classes podem reutilizar o cdigo incrementando outros procedimentos necessrios.
Um exemplo tpico criar uma classe que implementa uma coleo de dados lidos de um banco de
dados, por exemplo uma tabela clientes, e permite o acesso a todas as informaes na memria. Em
seguida uma classe derivada poderia manter a mesma coleo para a tabela clientes mas adiciona
uma outra coleo que l os dados da tabela Pedidos e mantm na memria para posterior consulta.
Entretanto toda a reutilizao de cdigo pode possuir erros graves que s podem ser evitados em
sistemas bem desenhados.
1.4 Classes derivadas e os tipos de dados
Qualquer classe bsica pode deixar a responsabilidade da implementao dos membros para cada
classe derivada. Assim todo o mtodo poder acomodar qualquer tipo de dados.
Essa tcnica evita erros quando por exemplo um cdigo da classe derivada deseja calcular uma taxa
de aumento para um produto em 2,5%, entretanto o mtodo da classe bsica s aceita nmeros
inteiros. Assim para resolver o problema a classe bsica definiria um mtodo somente herdado para
ser implementado na classe derivada. Exemplo:
MustInherit Class Produtos
Public ValorTotalArredondado As Integer
Public ValorTotalArredondadoAMenor As Integer
MustOverride Sub CalcularAumento()
End Class
No exemplo acima, o desenvolvedor alm de criar uma classe somente herdvel, os itens
ValorTotalArredondado e ValorTotalArredondadoAMenor so definidos na classe bsica Produtos
que podero ser reutilizados nos clculos das classes bsicas descendentes.
Este tipo de soluo combina os recursos de polimorfismo baseado em herana (Inherit-based
polymorphism) e permite que os desenvolvedores que no tenham acesso ao cdigo fonte da classe,
possam aprimorar a classe bsica atravs da implementao de novos recursos classe derivada.
1.5 - Hierarquia de classes
Quando se cria uma classe bsica possvel criar vrias classes derivadas que herdam os recursos da
classe bsica, assim a hierarquia de classes formada pela criao de classes herdadas. Entretanto
classes que possuem hierarquias muito grandes e complexas dificultam a programao, portanto
como regra geral necessrio limitar os nveis de hierarquia at no mximo 6 (seis) nveis.
1.6 Mudanas nas classes bsicas que afetam as classes derivadas
Um dos benefcios da herana que as mudanas nas classes bsicas podem afetar as classes
derivadas, entretanto nem todas as modificaes podem ser feitas quando h dezenas de classes
derivadas da classe bsica.
Quando o criador da classe bsica altera o cdigo de um de seus membros, os desenvolvedores que
criaram classes derivadas podem no conseguir recompilar a classe herdada com as novas
modificaes.
117
Por exemplo, um classe bsica foi criada com um campo para armazenar o cdigo postal de ruas e as
classes derivadas herdaram esse campo de informao. Mais tarde foram feitas alteraes na classe
bsica para comportar mais 4 dgitos expandindo o nmero atual para 9 dgitos, entretanto as classes
bsicas ainda permanecem com 5 dgitos.
Para que os desenvolvedores no precisem alterar o cdigo das classes derivadas, possvel criar um
campo adicional na classe bsica que armazene os 4 dgitos adicionais. Assim os aplicativos
poderiam ser atualizados sem alterar o cdigo das classes derivadas, esse o meio mais seguro e
eficaz de resolver tais problemas.
118
Quando o objeto no estiver mais em uso, o CLR chama o mtodo Finalize (Destrutor) antes de
retir-lo da memria. O cdigo dentro de Finalize executa tarefas de limpeza, tais como salvar
informaes, fechar arquivos, fechar conexes de banco de dados e outros mais.
O cdigo em Finalize ser executado sempre primeiro na classe derivada de ltima hierarquia at
chegar no cdigo Finalize da classe bsica. Isto porque a sintaxe MyBase.Finalize ( ) deve estar
sempre na ltima linha do cdigo Finalize.
De fato, quando uma classe derivada encerrada, o cdigo de limpeza geral deve ser efetuada para
esta classe, pois poder fechar arquivos, conexes e salvar configuraes abertas por esta classe
somente. Em seguida ser invocado o cdigo de limpeza da classe de hirarquia anterior que tambm
efetuar limpeza geral para as tarefas executadas por essa classe. Exemplo :
119
2.18.11 Polimorfismo
O polimorfismo a habilidade de criar classes que possuam nomes, mtodos e propriedades idnticas
mas funcionalidades diferentes.
O Visual Basic .NET implementa o polimorfismo atravs da Herana (Inherits) e atravs de
Interfaces (Interfaces), ao contrrio de verses anteriores que somente implementavam o
polimorfismo atravs de Interfaces.
1 O polimorfismo baseado em Herana
O polimorfismo baseado em herana quando os mtodos e propriedades de uma classe bsica so
overriden (substitudos) por outra implementao (outro cdigo) na classe derivada.
O polimorfismo a habilidade de chamar um mtodo de um objeto sem conhecer a classe em que foi
derivado.
Exemplo de polimorfismo baseado em herana :
Const StateRate As Double = 0.053 ' 5.3 %
Const CityRate As Double = 0.028 ' 2.8 %
Public Class BaseTax
Overridable Function CalculateTax(ByVal Amount As Double) As Double
Return Amount * StateRate.
End Function
End Class
Public Class CityTax
' Este mtodo chama o mtodo da classe bsica
' e modifica o valor retornado.
Inherits BaseTax
Private BaseAmount As Double
Overrides Function CalculateTax(ByVal Amount As Double) As Double
BaseAmount = MyBase.CalculateTax(Amount)
Return CityRate * (BaseAmount + Amount) + BaseAmount
End Function
End Class
Sub TestPoly()
Dim Item1 As New BaseTax()
Dim Item2 As New CityTax()
ShowTax(Item1, 22.74)
ShowTax(Item2, 22.74)
End Sub
Sub ShowTax(ByVal Item As BaseTax, ByVal SaleAmount As Double)
' O argumento Item do tipo BaseTax, mas pode-se tambm
' inform-lo como do tipo CityTax
Dim TaxAmount As Double
TaxAmount = Item.CalculateTax(SaleAmount)
MsgBox("A taxa : " & Format(TaxAmount, "C"))
End Sub
120
O exemplo acima cria uma classe bsica que permite que um mtodo seja substitudo. Em seguida h
uma classe derivada que substitui a implementao original da classe bsica alterando o valor
retornado.
2 Porlimorfismo baseado em Interface
A interface, j vista anteriormente, outra forma que o VB .NET implementa o polimorfismo. A
inteface define mtodos e propriedades assim como classes, mas no implementa (cria) o cdigo de
cada procedimento, ao invs disso ele permite que a classe crie sua prpria implementao.
O polimorfismo baseado em Interface quando os mtodos e propriedades definidas pela interface
so implementadas de formas diferentes em diversas classes. A grande diferena entre o
polimorfismo baseado em Interface e o polimorfismo baseado em herana que o primeiro no
precisa utilizar uma classe bsica para herdar (Comando Implements) enquanto que o ltimo exige
uma classe bsica (Comando Inherits).
Exemplo de polimorfismo baseado em Interface
Public Interface Figura
Function Calcularrea(ByVal X As Double, ByVal Y As Double) As Double
End Interface
Public Class Tringulo
Implements Figura
Function Calcularrea(ByVal X As Double, ByVal Y As Double) As _
Double Implements Figura.Calcularrea
' Calcula a rea do tringulo.
Return 0.5 * (X * Y)
End Function
End Class
Public Class Retngulo
Implements Figura
Function Calcularrea(ByVal X As Double, _
ByVal Y As Double) As Double Implements Figura.Calcularrea
' Calcula a rea do retngulo.
Return X * Y
End Function
End Class
Sub ProcessarFigura(ByVal Figura2 As Figura, ByVal X As Double, ByVal Y As Double)
MessageBox.Show("A rea do objeto " & Figura2.Calcularrea(X, Y))
End Sub
Sub TestarInterface()
Dim Retngulo2 As New Retngulo( )
Dim Tringulo2 As New Tringulo( )
ProcessarFigura(Tringulo2, 3, 14)
ProcessarFigura(Retngulo2, 3, 5)
End Sub
121
O exemplo acima cria uma interface que implementada em duas classes diferentes. No
procedimento TestarInterface cada objeto utiliza seu mtodo Calcularrea especfico
Para criar uma hierarquia de classes bem desenhadas preciso seguir os seguintes conselhos :
Crie uma hierarquia de classes comeando com classes bsicas mais gerais possveis e
derivando classes cada vez mais especficas. Por exemplo quando se deseja criar uma
hierarquia de classes que modelam o hardware do computador, pode-se criar classes
derivadas com o nome de cada dispositivo como Monitor, teclado, mouse. Em seguida podese criar classes derivadas nas prximas hierarquias com o nome de tipos de Monitores, tais
como MonitoresColoridos, MonitoresDigitais, etc.
Prefira variveis que possuam grande capacidade de armazenamento para facilitar quaisquer
mudanas de armazenamento no futuro. Por exemplo, quando uma classe requer usar uma
varivel apenas do tipo Integer, ento escolha o tipo Long mais abrangente.
Somente exponha os itens que a classe derivada necessite, isto utilize o declarador Public
com cautela, ao invs disso utilize Private para proteger os itens da classe bsica que no
interessam a classe derivada.
Os itens que sero necessrio para a classe derivada devem ser marcados com o declarador
Protected, reduzindo o nmero de classes que sero dependentes desse item.
Como regra geral imprescindvel definir como os membros (propriedades, campos e mtodos) da
classe devero ser acessados, declarando-os com os modificadores de acesso, desta forma possvel
controlar como os membros sero usados. Conforme abaixo :
122
Todos os membros internos da classe devero ser declarados como Private, assim somente o
cdigo dentro da classe em que foi definido, poder acessar este membro.
Todos os membros que devero ser usados somente dentro da classe ou por classes derivadas
devem devem ser declarados com Protected. Assim esse membro s ser acessvel dentro do
cdigo da classe que o definiu e dentro do cdigo das classes derivadas dessa classe bsica.
Todos os membros que devero ser acessados por mdulos externos a classe, devem ser
declarados como Friends. Assim o membro poder ser acessado somente por mdulos que
fazem parte do projeto da classe.
Todos os membros que devero ser acessados por toda a hierarquia de classes devero ser
declarados com Public.
Toda hierarquia de classes pode sofrer um problema chamado de Classes de base frgil (Fragile
base Classes) que significa que mudanas feitas na classe bsica afetam todas as classes derivadas
obrigando a recompilao e redistribuo dos componentes.
A hierarquia de classes pode sofrer mudanas desde a alterao das necessidades do software at a
ausncia de algum elemento no codificado por esquecimento.
A melhor forma de evitar o problema Fragile base Classes modificar somente a classe derivada,
mas quase sempre isso no possvel. De forma geral o problema no pode ser eliminado, mas
pode ser reduzido utilizando os seguintes recursos :
123
2.20 Multithreading
Os aplicativos codificados com a tecnologia .NET podem executar vrias tarefas simultaneamente
usando um processo chamado Multithreading (threading livres) que separa as tarefas em pedaos
separados em fila para execuo no sistema operacional. Esse tipo de processamento melhora o
desempenho do aplicativo pois de um lado o aplicativo centraliza os procedimentos de validao de
entradas do usurio enquanto o sistema operacional executa outras tarefas de threads separados.
De forma mais resumida, um aplicativo Multithreading poderia validar as digitaes feitas por um
usurio em um primeiro thread, e concomitantemente o aplicativo executaria complexos clculos
matemticos em um segundo thread junto com uma atualizao do banco de dados em um terceiro
thread. Ao passo que um aplicativo de um simples thread, deveria aguardar a validao de dados em
seguida efetuaria complexos clculos e somente aps o trminos dos processamentos anteriores
atualizaria o banco de dados.
Para criar um Thread, crie uma varivel de classe Thread e utilize o operador AddressOf com o
endereo de um procedimento :
Dim MyThread As New System.Threading.Thread(AddressOf MySub)
MyThread.Start() inicia um Thread
MyThread.Abort() finaliza um Thread
MyThread.Sleep () Causa uma pausa no Thread
MyThread.Suspend () suspende um Thread
Cada Thread tem sua prioridade, isto o tempo que o sistema operacional trata o processo como alta
prioridade enquanto os outros so tratados como de baixa prioridade. A propriedade Priority ajusta o
valor para essa prioridade. As enumeraes possveis para esse propriedade so (Do maior para o
menor) :
Enumerao
Highest
AboveNormal
Normal
125
BelowNormal
Lowest
Um thread pode ser divido em primeiro plano e segundo plano, os de primeiro plano so executados
indefinidamente enquanto que os de segundo plano ficam em fila. possvel mudar o estado de
segundo plano utilizando a propriedade IsBackground.
Uma vez um thread em execuo, como no exemplo MyThread.Start( ), possvel mudar o seu
estado de execuo utilizando a propriedade ThreadState que usa um ou mais itens da enumerao
System.Threading.ThreadState. Assim por exemplo possvel colocar um processo Thread em
modo de espera Thread.Sleep( tempo) onde tempo um valor em milissegundos determinados ou
um Thread.Sleep (System.Threading.Timeout.Infinite) que s pode ser religado ou interrompido
por Thread.Interrupt.
Os threads do mesmo aplicativo trabalham sob o mesmo espao de memria, e para evitar que um
thread utilize um mesmo dado de outro thread, necessrio utilizar sincronizao. Um thread
independente pode ser sincronizado com outro thread diferente, assim quando um processo acaba o
outro inicia automaticamente e sincronizadamente. Por exemplo um thread executa um procedimento
que classifica um nome por ordem alfabtica e um outro thread aguarda esta classificao para
depois utilizar os dados.
Os eventos so as formas mais comuns de sincronizar threads. Um thread dispara um evento e
sinaliza ao programa principal ou outro thread o estado do processamento.
O comando SyncLock permite sincronizar threads, evitando que mltiplos threads acessem o mesmo
dado compartilhado ao mesmo tempo. O cdigo escrito entre o bloco SyncLock ... End SyncLock
fica bloqueado, assim o compilador executa de modo exclusivo todo o cdigo dentro do bloco
SyncLock .. EndLock. Exemplo :
Class Cache
Private Shared Sub Add(ByVal x As Object)
SyncLock GetType(Cache)
End SyncLock
End Sub
Private Shared Sub Remove(ByVal x As Object)
SyncLock GetType(Cache)
End SyncLock
End Sub
End Class
Note que toda a expresso dentro do bloco SyncLock deve ser do Tipo Referncia (veja
explicaes nos captulos anteriores), como por exemplo Classe, Delegate, Interface, Mdulo ou
Matriz.
No exemplo anterior uma classe possui um thread exclusivo para o mtodo Add e outro para
Remove, isto evita que um item seja removido enquanto ele ainda est sendo adicionado pela classe.
Outro recurso para sincronizao o mtodo Thread.Join que determina se um thread terminou uma
tarefa antes que outro thread inicie outra tarefa. O mtodo Join aguarda um tempo at que um thread
finalize a execuo da tarefa, se a tarefa for completada o mtodo Join retorna True, seno retorna
False.
126
Acesso Seqencial Grava e l dados do tipo texto em um bloco contnuo. Qualquer arquivo
de texto um arquivo seqencial.
Acesso Randmico Grava e l dados do tipo texto e binrio em estruturas de registros. Para
criar arquivos Randmicos so utilizados tipos de dados compostos para gerar registros com
diversos tipos de dados diferentes que so gravados como campos.
Acesso Binrio Grava e l dados com estruturas e formatos diversos.
130
Os arquivos de texto so geralmente abertos pelo modo seqencial com a funo FileOpen, alis a
Microsoft recomenda utilizar a classe System.IO para tal finalidade. Antes porm deve ser
especificado o modo como os caracteres devem ser manipulados. Exemplo :
FileOpen(1, "TESTE", OpenMode.Input)
' Fecha o arquivo antes de abr-lo em outro modo.
FileClose(1)
OpenMode.Input deve ser usado se o arquivo j existe, caso contrrio gera um erro.
OpenMode.Output deve ser usado se o arquivo no existe, pois este mtodo cria um novo
arquivo.
OpenMode.Append deve ser usado se o arquivo no existe, pois este mtodo cria um novo
arquivo.
Alm disso obrigatrio informar um nmero (canal) livre para que o sistema operacional possa
manipular o arquivo, geralmente a forma correta sempre utilizar a funo FreeFile que seleciona o
canal livre automaticamente. Finalmente aps utilizar o arquivo necessrio fech-lo com a funo
FileClose (NrCanal).
Para editar um arquivo j aberto preciso ler o arquivo e atribuir seu contedo a variveis, em
seguida alterar o seu contedo e retornar o valor dessas variveis ao arquivo original. H 3 funes
que copiam o contedo de um arquivo de texto para variveis :
LineInput Essa funo l uma linha inteira de um arquivo e reconhece o final da linha
automaticamente quando encontra a seqncia de Carriage Return (chr(13) - Tecla Enter) ou (chr(13)
+ chr(10)). Essa funo no inclui essas seqncias no contedo para a varivel.
InputString Essa funo permite que seja determinado um nmero de caracteres a serem lidos e
atribudos a varivel. Essa funo deve ser usado somente nos modos Input ou Binary.
Input Essa funo l os dados strings e nmeros de um arquivo at encontrar caracteres
delimitadores tais como vrgula, espao e etc. Tais caracteres delimitadores finalizam a execuo da
funo.
Dim LinhaDoTexto As String
Dim CanalVazio as integer
CanalVazio = FreeFile( )
FileOpen(CanalVazio, "ArquivoTeste", OpenMode.Input) ' Abre o arquivo
While Not EOF(1) ' Loop at o final do arquivo.
LinhaDoTexto = LineInput(CanalVazio) ' L a linha e joga para a varivel.
Debug.WriteLine(LinhaDoTexto) ' Exibe o contedo na janela Output do IDE.
End While
FileClose(CanalVazio) ' Fecha o arquivo.
A funo LineInput l um caracter por vez at encontrar a seqncia de Return do final de linha. Essa
seqncia no includa no contedo da varivel. No exemplo acima o nmero de arquivo
disponvel foi determinado pela funo FreeFile, em seguida a linha de texto encontrada foi
atribuda a varivel LinhaDoTexto.
Se for necessrio incluir a seqncia de Return varivel, ser necessrio adicionar o cdigo :
LinhaDoTexto = LinhaDoTexto & Chr(13) & Chr(10)
A funo InputString deve ser usado da seguinte forma :
131
PrintLine(1, "Ol", " ", "Mundo") ' Separa duas strings por espao.
PrintLine(1, SPC(5), "5 medidas de espaamento ") ' Grava string com 5 medidas de espao aps o
incio do texto
PrintLine(1, TAB(10), "Ol") ' Grava uma palavra na coluna 10.
' Assign Boolean, Date, and Error values.
Dim aBool As Boolean
Dim aDate As DateTime
aBool = False
aDate = DateTime.Parse("February 12, 1969")
' Datas e valores booleanos so traduzidos automaticamente usando as configuraes locais do
computador
PrintLine(1, aBool, " Valor Booleano")
PrintLine(1, aDate, " Data")
FileClose(1) ' Fecha o arquivo.
O arquivo lixo.txt ter o seguinte contedo quando aberto por qualquer editor de texto simples, como
por exemplo o bloco de notas :
Texto qualquer.
Zona 1
Zona 2
Ol
Mundo
5 medidas de espaamento
Ol
False
Valor Booleano
12/2/1969
Data
o exemplo a seguir demonstra as funes Write e WriteLine :
FileOpen(1, "c:\Lixo2.txt", OpenMode.Output) ' Abre um arquivo output.
Write(1, "Texto qualquer.") ' Grava um texto.
WriteLine(1) ' Grava uma linha em branco.
WriteLine(1, "Zona 1", TAB(), "Zona 2") ' Grava duas colunas de texto separados por Tabulao.
WriteLine(1, "Ol", " ", "Mundo") ' Separa duas strings por espao.
WriteLine(1, SPC(5), "5 medidas de espaamento ") ' Grava string com 5 medidas de espao aps o
incio do texto
WriteLine(1, TAB(10), "Ol") ' Grava uma palavra na coluna 10.
' Assign Boolean, Date, and Error values.
Dim aBool As Boolean
Dim aDate As DateTime
aBool = False
aDate = DateTime.Parse("February 12, 1969")
' Datas e valores booleanos so traduzidos automaticamente usando as configuraes locais do
computador
WriteLine(1, aBool, " Valor Booleano")
WriteLine(1, aDate, " Data")
FileClose(1) ' Fecha o arquivo.
O arquivo Lixo2.txt ter o seguinte contedo quando aberto por um editor de texto simples :
133
"Texto qualquer.",
"Zona 1",,"Zona 2"
"Ol"," ","Mundo"
"5 medidas de espaamento "
,"Ol"
#FALSE#," Valor Booleano"
#1969-02-12#," Data"
Observe que as funes Write e WriteLine gravam dados booleanos e datas com os caracteres #;
todos os strings so gravados com aspas e alm disso as datas so sempre gravadas no formato
universal Ano/Dia/Ms. Os nmeros decimais devem ser informados utilizando o separador decimal
ponto (.).
Um arquivo randmico (aleatrio) possui registros de tamanhos pr-definidos e cada registro
composto por um ou mais campos. Para abrir arquivos do tipo randmico necessrio criar todas as
variveis ou estruturas de variveis que correspondam aos dados originais do arquivo antes de abrir e
acessar os dados desse arquivo.
Os dados strings de arquivos aleatrios podem possuir tamanhos pr-definidos que podem ser
estruturados utilizando o atributo VBFixedString da plataforma .NET. Se o tamanho dos dados
originais forem menores que os dados compostos recm criados, ento o VB preenche os vazios com
espaos caso contrrio os registros sero truncados.
Exemplo de criao de tipos de dados compostos :
Structure DadosPessoais
Public ID As Integer
Public Salrio As Decimal
Public ltimaReviso As Long
<VBFixedString(15)> Public PrimeiroNome As String
<VBFixedString(15)> Public ltimoNome As String
<VBFixedString(15)> Public Cargo As String
<VBFixedString(150)> Public Observaes As String
End Structure
Declara uma varivel do tipo composto.
Public Empregado As DadosPessoais
' Cria uma trilha para o registro atual
Public Posio As Long
' Pega o nmero do ltimo registro do arquivo.
Public ltimoRegistro As Long
A estrutura de um arquivo aleatrio semelhante a figura abaixo, onde os dados so gravados de
acordo com a estrutura especificada, assim no exemplo abaixo o campo1 Nome possui o tipo de
dados string com 6 posies enquanto que o campo2 Sobrenome do tipo string com 7 posies.
A largura total do registro igual ao Campo1 + Campo2 ou seja 13 posies.
134
Para abrir um arquivo do tipo randmico, necessrio utilizar a funo FileOPen com um
argumento que indica a largura de cada registro do arquivo. O tamanho de registro mximo
32.767 bytes. Exemplo :
Structure Pessoa
<VBFixedString(30)> Dim Nome As String
Dim ID As Integer
End Structure
' Conta 30 dgitos para o string mais 4 dgitos do tipo Integer.
FileOpen(1, "TESTE", OpenMode.Random, , , 34)
' Fecha o arquivo antes de abrir em outro modo.
FileClose(1)
A forma mais correta de determinar o tamanho de uma estrutura utilizar a funo Len que retorna o
total de caracteres de uma estrutura. Exemplo :
Dim Meu as Pessoa
' A funo determina o tamanho da estrutura
FileOpen(1, "TESTE", OpenMode.Random, , , Len(Meu))
' Fecha o arquivo antes de abrir em outro modo.
FileClose(1)
Para editar um arquivo aleatrio preciso ler os registro para uma varivel em seguida altere os
valores dessas variveis e finalmente grave os novos dados no arquivo. O mtodo FileGetObject
deve ser usado para ler os registros do arquivo para uma estrutura de variveis, h vrias funes
para esta finalidade porm a Microsoft recomenda utilizar FileGetObject para evitar erros de
compilao quando eventualmente salvar algum registro do tipo Object para o arquivo. Exemplo :
Dim c As String
FileSystem.FileOpen(1, "teste.txt", OpenMode.Random)
FileSystem.FilePutObject(1, "ABCDEF")
FileSystem.Seek(1, 1)
FileSystem.FileGetObject(1, c)
System.Console.WriteLine(c)
FileSystem.FileClose(1)
O exemplo acima cria um arquivo aleatrio com a extenso (*.txt), observe que os dados string no
podem ser acessveis a leitura humana, assim se o arquivo for aberto pelo Bloco de Notas os dados
sero os seguintes :
Ao passo que o mtodo FilePutObject converte os dados lidos no arquivo para um formato
condizente para leitura. Alm disso o mtodo FileGetObject pode utilizar vrias sintaxes como por
exemplo :
FileGetObject (NmeroArquivo, varivelQualquer, NrRegistro)
NmeroArquivo o nmero do arquivo aberto com a funo FileOpen.
varivelQualquer Uma varivel qualquer que recebe os dados lidos do arquivo.
NrRegistro O primeiro registro de um arquivo aleatrio 1, o segundo registro de um arquivo
aleatrio 2, o terceiro registro 3 e assim por diante.
135
A funo Seek retorna a posio atual de um cursor (leitura ou gravao) em um arquivo aleatrio ou
define a posio de um cursor (leitura ou gravao) em um arquivo aleatrio.
Structure Registro
Dim Nome As String
Dim ID As Integer
End Structure
Public Sub Procurar(ByVal ndice As Integer)
Try
FileOpen(1, "c:\pessoas.txt", OpenMode.Random)
Dim umaPessoa As Registro
Seek(1, ndice)
FileGet(1, umaPessoa)
FileClose(1)
Console.WriteLine(umaPessoa.Nome & " " & umaPessoa.ID)
Catch
manipula qualquer erro de execuo aqui
End Try
End Sub
Para adicionar registro basta utilizar a funo FilePut informando a posio do registro sempre
posterior ao ltimo registro do arquivo, assim ltimaPosio + 1. Para substituir um registro use a
funo FilePut informando a posio do registro a ser alterado.
Para apagar registro em arquivo aleatrio deve-se seguir os passos abaixo :
1.
2.
3.
4.
OpenMode.Random,
OpenAccess.ReadWrite,
136
FilePut(NrArquivo, Pessoa, 2)
Seek(NrArquivo, 2)
FileGet(NrArquivo, Pessoa, 2)
MsgBox(Pessoa.ID & " " & Pessoa.Nome)
FileClose(NrArquivo)
End Sub
A mensagem ser : 2 Antonio Carlos
Conforme mostrado no exemplo acima, possvel utilizar funes como FilePut e FileGet da mesma
forma que FilePutObject e FileGetObject.
Os arquivos de acesso Binrio so normalmente arquivos de pequeno tamanho pois no necessitam
de variveis com tamanhos pr-fixados, alm disso esse tipo de arquivo no pode ser lido
aleatoriamente pois no h como saber a posio especfica do incio ou fim de registros.
Para abrir um arquivo de acesso binrio utilize a funo FileOPen com o parmetro
OpenMode.Binary, alm disso no informe o nmero (largura) dos registros.
Exemplo :
Structure Registro
Dim Nome As String
Dim ID As Integer
End Structure
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Dim Pessoa As Registro, NrArquivo As Integer, TamanhoRegistro As Integer
NrArquivo = FreeFile()
TamanhoRegistro = Len(Pessoa)
FileOpen(NrArquivo, "C:/Pessoa.txt", OpenMode.Binary)
Pessoa.ID = 1
Pessoa.Nome = "Luiz"
FilePut(NrArquivo, Pessoa)
Pessoa.ID = 2
Pessoa.Nome = "Antonio Carlos"
FilePut(NrArquivo, Pessoa)
Seek(NrArquivo, 2)
FileGet(NrArquivo, Pessoa,2)
MsgBox(Pessoa.ID & " " & Pessoa.Nome)
FileClose(NrArquivo)
End Sub
A mensagem ainda ser : 2 Antonio Carlos
137
O exemplo acima utiliza o mesmo cdigo do exemplo anterior, observe que na estrutura Registro foi
eliminado o parmetro <vbFixedString> pois no mais necessrio, alm disso as funo FilePut
no utilize o parmetro PosioRegistro. A vantagem que o arquivo final gravado no disco possui
um tamanho menor em comparao ao mesmo arquivo com acesso aleatrio do exemplo anterior.
Outro exemplo :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Dim pixel As Byte, NrArquivo As Integer, i As Integer
Dim pixels As String
NrArquivo = FreeFile()
FileOpen(NrArquivo, "C:/Imagempreto.bmp", OpenMode.Binary)
For i = 1 To 10
FileGet(NrArquivo, pixel, i)
pixels = pixels & pixel
Next i
FileClose(NrArquivo)
MsgBox(pixels)
End Sub
O exemplo acima abre um arquivo de imagem e retorna os bytes recolhidos pela funo FileGet e
exibe um aviso na tela.
Concluso
As funes de acesso seqencial (Input, Output e Append) devem ser utilizados para ler e
gravar arquivos de texto; logs de erros ou relatrios.
AS funes de acesso aleatrio (Random) devem ser usados para ler e gravar dados para um
arquivo sem fech-lo, alm de buscar informaes rapidamente.
As funes de acesso binrio (Binary) devem ser usados para ler e gravar bytes em qualquer
posio de um arquivo, como por exemplo salvar ou exibir arquivos bitmap.
Tipo de acesso
Sequential
(seqencial)
Random (aleatrio)
Binary (Binrio)
Gravao de dados
Leitura de dadps
Funes Print,
Funo InputString
PrintLine
Funo FilePut
Funo FileGet
Funo FilePut
Funo FileGet
A nica limitao que o objeto FSO no permite criar arquivos binrios, para isso necessrio usar
as tcnicas descritas no captulo anterior. Abaixo uma tabela que descreve os objetos disponveis do
FSO :
Objeto
FileSystemObject
Drive
Folder
File
TextStream
Descrio
Permite criar, apagar, obter informaes e manipular drivers, pastas,
arquivos.
Permite obter informaes sobre um drive do sistema, tal como um disco
rgido, um CD-Rom, um disco RAM ou um drive de rede LAN.
Permite criar, apagar, mover pastas como outras informaes importantes.
Permite criar, apagar ou mover arquivos assim como outras informaes
importantes.
Permite ler e gravar arquivos de texto.
Para utilizar os servios do FSO basta fazer uma referncia a biblioteca de Scripting no projeto VB
.NET conforme os passos abaixo :
1.
2.
3.
4.
Clique no menu do IDE : Project > Add Reference e escolha a aba COM.
Selecione da lista de componentes a opo Microsoft Scripting Runtime.
Crie o objeto FSO : Dim meu as New Scripting.FileSystemObject
Ou crie o objeto FSO : meu = CreateObject (Scripting.FileSystemObject)
O item 3 s pode ser utilizado em projetos VB e o item 4 pode ser utilizado em projetos VB e
VBScript. A janela Object Browser do IDE exibe o nome da biblioteca, alm de suas propriedades,
mtodos e colees. NO exemplo acima Scripting refere-se ao nome da biblioteca e
FileSystemObject refere-se a um objeto dessa biblioteca.
Abaixo segue uma tabela de alguns mtodos do objeto FileSystemObject :
Tarefa
Cria um novo objeto
Apagar um arquivo ou pasta
Copiar um objeto
Mover um objeto
Acessar um drive, pasta ou arquivo
C omando
CreateFolder ou CreateTextFile
DeleteFile ou File.Delete; DeleteFolder ou
Folder.Delete
CopyFile ou File.Copy; CopyFolder ou
Folder.Copy
MoveFile ou File.Move; MoveFolder ou
Folder.Move
GetDrive, GetFolder, ou GetFile
H alguns comandos com a mesma finalidade, como por exemplo para copiar um arquivo utilize o
mtodo CopyFile do objeto FileSystemObject ou utilize o mtodo Copy do objeto File. Segundo a
Microsoft, a razo de ter includo esses comandos para a mesma tarefa, de oferecer maior
flexibilidade de programao.
O objeto Drive obtm informaes sobre vrios drives do sistema, atravs das seguintes propriedades
:
Propriedade
TotalSize
Descrio
Tamanho do Drive em bytes.
139
AvailableSpace, FreeSpace
DriveLetter
DriveType
SerialNumber
FileSystem
IsReady
ShareName, VolumeName
Path, RootFolder
As propriedades Path (App.Path), ChDrive e ChDir statements, e funo CurDir podem retornar um
valor conhecido como Universal Naming Convention (UNC) (Conveno de nome Universal)
(semelhante \\Server\Share) ao invs do caminho padro (tal como e:\Folder), dependendo de
como se executa o aplicativo ou projeto :
Tarefa
Cria uma pasta
Apaga uma pasta
Move uma pasta
Copia uma pasta
Retorna o nome de uma pasta
Verifica se uma pasta existe no drive.
Manipula uma cpia de um objeto Folder
existente..
procura o nome de subpastas..
Procuta o caminho de uma pasta do sistema..
Tarefa
Cria um arquivo de texto sequncial
Adiciona dados ao texto
L dados de um arquivo de texto
Move um arquivo
Copia um arquivo
Apaga um arquivo
140
Exemplo :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Dim fso As New Scripting.FileSystemObject(), fldr As Scripting.Folder
fldr = fso.CreateFolder("C:\MeuTeste")
MsgBox("Pasta Criada: " & fldr.Name)
End Sub
142
Se ocorrer o nmero do erro especificado no filtro ento o cdigo dentro de Catch executado at
que o controle seja passa para o bloco Finally.
3. O erro filtrado com base na combinao dos filtros 1 e 2 listados acima :
Exemplo de criao de uma estrutura de tratamento de excees :
Function LerStringsDoArquivo(ByVal NomeArquivo As String) As Collection
Dim Strings As New Collection
Dim Stream As System.IO.StreamReader = System.IO.File.OpenText(FileName) Abre o arquivo.
Try
While True ' O loop encerrado no erro da classe EndOfStreamException
' de final de arquivo.
Strings.Add(Stream.ReadLine())
End While
Catch eos As System.IO.EndOfStreamException
' Nenhuma ao necessria pois j foi alcanado o final do arquivo..
Catch IOExcep As System.IO.IOException
' Qualquer outro erro ocorreu. Exibe uma mensagem e limpa a coleo.
MsgBox(IOExcep.Message)
Strings = Nothing
Finally
Stream.Close() ' Fecha o arquivo.
End Try
Return Strings
End Function
O exemplo acima utiliza a classe IO.StreamReader da plataforma .NET para abrir um arquivo de
texto e colocar seu contedo em uma coleo. Quando uma exceo de final de arquivo encontrado
o controle do sistema automaticamente reposicionado para o primeiro bloco Catch. Se qualquer
outro erro da classe for acionado, ento o controle do sistema reposicionado para o segundo bloco
Catch.
Observe que no importa a ao tomada pelo bloco Catch, o bloco Finally ser executado
normalmente. Alm disso se a exceo for diferente das classes IOException e
EndOfStreamException, o controle do sistema vai propagar o erro para o cdigo chamador, que
possivelmente no tem um manipulador de erro disponvel.
Todo o cdigo dentro de um manipulador estruturado de excees deve utilizar uma cpia da classe
Exception, diferentemente de um manipulador no estruturado de excees que no a utiliza. Toda
vez que uma exceo provocada, o objeto Err preenchido e uma cpia da classe Exception
criado automaticamente pelo VB .NET.
A classe Exception possui propriedades que informam a localizao, o tipo e a causa do erro, tais
como : a propriedade StackTrace lista os mtodos que causaram o erro; a propriedade Message
uma mensagem de texto que descreve o erro; a propriedade HelpLink configura um link a um
arquivo de ajuda disponvel; a propriedade Source contm o nome do objeto que causou o erro.
143
Sub TesteErro ()
' Declarao de variveis
Dim x As Integer, y As Integer, z As Integer
' O manipulador de excees chamado de DivisoPorZero.
On Error GoTo DivisoPorZero
' Parte do cdigo que pode causar um erro..
x=2
y=0
z=x\y
' Esta linha desliga o manipulador de excees.
On Error GoTo 0
Console.WriteLine(x & "/" & y & " = " & z)
' Sai da rotina antes do incio do manipulador de erros.
' Seno pode causar resultados inesperados.
Exit Sub
' Este o manipulador de erros que trata do erro especfico.
DivisoPorZero :
' Exibe uma mensagem amigvel ao usurio para que este conhea o que est acontecendo.
Console.WriteLine("Voc tentou dividir um nmero qualquer por zero!")
' Oferece uma soluo para o erro.
y=2
' O comando Resume retorna ao ponto que ocorreu o erro
' para que o aplicativo continue com a execuo.
Resume
End Sub
No exemplo acima, o manipulador de erros foi desenhado somente para interceptar qualquer diviso
por zero, assim o manipulador de erros desligado quando o compilador executa a diviso x por y e
no ocorre excees. Qualquer outra exceo exibe a mensagem de erro e finaliza a execuo do
programa.
145
Os softwares devem trocar dados entre si sem importar com a linguagem de programao que
foram criados.
O software deve ser executado em diferentes sistemas operacionais e em diferentes tipos de
mquinas sem a necessidade de recompilar o cdigo fonte (a compilao em baixo-nvel
ainda ocorrer na plataforma onde for instalado o aplicativo.)
O CLI mais uma especificao (regra geral) para criar componentes e especifica como o cdigo
executvel de um programa deve ser carregado, executado e gerenciado. Essa especificao melhora
o antigo modelo Component Object Model (COM) criado em 1992 pela Microsoft que era utilizado
para criar softwares para o Windows de verses antigas.
Esse antigo mecanismo COM permitia que os desenvolvedores Visual Basic criassem arquivos do
tipo DLL e EXE que rodassem no Windows. Esses componentes DLL e EXE tinham interfaces
(mtodos, funes, propriedades e eventos) que eram utilizados por outros programas e
desenvolvedores de outras linguagens de programao. O problema era que ao passar um tipo de
dados de um aplicativo criado em uma linguagem para outro, os dados deveriam ser traduzidos para
o formato original do componente, caso contrrio haveria um erro de execuo.
146
Com a nova especificao CLI, esse problema resolvido com a criao de um novo modo de passar
dados chamado de Common Type System (CTS) que determina como os tipos so declarados e
usados, entretanto a CLI ainda no foi criada para outros sistemas operacionais diferentes do
Windows, mas tanto a Microsoft como outros fabricantes anunciaram a inteno de cri-lo para
outros sistemas. O CTS oferece alguns recursos :
A Microsoft criou uma segunda especificao derivada da CLI denominada Common Language
Runtime (CLR) especialmente para a plataforma .NET Windows que no est sob o controle do
ECMA. A parte do CLR que controla o carregamento, execuo e gerenciamento de aplicativos
.NET chamado de Virtual Execution System (VES). O cdigo executado pelo VES chamado de
cdigo gerenciado (managed code), assim todo o aplicativo criado pela tecnologia .NET managed
code.
A CLI define um conjunto de bibliotecas (libraries - dll) que contm classes que desempenham
tarefas especficas, alm disso a CLI determina que seja criada perfis (conjunto de bibliotecas) para
cada plataforma. As bibliotecas da CLI so:
Runtime Infrastructure Library - Essa biblioteca fornece os servios essenciais necessrios para
compilar e executar um aplicativo baseado na especificao CLI.
Base Class Library Esta biblioteca fornece os servios de runtime que so necessrio para as
linguagens de programao, tais como o VB. Alm disso os tipos de dados primitivos so definidos
nessa biblioteca.
Network Libray Esta biblioteca oferece servios de rede.
Reflection Library Esta biblioteca oferece servios tanto para examinar os tipos de dados quanto
para invocar os membros desse objeto todos em modo de execuo, mesmo que estejam em modo de
compilao.
XML Library Oferece servios de XML.
Floating Point Library Oferece suporte a operaes e tipos de ponto flutuante.
Extended Array Library Oferece suporte a matrizes multidimensionais.
Os perfis detalhados anteriormente so os seguintes :
Kernel Profile Define as funcionalidades mnimas do sistema operacional utilizado, alm disso
deve incluir as bibliotecas Base Class e Runtime Infrastructure.
Compact Profile Inclue as funcionalidade do Kernel Profile + Network + Reflection + XML,
todos de forma compacta.
Note que a CLI no inclui algumas bibliotecas especficas da Microsoft tais como Windows Forms,
ASP.NET e ADO.NET pois todos foram criados especialmente para as plataformas Windows. Estas
classes foram criadas somente para essas implementaes. Por exemplo o Windows 2000 aceita
todas as bibliotecas CLI alm de bibliotecas adicionais no definidas pela CLI.
1 NameSpaces
147
NameSpaces (EspaoNomeado) so similares a pastas que agrupam vrias classes com mtodos,
funes e propriedades diferentes. Dentro de um NameSpace no permitido incluir dois mtodos
com o mesmo nome, ou duas classes com o mesmo nome, dessa forma no h nomes ambguos no
mesmo espao.
Os NameSpaces so utilizados somente para declarar uma varivel objeto com um Tipo
Completamente Qualificado. Exemplo :
Dim varivelQualquer as new System.IO
Nos tempos ureos do C++, os fabricantes de software criavam vrias classes especficas e
colocavam venda no mercado. Entretanto quando o consumidor instalava vrias classes diferentes
no seu computador, o compilador no conseguia executar as aes pois haviam vrias classes e
membros com o mesmo nome.
Ento para colocar ordem nessa baguna os comits internacionais decidiram criar uma forma de
distribuir as vrias classes em lugares nomeados, assim criou-se os NameSpaces.
2 Mdulos e Assemblies
Um mdulo um arquivo .dll ou .exe. Um Assembly um conjunto de um ou mais mdulos que
foram utilizados na criao do aplicativo. Se um aplicativo est contido em um nico executvel
.exe, ento h apenas um mdulo assembly. Se o executvel .exe est distribudo em dois arquivos
.dll mas que no podem ser executados separadamente, ento os trs arquivos juntos formam um
Assembly. Se o produto uma bliblioteca de classe contida em um nico arquivo .dll, ento esse
arquivo um Assembly.
Quando um assembly criado e distribudo aos consumidores, um de seus mdulos contm o
Assembly Manifest, que contm informaes gerais sobre todo o assembly tais como a lista de
mdulos existentes neste assembly, a verso do assembly, idioma, etc.
Quando um cdigo fonte compilado, o compilador precisa resolver os nomes dos tipos utilizados
nesse cdigo fonte para as definies dos tipos, se o compilador encontrar a referncia no mesmo
projeto ento ele cria as definies. Mas quando as referncias esto fora do cdigo fonte o
compilador precisa saber o lugar exato dessas referncias para criar as definies de tipo, para isso
utiliza-se a referncia aos assemblies que contm essas informaes. Por exemplo pode-se compilar
na linha de comando um projeto que faz referncia a uma classe (Assembly) com um tipo de dados
especfico.
Vbc MeuCdigo.vb /reference : System.Drawing.dll
Na documentao original do VB, diz-se que o argumento aps o comando /reference : um
assemblie, entretanto isto no est muito correto, pois este argumento o nome de apenas um
mdulo do Assembly que contm o Assembly Manifest.
Quando um projeto VB .NET criado, o sistema automaticamente faz referncia a dois assemblies
(Assembly Manifest) :
1. mscorlib.dll Contm todos os tipos do espao Nomeado System.
2. Microsoft.VisualBasic.dll Contm todos os tipos encontrados na linguagem Visual Basic,
isto o espao nomeado Microsoft.VisualBasic.
3 Global Assembly Cache (GAC)
148
NO primeiro caso cada mtodo compilado somente quando for necessrio, assim quando o mtodo
compilado, o sistema chama faz vrias chamadas ao mecanismo de compilao e acessa
diretamente o cdigo compilado. O cdigo compilado no gravado no disco, assim quando o
procedimento finalizado ou reiniciado, toda a compilao reexecutada novamente. Este processo
chamado de compilao Just-In-Time (JIT).
No segundo caso, o aplicativo compilado completamente no momento da instalao.
Note que no Sistema Operacional Windows todo o cdigo compilado para linaguagem nativa
e no interpretado.
149
6 Metadata
O atual CLR no utiliza mais o mecanismo de Reference counting, ao invs disso mantm um
ponteiro para o endereo em que a memria livre (memria Heap) comea, e a cada solicitao do
programa ele incrementa o ponteiro com o objeto necessrio e posiciona no prximo endereo de
memria disponvel, esse mecanismo de alocao de memria muito rpida, este processo se repete
enquanto durar a capacidade de memria do computador e nenhuma ao executada at que o
objeto no esteja mais sendo utilizado pelo aplicativo.
Quando no h mais recursos na memria Heap, ento o gerenciador de memria inspeciona todas as
posies de memria alocadas anteriormente que podem ser liberadas examinando as variveis do
aplicativo que faz referncia aos objetos. Quando esses objetos em que as variveis apontam
(referenciam) esto em uso, o gerenciador consegue visualiz-las atravs das variveis do programa,
pois o runtime tem acesso total a todas as informaes dos tipos declarados no aplicativo. Assim o
gerenciador de memria pode encontrar todas as posies da heap que esto em uso.
Durante este processo, o runtime certifica que todos os blocos de memria esto preenchidos de
forma contnua desde o incio do heap, liberando os espaos remanescente para satisfazer as novas
necessidades da memria em uso quando o runtime no encontrar mais as variveis que referenciam
o objeto alocado na memria.
Este processo de liberar memria conhecido como Garbage Collection (GC), esse termo se aplica
a todos os mtodos de gerenciamento de vida til (lifetime management). A parte que o Garbage
Collection gerencia a memria chamado de Garbage Collector.
8 Execuo do cdigo gerenciado
Todo o aplicativo criado com a tecnologia .NET processado atravs de cdigo gerenciado. Para
criar um cdigo gerenciado siga os passos a seguir :
1. Escrever um programa utilizando um compilador .NET (VB, VC#, VC++). Todo o
componente escrito por um desses compiladores pode ser utilizado por outra linguagem desde
que faa parte da especificao (CLS).
2. Compilar o cdigo. O compilador traduz o cdigo fonte para a Linguagem intermediria (IL)
ou Microsoft Intermediate Language (MIL) que gera os metadados para o aplicativo.
3. Executar o cdigo. Quando o cdigo executado, o MSIL (IL) compilado para o cdigo
nativo (cdigo especfico da CPU ) atravs do compilador Just in Time (JIT). Se for
necessrio o JIT verifica o cdigo para segurana de tipos.
Para um programador VB .NET um assembly similar aos tradicionais arquivos. DLL ou EXE,
exceto que eles contm informaes adicionais, assim como os antigos componentes COM tinham
arquivos OLB ou TLB separados chamados de Type Library (biblioteca de tipos). Quando um
aplicativo compilado, o compilador cria automaticamente um assembly para o arquivo .EXE ou
.DLL.
O CLR l os dados do Assembly para gerenciar memria, carregar classes, gerenciar objetos, invocar
mtodos, acessar as verses e recursos dos componentes, reforar segurana, gerar cdigo nativo.
151