Вы находитесь на странице: 1из 138

Introduo

Porque VB .NET e no C#? Muito se tem escrito sobre a nova linguagem que a Microsoft criou C# (pronuncia-se "C-Sharp"). Esta uma nova linguagem baseada no C/C+ +. O C#, como o VB.Net, construdo especificamente para a estrutura .NET (.NET Framework), e muito se tem escrito sobre ela. Dada toda a propaganda, algumas pessoas se perguntam sobre o porqu de escolher VB .NET em lugar de C#. Embora tanto os projetos VB .NET como C# sejam criados no ambiente do Visual Studio .NET, o VB .NET foi criado especificamente para os desenvolvedores de VB e tem um nmero de caractersticas nicas que o fazem uma grande escolha para criar aplicaes .NET. VB .NET ainda a nica linguagem no VS .NET que inclui compilao em segundo plano, o que quer dizer que pode sinalizar os erros imediatamente enquanto voc digita. VB .NET a nica linguagem .NET que suporta ligao tardia, isto o que voc faz quando declara uma varivel do tipo Object no VB 6. No ambiente de trabalho do VS .NET, o VB .NET oferece uma lista do tipo drop-down no topo da janela de cdigo com todos os objetos e eventos. O ambiente do VS .NET no oferece esta funcionalidade para nenhuma das outras linguagens. O VB .NET tambm a nica a fornecer valores default para parmetros opcionais e a ter uma coleo Controls disponvel para o desenvolvedor. No esquea tambm que o C#, assim como seus irmos C e C++, diferencia maisculas de minsculas, algo que deixa os programadores mais experientes em VB completamente loucos. Some-se a isto que o C# usa diferentes smbolos para o operador de atribuio (=) e o operador de comparao de igualdade (==). Finalmente, consideremos, se voc sabe VB, voc est a meio caminho de dominar o VB .NET do que estaria para dominar o C#. Mesmo tendo mudado muitas coisas, a sintaxe bsica da linguagem do VB .NET continua semelhante do VB, assim voc j sabe como declarar variveis, criar loops, e assim por diante. Como voc pode ver, o VB .NET tem algumas vantagens sobre as demais linguagens .NET. Se voc est curioso para saber mais sobre estas vantagens, voc deve seguir este curso. A quem se destina este curso?
Este curso se destina a programadores de VB atuais. Se voc no conhece VB,

partes do curso no faro sentido para voc. A meta aqui cobrir o que mudou. Assim, se algo no mudou, eu assumirei que voc j o sabe. Se voc conhece VB, e quer aprender VB .NET ou saber o que ele pode lhe trazer, este curso para voc. Se voc usa atualmente o Visual Interdev para criar aplicaes Web, este curso tambm para voc, porque o Visual Interdev foi integrado em todo o Visual Studio .NET. Isto significa que voc pode criar aplicaes como as do Visual Interdev usando VB .NET (e C#). Voc obtm vrias vantagens com esta nova abordagem, incluindo a de poder escrever em cdigo VB .NET e no VBScript, e a vantagem da arquitetura das aplicaes .NET para a Web (ASP .NET) sobre o modelo ASP atual significativa. No importa o que voc estar fazendo com o VB .NET, o ponto de partida a .NET Framework. Se entender a .NET Framework voc no ser capaz de escrever boas aplicaes VB .NET, independente de elas serem aplicaes Windows ou Web. Portanto, prepare-se para iniciar examinando a .NET Framework.

Captulo 1. Porque Voc Deve Migrar Para o Visual Basic .NET?


NESTE CAPTULO:

Visual Basic .NET: Uma Nova Estrutura A Common Language Runtime Execuo Gerenciada O Common Type System A Biblioteca de Classes da NET Framework Componentes Auto-Descritos Interoperabilidade Entre Linguagens Segurana Sumrio

Muitas pessoas esto reclamando do Visual Basic .NET. A principal queixa refere-se ao fato de que elas j estavam bem confortveis com o VB atual. verdade que ocorreram mudanas dramticas e que os programadores de VB atuais levaram uns trs anos para se sentirem vontade com a verso 6.0. Contudo, h algumas fortes razes para mudar para o VB .NET, e a curva de aprendizado, embora ngreme no incio, pode ser vencida com a compreenso de alguns dos novos conceitos, principalmente o de .NET Framework.

Visual Basic .NET: Uma Nova Estrutura Uma das questes mais comuns hoje em dia "Porque eu devo migrar para a .NET?". .NET nova, e h muitas questes sobre o que ela pode fazer por voc. De um ponto de vista do Visual Basic, importante entender alguns dos benefcios dramticos que podem ser obtidos pela migrao para o Visual Basic .NET. Muitas pessoas tm olhado para o VB .NET e reclamado das mudanas. A ponto de uma publicao comercial ter divulgado um artigo no qual vrios programadores experimentados em Visual Basic reclamavam de as mudanas terem sido tantas que eles se sentiam chocados. Afinal de contas, h muitas mudanas na linguagem: um novo tratamento de erros (que opcional), namespaces, herana real, multithreading real e muitas outras. Muitos desenvolvedores, porm, sentem que h boas razes para as mudanas no VB .NET. O mundo das aplicaes est mudando, continuando a evoluo que tem ocorrido nos ltimos anos. Se voc voltasse a 1991 e mostrasse para um desenvolvedor de Visual Basic 1.0 um aplicao multicamadas com pginas em ASP no front end, um componente VB COM na camada central com MTS ou COM+, e o SQL Server no back end repleto de stored procedures, isto iria parecer completamente aliengena para ele. Alm disto, nos ltimos anos, a maioria dos desenvolvedores tm usado o VB para criar componentes COM, e esse tm se tornado bem destros no uso de ADO para fazer acesso a bancos de dados. A necessidade de reutilizao e centralizao ( um mode de evitar a distribuio de componentes para as estaes de trabalho) tm direcionado este movimento para o modelo multicamadas. O prximo passo lgico na evoluo dos sistemas multicamadas era tornarem-se aplicaes para a Web. Infelizmente, o movimento para a Web revelou alguns problemas. Escalabilidade era um deles, mas aplicaes mais complexas tinham outros requisitos, tais como transaes que envolviam mltiplos componentes, mltiplos bancos de dados, ou ambos. Para responder a estas necessidades, a

Microsoft criou o Microsoft Transaction Server (MTS) e o COM+. O MTS (no Windows NT 4) e o COM+ ( uma atualizao do MTS no Windows 2000) agem como um ambiente de agrupamento de objetos, permitindo a voc ganhar escalabilidade e transaes distribudas com relativa facilidade. Contudo, componentes VB no podem tirar todas as vantagens do Servio de Componentes tem a oferecer, como pooling de objetos, porque o VB no suporta verdadeira multithreading. Abrindo a Web No modelo ASP/VB6, a Microsoft tinha os desenvolvedores criando um componente e o chamando via ASP. A Microsoft reconheceu que seria uma boa idia tornar este componente diretamente acessvel via HTTP, tal que uma aplicao em qualquer parte do mundo poderia usar este componente. Microsoft conseguiu isto atrves do Simple Object Access Protocol (SOAP), que permite aos desenvolvedores chamar um componente via HTTP usando uma string XML. Os dados so ento retornados via HTTP em uma string XML. Componentes expostos via SOAP Componentes expostos via SOAP so acessveis como qualquer outro item da Web por URLs. SOAP tem a vantagem de ser um padro global e no apenas da Microsoft. Isto tem feito que um grande nmero de vendedores, incluindo arquirivais da Microsoft, a bradar os benefcios dos servios Web. Neste ponto, voc pode ser tentado a pensar que o SOAP tudo que voc precisa, e que voc pode resolver tudo com o VB 6.0. Portanto, importante entender o que o VB .NET lhe d, e porque faz sentido para voc e muitos outros desenvolvedores mudar para o .NET. Por exemplo, voc cria os componentes e os torna acessveis via SOAP, mas como voc faz as pessoas saberem que eles existem? .NET inclui um mecanismo de descoberta que permite que voc encontre componentes que esto disponveis para voc. Voc ver mais sobre este mecanismo na aula 9, "Criando Servios Web com o VB .NET". NET tambm oferece muitos outros recursos, tais como limpeza de recursos, herana real pela primeira vez, depurao que funciona entre linguagens e com

aplicaes em execuo e a possibilidade de criar servios para Windows e aplicaes tipo console. O que significa ".NET"? Antes de prosseguir, importante entender um pouco mais sobre o que significa .NET. H muitos .NETs aqui. H o VB .NET, que a nova verso do Visual Basic. H o Visual Studio .NET (um ambiente integrado que hospeda o VB .NET), o C# (pronunciado "C sharp"), e o C++ .NET. A Microsoft tem chamado muitos dos seus produtos servidores ce ".NET Servers" agora. Subjacente a tudo isto est a .NET Framework e seu dispositivo central de execuo, a Common Language Runtime (Linguagem Comum de.Tempo de Execuo). No modelo .NET, voc escreve aplicaes destinadas .NET Framework.Isto lhes d automtico acesso a benefcios tais como destruio de objetos e recuperao de memria para voc), depurao, servios de segurana, herana e outras coisas mais. Quando voc compila o cdigo de qualquer linguagem que suporta a .NET Framework, ele compilado em algo chamado de MSIL, ou Microsoft Intermediate Language. Este arquivo MSIL binrio, mas no linguagem de mquina; pelo contrrio, um formato independente de plataforma e pode ser executado em qualquer mquina que tenha a .NET Framework. Na .NET Framework h um compilador chamado Just-In-Time, ou compilador JIT. Ele compila o cdigo MSIL para o hardware e sistema operacional da mquina. Olhando para as mudanas fundamentais, importantde entender que a exigncia nmero um dos programadores em VB, por anos, tem sido herana. VB tem tido herana de interface desde o VB4, mas os desenvolvedores queriam herana real ou herana de implementao. Porque? Quais so os benefcios? O grande benefcio da herana poder criar aplicaes mais rapidamente. Esta uma extenso da promessa de reutilizao de cdigo pela orientao a objetos. Com a herana de implementao, voc cria uma classe bsica e constri outras classes que herdam dela a implementao. Por exemplo, voc pode criar uma classe Veculo que prov a funcionalidade bsica que pode ser

herdada pela classe Bicicleta e pela classe Carro. O pont importante aqui que as classes Bicicleta e Carro herdam a funcionalidade, o cdigo real, da classe Veculo. No VB4 e posteriores, o mximo que voc podia fazer era herdar a estrutura e nenhum cdigo de implementao. No VB .NET, a funcionalidade da classe base est disponvel para as suas outras classes, ou voc pode estend-la e modific-la conforme seja necessrio. .NET oferece ferramentas de depurao integradas. Se voc j depurou uma aplicao em ASP que tinha um componente COM feito no VB, voc sabe que tinha que usar o Visual Interdev para depurar o cdigo em ASP e o VB para depurar o cdigo do componente. Se voc tambm tivesse componentes C++ na mistura, teria que usar o depurador C++ naqueles componentes. Com .NET, h um nico depurador. Qualquer linguagem da .NET Framework pode ser depurada com este mesmo depurador, mesmo que uma parte da sua aplicao seja escrita em VB .NET e chame outra parte escrita em C#, ou qualquer outra das linguagens destinadas .NET Framework. .Net oferece um mecanismo de segurana padro, disponvel para todas as partes da sua aplicao. .NET oferece uma soluo possvel para o inferno das DLLs, e remove muito da complexidade de lidar com o COM e o registry. .NET permite que voc execute componentes localmente, sem exigir que a aplicao chamadorea v ao registry para encontrar componentes. H tambm coisas que o VB .NET pode fazer que voc no pode fazer hoje em VB. Por exemplo, aplicaes Web so um novo tipo de projeto. O Visual Interdev est morto com seu cdigo VBScript interpretado . No lugar, voc pode agora criar suas pginas ASP.NET com VB .NET (ou C# ou C++ .NET), e elas sero verdadeiramente compiladas para melhor performance. VB .NET deixa voc criar servios Windows nativamente pela primeira vez oferecendo o tipo de projeto Windows Services. E sim, VB .NET permite que desenvolvedores em VB criem verdadeiros componentes e aplicaes multithreaded pela primeira vez.

Finalmente, voc precisa reconhecer que uma nova linguagem tem que ter um nmero de verso para ela, enquanto o nome final no tiver sido decidido. Poderia perfeitamente ser chamada de VB .NET 2002. Isto implica que em algum ponto haver novas verses do VB .NET, como j houveram do VB. Neste curso, referncias a verses prvias do VB sero chamadas de VB ou VB6. Referncias ao VB .NET 2002 sero apenas VB .NET. Voc decidiu migrar do VB 6.0 para o VB .NET e voc iniciou este curso para saber das mudanas. E ento, a primeira coisa que voc v uma dissertao sobre a .NET Framework. Por que iniciar pela .NET Framework? A verdade que voc no pode entender VB .NET sem antes entender a .NET Framework. Voc ver que a .NET Famework e o VB .NET so fortemente interligados; muitos dos servios que voc criar dentro das suas aplicaes so fornecidos na verdade pela .NET Framework e so meramente chamados em ao pela sua aplicao. A .NET Framework uma coleo de servios e classes. Ela existe como uma camada entre as aplicaes que voc escreve e o sistema operacional. Este um conceito poderoso: a .Net Framework no necessriamente uma soluo para Windows. A .NET Framework poderia ser movida para qualquer sistema operacional, significando que suas aplicaes .NET poderiam rodar em qualquer sistema operacional que hospedasse a .NET Framework. Isto significa que voc poderia alcanar verdadeira capacidade multiplataforma simplesmente criando aplicaes .NET para os casos em que a .NET Framework estivesse disponvel para outras plataformas. Embora esta promessa de capacidade multi-plataforma um forte argumento de venda da .NET, no h ainda um anncio oficial de disponibilizao da .NET para outros sistemas operacionais. Em adio, a .NET Framework excitante porque ela encapsula muito da funcionalidade bsica que costumava ter de ser criada em vrias linguagens de programao.A .NET Framework tem o cdigo que faz os formulrios Windows funcionarem, assim qualquer linguagem pode usar o cdigo embutido para criar e usar formulrios padro do Windows. Em adio, formulrios para a Web so parte da .NET

Framework, assim qualquer linguagem .NET pode ser usada para criar aplicaes para a Web. Adicionalmente, isto significa que vrios elementos de programao sero os mesmos entre as linguagens; um tipo Long ter o mesmo tamanho em todas as linguagens .NET. Isto ainda mais importante quando se trata de strings e matrizes. Voc no mais ter que se preocupar em saber se uma string uma BStr ou uma CStr antes de pass-la a um componente escrito em uma linguagem diferente, o que tem sido uma preocupao comum para os programadores de VB ao chamar APIs escritas em "C". A Common Language Runtime Um dos principais componentes da .NET Framework a Common Language Runtime ou CLR. A CLR fornece vrios benefcios para o desenvolvedor, tais como tratamento de erros, segurana, depurao e controle de verso, e estes benefcios esto disponveis em qualquer linguagem criada para a CLR.Isto quer dizer que a CLR pode servir a uma variedade de linguagens, e pode oferecer um conjunto comum de ferramentas para estas linguagens. A Microsoft criou o VB .NET, C++ .NET, e C# como as principais linguagens para a CLR, o que significa que estas trs linguagens do total suporte para a CLR. Em adio, outras empresas tm sinalizado que fornecero implementaes de outras linguagens, tais como Perl, Python, e mesmo COBOL. Quando um compilador compila para a CLR, o cdigo dito cdigo gerenciado. Cdigo gerenciado simplesmente cdigo que tira vantagem dos servios oferecidos pela CLR. Para que a CLR funcione com o cdigo gerenciado, este cdigo deve conter metadados. Estes metadados so criados durante a compilao por compiladores que visam a CLR. Os metadados so armazenados com o cdigo compilado e contm informaes sobre os tipos, membros e referncias no cdigo. Entre outras coisas, a CLR usa os metadados para:

Localizar classes Carregar classes Gerar cdigo nativo Fornecer segurana

Se voc pensar sobre isto, as tarefas acima costumam ser feitas pelo COM e o registry. Uma das metas da .NET permitir que as aplicaes sejam distribudas sem a necessidade de usar o registry. De fato, os componentes .NET podem ser copiados para um diretrio e usados, sem a necessidade de um processo de registro. .NET trata de localizar e carregar os objetos do componente, o que substitui o trabalho que costumava ser feito pelo COM. A CLR tambm cuida do tempo de vida dos objetos. Assim como COM/COM+ forneciam contagem de referncias para objetos, a CLR gerencia referncias a objetos e os remove da memria quando todas as referncias desaparecem atravs de um processo chamado garbage collection .Embora garbage collection lhe d um pouco menos de controle do que aquele que voc tinha no VB, voc ganha alguns importantes benefcios. Por exemplo, seus erros diminuiro porque o nmero de objetos que permanecem na memria apenas por estarem envolvidos em referncias circulares ser reduzido ou completamente eliminado, porque o .NET tem lgica para lidar com objetos que esto presos a referncias circulares. Alm disto garbage collections acabam sendo muito mais rpidas que o modo antigo de destruio de objetos no VB. Instancias de objeto que voc cria e que so gerenciados pelo CLR so chamados dados gerenciados. Voc pode interagir tanto com dados gerenciados como com dados no gerenciados na mesma aplicao, embora s os dados gerenciados lhe do todos os benefcios da CLR. A CLR tambm define um sistema de tipos padro para ser usado por todas as linguagens que suportam a CLR. Isto significa que as linguagens do tipo CLR tero os integers e longs de mesmo tamanho, e elas tero todas o mesmo tipo de string - sem mais preocupaes com BStrs e CStrs! Este sistema padro de tipos abre as portas para uma poderosa interoperabilidade entre linguagens. Por exemplo, voc pode passar uma referncia de uma classe de um componente para outro, mesmo se estes componentes sejam escritos em linguagens diferentes. Voc tambm pode derivar um classe no C# de uma classe base escrita em VB .NET, ou qualquer outra combinao de linguagens criadas para a CLR. No esquea que COM tambm tem um conjunto de tipos padro,

mas so padres binrios. Isto significa que com COM, voc tem interoperabilidade de linguagens em tempo de execuo. Com o padro .NET , voc tem interoperabilidade entre linguagens em tempo de design. Aps ter sido compilado, o cdigo gerenciado contm metadados, os quais contm informao sobre o componente em si, e os componentes usados para criar o cdigo. A CLR pode verificar para se certificar de que os recursos de que voc depende esto disponveis. Os metadados eliminam a necessidade de armazenar informaes sobre componentes no registry. Isto significa que, mover um componente de uma mquina para outra no necessita de registro ( a menos que seja um assembly global, o que ser descrito na aula 4, "Criando Classes e Assemblies com o VB .NET") e a remoo de componentes to simples como exclu-los. Como voc pode ver, a Common Language Runtime fornece um nmero de benefcios que no s so novos, mas que enriquecem a experincia de criar aplicaes. Outros benefcios que voc ir ver em maiores detalhes incluem alguns dos novos recursos de orientao a objetos do VB .NET. Execuo Gerenciada Para entender como suas aplicaes VB .NET funcionam, e como diferem do cdigo escrito em VB 6.0 para outras aplicaes, importante entender cdigo gerenciado e como ele funciona. Para usar a execuo gerenciada e ganhar os benefcios da CLR, voc precisa usar uma linguagem que tenha sido criada para o runtime. Felizmente para voc, VB .NET est entre estas linguagens. De fato, a Microsoft quis deixar claro que o VB .NET a principal linguagem da plataforma .NET significando dizer que o Visual Basic no mais poder ser chamado de uma "linguagem de brinquedo". O runtime um ambiente neutro do ponto de vista de linguagem de programao, o que significa que qualquer fabricante pode criar uma linguagem que tira vantagem das caractersticas do runtime. Compiladores diferentes podem expor o runtime em diferentes graus para o programador, assim a ferramenta que voc usa e a linguagem na qual voc

codifica podem parecer funcionar algo diferente. A sintaxe de cada linguagem diferente, naturalmente, mas quando o processo de compilao se inicia, todo o cdigo deve ser compilado em algo compreensvel pelo runtime. Nota S porque uma linguagem se direciona para o runtime no significa que esta linguagem no pode adicionar caractersticas incompreensveis por outras linguagens. Para certificar-se de que seus componentes so completamente utilizveis por componentes escritos em outras linguagens, voc precisa usar apenas tipos que so especificados pela Especificao da Common Language. Os elementos da Especificao da Common Languages sero examinados no Apndice A, "A Especificao da Common Language". Microsoft Intermediate Language (MSIL) Um dos aspectos mais interessantes da .NET que quando voc compila seu cdigo, voc no compila em cdigo nativo. Antes que vocs desenvolvedores em VB entrem em pnico e temam estar retornando aos dias de cdigo interpretado, saibam que o processo de compilao traduz o cdigo em algo chamado Microsoft Intermediate Language, que chamado de MSIL ou simplesmente IL. O compilador tambm cria a necessria meta-informao (informao que descreve informao) e a compila no componente. Este cdigo resultante independente de CPU. Aps a IL e as meta-informaes serem gravadas em um arquivo, este arquivo compilado chamado de PE, que e abrevia "portable executable" ou "physical executable". Porque o PE contm a IL e as meta-informaes, ele autodescrito, eliminando a necessidade de uma type library ou interfaces especificadas com a Interface Definition Language (IDL). A meta-informao to completa que qualquer linguagem .NET pode herdar das classes contidas neste PE. Lembre-se que a .NET compatvel em tempo de design, e isto permite que, enquanto voc desenvolve em VB .NET, voc possa herdar de classes criadas no C#, e voc ter total acesso ao IntelliSense e outros recursos do Visual Studio .NET.

O Compilador Just-In-Time O seu cdigo no permanece em IL por muito tempo, contudo. A IL independente de plataforma. porque o arquivo PE contendo a IL pode ser distribudo e instalado com a CLR rodando na .NET Framework em qualquer sistema operacional para o qual exista a .NET Framework. Quando voc roda a IL, contudo, ela compilada em cdigo nativo para a plataforma alvo. Portanto, voc ainda est executando cdigo nativo; voc no est voltando aos tempos de cdigo interpretado. A compilao para cdigo nativo ocorre via uma outra ferramenta da .NET Framework: o compilador Just-InTime (JIT). Com o cdigo compilado, ele poder rodar dentro do Framework e tirar vantagem das caractersticas de baixo nvel tais como gerenciamento e proteo de memria. O cdigo compilado nativo para a CPU na qual a .NET Framework esteja rodando, significando que voc est seguramente rodando cdigo nativo e no cdigo interpretado. Um compilador JIT ser disponibilizado para cada plataforma na qual a .NET Framework rodar, assim voc sempre ter cdigo nativo em qualquer plataforma que rode a .NET Framework. Lembre-se que, at a presente data, a nica plataforma o Windows, mas isto pode mudar no futuro. Nota Ainda possvel chamar APIs especficas de sistema operacional, o que obviamente ir limitar sua aplicao apenas quela plataforma. Isto significa que voc ainda pode chamar APIs do Windows, mas seu cdigo no ser portvel em uma mquina com a .NET Framework em um sistema diferente do Windows. Executando Cdigo Curiosamente, o compilador JIT no compila a IL toda quando o componente chamado pela primeira vez. Ao contrrio, cada mtodo compilado somente na primeira vez que chamado. Isto evita que voc compile sees de cdigo que nunca so chamadas. Aps o cdigo ter sido compilado, naturalmente, chamadas posteriores usaro a verso

compilada do cdigo. Este cdigo nativo compilado ir permanecer na memria. Contudo, a Microsoft criou um compilador Pr-JIT que compila todo o cdigo de uma vez e armazenar a verso compilada em disco. Esta ferramenta chamada ngen.exe e pode ser usada para pr-compilar toda a IL. Se a CLR no encontra uma verso pr-compilada do cdigo, ela inicia o compilador JIT para fazer a compilao. Aps o cdigo entrar em execuo, ele pode tirar todo o proveito da CLR, com benefcios tais como o modelo de proteo, gerenciamento de memria, suporte para depurao, etc. Muitos destes benefcios sero mencionados ao longo do curso; Assemblies Uma das novas estruturas que voc criar no VB .NET o "assembly". Um assembly uma coleo de um ou mais arquivos fsicos. Os arquivos so quase sempre de cdigo, tais como as classes que voc cria, mas eles tambm podem ser de imagens, arquivos de recursos, e outros arquivos binrios associados ao cdigo. Tais assemblies so conhecidos como estticos, porque voc os cria e armazena em disco. Assemblies dinmicos so criados em tempo de execuo e no costumam ser armazenados em disco (embora possam s-lo). Um assembly representa a unidade de distribuio, controle de verso, reuso e segurana. Se isto soa como as DLLs que voc tem criado em Visual Basic nos ltimos seis anos, similar. Assim como uma DLL padro de COM tem uma type library, o assembly tem um manifesto que contem a metainformao para o assembly, tais como as classes, tipos e referncias contidas na IL. O assembly frequentemente contm uma ou mais classes, assim como uma DLL COM. Na .NET, as aplicaes so construdas usando assemblies. assemblies no so aplicaes no sentido completo. Talvez o ponto mais importante sobre assemblies que: Toda aplicao deve ser constituda de um ou mais assembly. O Manifesto do Assembly

O manifesto similar em teoria type library das DLLs COM. O manifesto contm toda a informao sobre os tens no assembly, incluindo que partes do assembly so expostas ao mundo exterior. O manifesto tambm lista as dependncias do assembly de outros assemblies. Cada assembly tem que ter um manifesto. O manifesto pode ser parte do arquivo PE, ou ele pode ser um arquivo separado se o seu assembly contiver mais que um arquivo. Embora esta no seja uma lista completa, um manifesto contm:

o nome do assembly a verso os arquivos no assembly os assemblies referenciados

Em adio, um desenvolvedor pode atribuir atributos customizados para o assembly, tais como um ttulo e uma descrio. Um Fim para o Inferno das DLLs? Um dos grandes benefcios propagandeados do COM foi ser um fim para o inferno das DLLs.Se voc pensar nos tempos da programao de 16-bits, voc lembrar que voc tinha que distribuir um nmero de DLLs com uma aplicao Windows. Parecia que quase todas as aplicaes instalavam as mesmas DLLs, tais como Ctrl3d2.dll. Cada aplicao que voc instalava poderia ter uma verso ligeiramente diferente da DLL, e voc acabava com mltiplas cpias da mesma DLL, mas muitas de diferentes verses. O que era ainda pior, uma verso poderia ser colocada no diretrio WIndows\System e travar muitas das suas aplicaes existentes. O COM foi anunciado como a soluo para resolver tudo. As aplicaes no mais teriam que procurar por DLLs nos seus prprios diretrios , e ento procur-las no diretrio Windows. Com o COM, solicitaes por componentes seriam enviadas para o registry. Embora pudessem haver mltiplas verses da mesma DLL COM na mquina, haveria apenas uma verso no registry a cada momento. Portanto, todos os clientes usariam a mesma verso. Isto significa, contudo, que cada nova

verso de uma DLL teria que garantir compatibilidade com as verses anteriores. Isto conduziu necessidade de as interfaces serem imutveis sob o COM; aps o componente entrar em produo, a interface era assumida como imutvel. Em teoria soa bonito, mas os programadores poderiam (e o fizeram) distribuir componentes que quebrariam a compatibilidade binria; em outras palavras, eles mudaram, adicionaram, ou removeram propriedades e mtodos dos seus componentes. Os componentes modificados ento travavam as aplicaes clientes existentes. Muitos dos desenvolvedores em VB tm lutado com este problema. A .NET Framework e a CLR tentam direcionar este problema para os assemblies. Mesmo antes da .NET, o Windows 2000 introduziu a capacidade de uma aplicao examinar o seu diretrio local, ao invs de ir ao registry. Isto garante que voc sempre tem a verso correta da DLL disponvel para a sua aplicao. O runtime vai alm e permite que os componentes tenham declaradas suas dependncias de certas verses de outros componentes. Em adio, mltiplas verses do mesmo componente podem rodar na memria simultaneamente, o que a Microsoft chama de instanciao lado a lado ou execuo lado a lado. O Global Assembly Cache (GAC) Mesmo que os componentes .NET no tenham que ser registrados, h um processo semelhante se voc tiver um assembly que ser usado por mltiplas aplicaes. A CLR realmente tem dois caches dentro do seu cache de cdigo: o cache de download e o global assembly cache (GAC). Um assembly que ser usado por mais do que uma aplicao armazenado no global assembly cache rodando um instalador que o coloca no GAC. Se um assembly no se encontra no diretrio local nem no GAC, voc pode ter um endereo para ele no arquivo de configurao. A CLR faz ento o download do assembly e o armazena no chache de download e se liga a ele a partir dal. Este cache de download somente para assemblies que precisam ser baixados e no ser discutido mais neste curso.

O GAC onde voc coloca um componente se voc deseja que mltiplas aplicaes o utilizem. muito parecido com o que voc tem nos componentes registrados do VB6. Se o componente no encontrado no mesmo diretrio da aplicao, a aplicao procura-o no GAC, do mesmo modo com o COM pesquisa o registro. Colocar assemblies no GAC tem muitas vantagens.Assemblies no GAC tendem a ter melhores performances porque o runtime os localiza mais rapidamente e a segurana no tem que ser verificada a cada vez que o assembly carregado. Assemblies somente podem ser adicionados ao GAC ou removidos dele por algum que tenha privilgios de administrador. O interessante que voc pode ter diferentes verses do mesmo assembly carregadas no GAC ao mesmo tempo. Note que eu evitei de dizer "registrado no GAC" porque voc no est colocando nada no registro. Mesmo se um componente estiver rodando no GAC, voc pode adicionar uma outra verso do mesmo componente rodando em paralelo. Assemblies podem ser postos no GAC somente se eles tiverem um nome compartilhado. Assemblies e o GAC sero discutidos em maiores detalhes no Captulo 4. O Common Type System (Sistema Comum de Tipos) O Common Type System especifica os tipos suportados pela CLR. Os tipos especificados pela CLR incluem:

Classes As definies do que ir se tornar um objeto; inclui propriedades, mtodos e eventos Interfaces A definio da funcionalidade que uma classe implementa, mas no contm nenhum cdigo de implementao Value Tipes Tipos de dados definidos pelo programador que so passados por valor Delegates Semelhantes a ponteiros de funes no C+ + , delegates so frequentemente usados por tratamentos de eventos e callbacks

O sistema de tipos estabelece as regras que os compiladores de linguagens devem seguir para produzir cdigo que seja compatvel com mltiplas linguagens. Seguindo o sistema de tipos, fabricantes podem produzir cdigo que garantido para funcionar com cdigo de outras linguagens e outros compiladores, porque todas as linguagens so consistentes no uso de tipos. Classes Muitos desenvolvedores em Visual Basic so familiarizados com classes. Classes so definies de objetos que sero criados em tempo de execuo. As classes definem as propriedades, mtodos, campos e eventos dos objetos. Se o termo "campos" lhe causa estranheza, ele simplesmente significa variveis pblicas expostas pela classe; campos so o modo preguioso de criar propriedades. Juntos, propriedades, mtodos, campos e eventos so genericamente chamados membros da classe. Se uma classe tem um ou mais mtodos que no contm qualquer implementao, a classe chamada de classe abstrata. Em VB .NET, voc no pode instanciar classes abstratas diretamente; ao invs disto, voc deve herdar delas na criao de outras classes. No VB6, era possvel criar uma classe que continha apenas definies de mtodos e propriedades, mas sem nenhuma implementao. De fato, esta era a forma como voc criava interfaces no VB. Se voc criasse uma classe somente com definies de mtodos e propriedades e sem cdigo de implementao, voc poderia usar a palavra Implements para herdar a interface por outra classe. Voc realmente podia instanciar a interface no VB6, mas, por no haver nenhum cdigo de implementao, isto era intil. No VB .NET, voc pode criar uma classe com cdigo de implementao, ao invs de apenas a interface, e ento marcar a classe como abstrata. Agora, outras classes podem herdar dela e usar a implementao nela contida ou sobrepor a implementao por outra conforme seja necessrio. Estes so conceitos novos para os desenvolvedores em VB. No passado, oVB tinha apenas herana de interfaces, mas o

VB .NET tem herana "real", conhecida como herana de implementao. No VB .NET, interfaces so separadas das classes. No VB6, voc criava interfaces criando classes com definies de mtodos e propriedades, mas sem nenhum cdigo de implementao nestes mtodos e propriedades. Voc ver mais sobre interfaces na prxima seo, mas saiba que, embora uma classe VB .NET pode implementar qualquer nmero de interfaces, ela pode herdar de uma nica classe base. Isto ser examinado em maiores detalhes ao longo do curso. Classes tm um nmero de caractersticas possveis que podem ser atribudas, e que so armazenadas na metainformao. Em adio, membros podem ter caractersticas. Estas caractersticas incluem itens tais como se a classe ou o membro so herdveis. Isto ser discutido em maiores detalhes no Captulo 4. Interfaces Interfaces no VB .NET so como as interfaces em verses anteriores do VB: elas so definies de uma classe sem a verdadeira implementao. Por no haver nenhum cdigo de implementao, voc no pode instanciar uma interface, mas precisa implement-la em uma classe. H uma exceo regra de "sem cdigo de implementao em uma interface": no VB .NET, voc pode definir os chamados membros estticos. Estes podem ter cdigo de implementao, e voc ver mais sobre eles no Captulo 4. Value Types Nas linguagens .NET, um tipo padro de varivel, como um integer, nativo linguagem, e passado por valor quando usado como argumento. Objetos, por outro lado, so sempre passados por referncia.Contudo, um value type um tipo definido pelo usurio que funciona de modo parecido com um objeto, mas passado por valor. Na realidade, value types so armazenados como tipos de dados primitivos, mas eles podem conter campos, propriedades, eventos e tanto

mtodos estticos como no-estticos. Value types no provocam a sobrecarga de um objeto que est sendo mantido na memria. Se isto parece confuso, pense sobre as enumeraes. Enumeraes so um tipo especial de value type. Uma enumerao tem um nome e um conjunto de campos que definem valores para um tipo de dados primitivo. Enumeraes, contudo, no podem ter suas propriedades, eventos e mtodos. Delegates Um delegate um construto que pode ser declarado em um cliente. O delegate realmente aponta para um mtodo em um objeto particular. Qual mtodo ele aponta para e em que objeto pode ser atribudo quando a instncia do delegate criada na sua declarao. Isto permite que voc defina chamadas a vrios mtodos em diferentes objetos baseado na lgica do seu cdigo. Delegates so mais frequentemente usados para tratar eventos. Usando delegates, voc pode passar eventos para um tratamento centralizado de eventos. Delegates no sero examinados em maiores detalhes neste curso. A Biblioteca de Classes da .NET Framework A .NET Framework fornece um nmero de elementos que j esto criados e prontos para uso em qualquer linguagem compatvel com a Common Language Runtime. Estes elementos incluem itens como tipos de dados primitivos, funes de I/O, acesso a dados, e segurana da .NET Framework. Talvez uma das maiores mudanas no modo como os programadores iro trabalhar com o VB .NET a rea de namespaces. Namespaces sero cobertos no Captulo 3. importante compreender que a .NET Framework fornece um conjunto de classes e membros utilitrios organizados dentro de uma hierarquia chamada namespace. Na raiz da hierarquia est o namespace System. Um namespace agrupa classes e membros dentro de ns lgicos. Desta forma, voc pode ter a

mesmo nome para um mtodo em mais de um namespace. O mtodo Left() poderia portanto existir no namespace System.Windows.Forms e no namespace Microsoft.VisualBasic. Uma vantagem dos namespaces que funes similares podem ser agrupadas dentro do mesmo namespace, independentemente do assembly no qual elas estejam fisicamente alocadas. Qualquer linguagem compatvel com o runtime pode usar o namespace System. Por exemplo, se voc precisasse acessar dados, voc no cria uma referncia ao componente ADO.NET. Em vez disto, voc referencia, ou importa, o namespace System.Data. Frequentemente, voc ver a seguinte linha: Imports System.Data Contudo, isto no importa todos os mtodos e causa um excesso de cdigo. Ao contrrio, instrui o compilador para tratar mtodos e tipos dentro do namespace como parte do prprio namespace do seu projeto, assim ao invs de ter de escrever: Voc pode simplesmente fazer uma chamada a SQLClient() H muitos outros namespaces System. Namespaces System incluem a funcionalidade para segurana, threading, I/O binrio e de texto, e servios Web. Como usar os vrios namespaces System ser apresentado ao longo do curso. No deixe o termo namespace assust-lo. uma das muitas mudanas fundamentais do VB.NET, mas um servio fornecido pelo runtime que d funcionalidade rica e comum a todas as linguagens construdas para o runtime. medida que voc herda dos namespaces fornecidos para voc pelo runtime, sua aplicao poder rodar em qualquer plataforma que suporte .NET. Pode-se dizer que voc est trabalhando no aprendizado do ambiente tanto quanto no aprendizado da linguagem. Este o motivo pelo qual este captulo o primeiro no curso.

Componentes Auto-Descritos No VB tradicional, componentes compilados criavam uma type library para definir o que ia dentro do componente, tal como classes, interfaces, propriedades, mtodos e eventos. A comunicao ocorria atravs de uma interface binria no nvel do COM. Infelizmente, uma linguagem poderia esperar como parmetros tipos de dados e estruturas que no estavam disponveis em outras linguagens, ou que, no mnimo, seriam difceis de implementar. Por exemplo, componentes desenvolvidos em C++ frequentemente experam ponteiros ou estruturas, e isto pode ser problemtico se o programa cliente do componente estiver escrito em Visual Basic. A .NET Framework procura solucionar isto compilando dados adicionais em cada assembly. Estes dados adicionais so chamados meta-informao e permitem que componentes compilados interajam de modo transparente. Junte isto ao fato de haver um sistema de tipos comum tal que todas as linguagens do runtime compartilham os mesmos tipos e voc ver que a interoperabilidade entre linguagens evoluiu. A meta-informao que armazenada no componente binria e contm todos os tipos, membros e referncias naquele arquivo ou assembly. A meta-informao compilada no arquivo PE, mas quando o arquivo usado em tempo de execuo, a meta-informao movida para a memria de tal forma que ela possa ser acessada mais rapidamente. Uma das coisas mais importantes a ser entendida que a meta-informao que permite ao runtime localizar e executar o seu cdigo. A meta-informao tambm usada pelo runtime para criar uma verso vlida de cdigo nativo queando a MSIL compilada. O runtime tambm usa metainformao para manipular os detalhes massantes de limpeza de memria e segurana. Quanto se trata dos benefcios da meta-informao para um programador, saiba que h tantos dados na meta-informao que voc pode herdar de um PE criadao at mesmo em uma linguagem diferente, porque a meta-informao oferece grande riqueza de detalhes. Isto significa que voc est na verdade herdando de um componente compilado, no um arquivo IDL como era requerido anteriormente. De fato, por

ser a meta-informao compilada dentro do PE ou assembly, voc no mais precisa de arquivos IDL ou type libraries. Toda a informao est agora contida no PE. Por padro, a meta-informao contm os seguintes dados:

Identidade do PE ou assembly: nome, verso , cultura, chave pblica Dependncias de outros assemblies Papis e permisses de segurana Tipos exportados

Cada tipo tem as seguintes meta-informes:


Nome, visibilidade, classe base, interfaces implementadas Membro

Em adio, voc pode extender a meta-informao usando atributos. Atributos so criados pelo desenvolvedor e permitem que informaes adicionais sejam juntadas metainformao. Interoperabilidade Entre Linguagens Se voc tem criado componentes COM por agum tempo, voc sabe que uma das grandes promessas do COM a independncia de linguagem. Se voc criasse um componente em C++, voc o poderia usar em VB e vice-versa. Contudo, para chegar a este ponto, o seu cdigo tinha que ser compilado para um padro COM. Muito disto era tranparente para o desenvolvedor VB, mas seu componente tinha que implementar as interfaces IUnknown e IDispatch. Sem estas interfaces, ele no seria um verdadeiro componente COM. Contudo o COM apenas lhe d interoperabilidade entre linguagens no nvel binrio. Isto significa que voc somente pode tirar vantagem desta interoperabilidade em tempo de execuo. Agora, contudo, a CLR lhe d muito mais interoperabilidade entre linguagens. No apenas voc pode derivar classes de um PE escrito em na linguagem A e us-las na linguagem B, mas a depurao funciona entre componentes de mltiplas

linguagens. Desta forma, voc pode percorrer o cdigo em um PE escrito em C# e saltar para uma classe base escrita em VB.NET. Isto significa que sua interoperabilidade entre linguagens est ocorrendo em tempo de design e de runtime, no s no runtime que lhe dado pelo COM. Em adio, voc pode gerar um erro (agora chamado de uma exceo) em uma linguagem e t-lo tratado em um componente escrito em outra. Isto significativo, porque agora os desenvolvedores podem escrever em linguagens com as quais eles se sentem mais confortveis, e estarem certos de que outros codificando em diferentes linguagens sero capazes de usar seus componentes com facilidade. A Exigncia: Usar Apenas Tipos da Especificao Common Language Isto tudo soa bem, e voc est provavelmente ficando excitado com as possibilidades. Contudo, h uma exigncia: para fazer uso desta grande interoperabilidade entre linguagens, voc deve usar apenas aqueles tipos de dados e funes comuns a todas as linguagens. Se voc est se interrogando sobre como fazer isto, a boa nova que a Microsoft j pensou neste problema e estabeleceu um padro chamado a Common Language Specification ou CLS. Se voc programar com a CLS, esteja certo de que voc ter completa interoperabilidade com outros programando com a CLS, no importa que linguagens estejam sendo usadas. Componentes que expem somente as caractersticas da CLS so chamados componentes CLS-compatveis. Para escrever componentes CLS-compatveis, voc deve usar a CLS nestas reas chaves:

As definies de classes pblicas devem conter apenas tipos CLS. As definies de membros pblicos das classes pblicas devem ser de tipos CLS. As definies de membros que so acessveis a subclasses devem ser de tipos CLS. Os parmetros de mtodos pblicos em classes pblicas devem ser de tipos CLS. Os parmetros de mtodos que so acessveis a subclasses devem ser de tipos CLS.

Estas regras falam muito sobre definies e parmetros para classes e mtodos pblicos. Voc livre para usar tipos no CLS em classes privadas, mtodos privados e variveis locais. Mesmo se voc tiver uma classe pblica que voc quer que seja CLS-compatvel, o cdigo de implementao dentro desta classe no tem que ser CLS-compatvel; se a definio for compatvel, voc est seguro. A CLS ainda est em evoluo, mas os alicerces esto bem estabelecidos. Veja o Apndice A para os fundamentos da CLS. Segurana Se voc criar um componente VB hoje, suas chances para implementar segurana so algo limitadas. Voc pode usar o NTFS para atribuir permisses ao arquivo em si. Voc pode colocar o componente em um servio de componente MTS ou COM+ e ativar a segurana baseada no objeto. Voc pode cham-lo via DCOM e usar o DCOMCNFG para atribuir permisses. Voc pode sempre codificar sua prpria segurana. Um dos principais benefcios do runtime que uma inteira infraestrutura de segurana lhe vem embutida. Na verdade, dois modelos principais de segurana esto contidos na .NET Framework: segurana de acesso de cdigo e segurana baseada no objeto. Estes tpicos so discutidos em maiores detalhes no Captulo 12, "Performance e Segurana". Segurana de Acesso de Cdigo (CAS) Esta segurana no controla quem acessa o cdigo, mas o que o cdigo em si pode acessar. Isto importante, porque permite que voc crie componentes que podem ser confiveis em graus variveis. Se voc cria um componente em VB atualmente e quer fazer acesso a banco de dados, voc est livre para fazer chamadas a ADO e conectar-se a um banco de dados (claro, se voc tiver uma identificao de usurio vlida e uma senha). Com o .NET, contudo, voc pode especificar com as ferramentas da .NET Framework que aes o seu componente pode e, mais importante, no pode

realizar. Isto tem o benefcio de impedir que outros usem o cdigo de formas que voc no aprova. Talvez o principal benefcio do CAS que voc pode agora confiar em cdigo baixado da Internet. A segurana pode ser configurada tal que se torna impossvel para o cdigo executar qualquer ao perniciosa. Isto ir prevenir muitos dos vrus de macro que se espalham via e-mail atualmente Segurana Baseada no Objeto (role-based) Segurana Baseada no Objeto o mesmo tipo de segurana que voc obtm quando usa os Servios de Componente MTS ou COM+. Neste tipo de segurana, voc cria o que, na documentao do Windows 2000, chamado de um descritor de segurana. Um descritor de segurana um conjunto de informaes anexadas a um objeto que especifica as permisses de usurios e grupos para acess-lo. Na .NET, o Framework determina o chamador, chamado de 'principal', e identifica as suas permisses e dos grupos a que pertence. Diferentemente do que ocorre no COM+, contudo, a .NET no pode assumir que o usurio tem uma conta no NT. Portanto, a .NET permite principals genricos e customizados, bem como principals padres do Windows. Voc pode definir novos descritores de segurana para cada aplicao se voc quiser. Sumrio Voc acabou de ser conduzido em meio a muitas caractersticas importantes do .NET de forma muito rpida. Se alguns dos termos lhe pareceram estranhos, no se preocupe. Ao longo deste curso eles sero cobertos com maiores detalhes. Este curso ir cobrir tudo o que voc precisa para se iniciar no uso do VB .NET. Para aqueles questionamentos sobre o valor de migrar para o .NET, importante entender os benefcios que o .NET lhe traz. Ter um depurador unificado, ganhar verdadeira multitarefa e, finalmente, ter herana de implementao so grandes passos adiante. A runtime tambm lhe d uma bela estrutura de segurana, e voc no tem mais que se preocupar em registrar componentes. Web Services permitem

que voc crie facilmente servios que so utilizveis atravs de uma conexo HTTP padro. medida que voc trabalha com o VB .NET, entenda que voc tambm est trabalhando intimamente ligado .NET Framework. difcil separar os dois, e quanto melhor voc compreender o Framework, melhor programador de VB .NET voc ser.

Captulo 2. Sua Primeira Aplicao VB .NET


NESTE CAPTULO

A Pgina de Incio Criando um Novo Projeto Criando Sua Primeira Aplicao VB .NET Melhorias Para Aplicaes Windows Sumrio

chegada o hora de pular dentro e iniciar o trabalho com o VB .NET. Primeiramente, voc precisa aprender um pouquinho sobre o novo IDE. O novo IDE do VB .NET pode parecer algo familiar a voc, mas h algumas mudanas significativas que o fazem um ambiente mais til. Contudo, estas mudanas pode ser frustrantes para desenvolvedores experientes, porque muitos dos atalhos de teclado mudaram, janelas tm nomes diferentes e as ferramentas de depurao funcionam de modo diferente. O VB .NET parte do Visual Studio .NET ( ou VS .NET), que finalmente rene todas as linguagens de desenvolvimento num s lugar: VB .NET, C++ .NET e C#. Voc pode at mesmo criar uma nica soluo contendo mltiplos projetos escritos individualmente em diferentes linguagens. A Pgina de Incio A primeira vez que voc inicia o Visual Studio .NET, voc levado a uma tela que permite que voc configure o IDE. Esta tela a pgina My Profile, discutida mais adiante neste captulo. Aps voc visitar pela primeira vez a pgina My Profile, todas as inicializaes subsequentes do Visual Studio .NET iniciaro com a pgina de incio (start page), como mostra a Figura 2.1. A pgina de incio contm um nmero de sees conforme indicado pelos links ao longo do lado esquerdo. Estas sees so:

Get Started Esta opo permite que voc abra um dos projetos recentes ou crie um novo projeto. Uns poucos projetos recentes so listados na rea Get Started mostrada na Figura 2.1. medida que voc criar projetos no VB .NET, esta rea ir exibir os quatro projetos mais

recentemente abertos. Esta rea tambm contm links para abrir projetos existentes e criar um novo projeto. What's New Esta opo cobre os recursos novos de linguagem no Visual Studio .NET, incluindo cada linguagem individualmente e o ambiente do Visual Studio .NET. H links para tpicos nos arquivos de ajuda sobre os novos recursos para as linguagens do VS .NET, o .NET SDK e um link para conferir atualizaes do VS .NET. Online Community Esta rea fornece links para os grupos de discusso da Microsoft. Estes so grupos acessveis com qualquer programa de leitura de newsgroups, mas eles so servidos pelo servidor de news da Microsoft (msnews.microsoft.com) e no servidores normais de news da Usenet. Headlines Fornece um local com links para novidades sobre o .NET. Esta pgina inclui um link para o MSDN Online, uma seo para artigos tcnicos, uma seo para o Knowledge Base e vrios outros recursos. Search Online Pesquisa a biblioteca online do MSDN Downloads Lhe d acesso a vrios downloads. Downloads que podem incluir novas ferramentas, tais como service packs e exemplos de cdigo. Os downloads tambm podem incluir novas documentaes. Web Hosting Permite que voc se conecte diretamente a servios que oferecem hospedagem para os seus .NET Web Services ou Aplicaes .NET Web. Com um comando, voc pode publicar suas aplicaes .NET ou servios para estas companhias de hospedagem. Ao menos uma, a Brinkster, oferece hospedagem grtis e com isto voc pode testar sua aplicao. My Profile Esta tela permite-lhe escolher o layout geral do Visual Studio .NET. Voc pode configurar os atalhos de teclado para o mesmo esquema de verses prvias do Visual Studio, tais como a verso 6. Voc pode tambm configurar o layout de janela para parecer com as verses anteriores de projetos do Visual Studio e voc pode filtrar o help automaticamente usando o seu perfil. Ao longo deste curso, eu assumirei que o perfil aquele estabelecido pelo Visual Studio e que todas as demais configuraes so deixadas nos seus valores padres. Figura 2.1. A Pgina Inicial do Visual Studio

Nota A pgina inicial em HTML e provavelmente ir mudar quando o VS .NET for lanado. A ajuda est agora mais intimamente integrada ao Visual Studio. Para ver isto, clique no link What's New na pgina inicial. Note que, quando voc faz isto, uma srie de links para a documentao online so carregados na mesma janela da pgina inicial. Estes links o levam para informaes de ltima hora se voc tiver uma conexo com a Interntet aberta. Clique em um destes links para ver o contedo ser exibido dentro da janela do IDE. Como voc ver mais tarde, possvel at mesmo ter ajuda rodando continuamente enquanto voc trabalha, pesquisando por tpicos associados ao que quer que voc esteja manipulando no momento. Figura 2.2. A ajuda sendo exibida dentro da janela do IDE ( possvel tambm exibir em janela separada).

Criando um Novo Projeto Volte para a pgina inicial clicando no boto de navegao Back da barra de ferramentas e, na pgina Get Started, clique no link New Project. Fazendo isto, ser aberta a caixa de dilogo New Project mostrada na Figura 2.3. Note que h diferentes linguagens que voc pode usar para criar aplicaes em Visual Studio .NET. Este curso ir focar apenas os projetos em Visual Basic. Figura 2.3. A caixa de dilogo New Project

Se voc examinar os tipos de projetos do Visual Basic, voc ver que muitos deles so diferentes dos que voc costuma ver no Visual Basic 6. Alguns dos principais tipos de projetos so:

Windows Application Este um executvel padro na terminologina do VB 6. a forma de criar aplicaes Windows com formulrios e controles. Isto o mais prximo do VB 6 que voc chegar com o VB .NET. Class Library Este tipo de projeto permite-lhe criar classes que sero usadas em outras aplicaes. Pense nisto como se fossem componentes COM que voc tem criado com o VB 6 chamados ActiveX DLL ou ActiveX EXE . Windows Control Library Este tipo de projeto para criar aquilo que costumava ser chamado de ActiveX Controls. Este tipo de projeto lhe permite criar novos controles a serem usados em aplicaes Windows. ASP.NET Web Application Adeus Visual Interdev e linguagens interpretadas para Active Server Pages. O Visual Basic .NET tem os projetos Web Application, que usam ASP .NET para criar aplicaes

Criando Sua Primeira Aplicao VB .NET Voc tem um projeto aberto com um formulrio nele. At aqui, voc nada fez com ele, mas agora voc ir criar a obrigatria aplicao Ol Mundo. Eu me recordo de quando a Microsoft estava correndo o mundo e mostrando como poderia ser fcil criar uma aplicao do tipo Ol Mundo em VB simplesmente teclando uma linha de cdigo. Bem, ainda continua igualmente fcil, mas as coisas certamente se apresentam diferentes agora. Certifique-se de que o designer de formulrios a tab ativa na rea de trabalho e abra a Toolbox. Clique e arraste um boto sobre o formulrio. Posicione-o onde voc quiser. At aqui tudo como no VB6. Agora, d um duplo clique no boto. Um duplo clique sobre o boto causa a abertura da janela de cdigo, exatamente como no VB6. Contudo, no VB .NET, o cdigo adicionado na forma de uma tab na rea de trabalho. A nova tab intitulada Form1.vb, e tem um asterisco em seguida indicando que ela no foi salva. Voc tem bastante cdigo nesta janela, e cdigo que voc nunca viu antes. Parte do cdigo ocultada dos seus olhos, isto devido ao fato de que, no Visual Studio .NET, o editor de cdigo permite que voc oculte ou expanda blocos de cdigo. Se voc expandir o cdigo gerado na seo Windows Form Designer, ver um bocado de cdigo. Na verdade, antes que voc digite qualquer cdigo, j ter o cdigo mostrado na Figura 2.10. Note que eu ativei a numerao de linhas apenas para referenciar as linhas com mais facilidade. Se voc tambm quiser ativar a numerao de linhas, v ao menu Tools, Options. Expanda o n Text Editor e escolha Basic. Cheque a checkbox Line Numbers. Figura 2.10. A janela de cdigo exibe uma considervel quantidade de cdigo antes mesmo de voc comear a digitar.

A primeira linha de cdigo mostra que este formulrio, Form1, na verdade apenas uma classe. Esta uma das maiores mudanas do VB .NET. Formulrios so verdadeiras classes. Por qu? Por que formulrios so realmente apenas classes e tm sido assim sempre. Voc pode nunca ter pensado neles desta forma antes, mas um formulrio apenas mais uma classe. Quando um formulrio exibido, voc apenas instanciou uma classe. A linha seguinte uma declarao Inherits. Qualquer formulrio do Windows que voc cria apenas herda da classe base Form. Voc est chamando uma classe em um dos namespaces .NET System, neste caso, voc est chamando a classe Form no namespace System.Windows.Forms. esta classe que lhe d a funcionalidade bsica dos formulrios, tais como os mtodos e eventos que voc acessar em seu cdigo. A declarao Inherits a sua primeira indicao de herana real no VB .NET. Voc pode herdar desta classe base e ento estend-la se assim o quiser. O cdigo localizado dentro da regio Windows Form Designer mostrado na Listagem 2.1. Listagem 2.1 Cdigo Gerado para Voc pelo Designer de Formulrios Windows
#Region " Windows Form Designer generated code " Public Sub New() MyBase.New() 'This call is required by the Windows Form Designer.

InitializeComponent() 'Add any initialization after the InitializeComponent() call End Sub 'Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub Friend WithEvents Button1 As System.Windows.Forms.Button 'Required by the Windows Form Designer Private components As System.ComponentModel.Container 'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() Me.Button1 = New System.Windows.Forms.Button() Me.SuspendLayout() ' 'Button1 ' Me.Button1.Location = New System.Drawing.Point(64, 56) Me.Button1.Name = "Button1" Me.Button1.TabIndex = 0 Me.Button1.Text = "Button1" ' 'Form1 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(292, 273) Me.Controls.AddRange(New System.Windows.Forms.Control() { Me.Button1} ) Me.Name = "Form1" Me.Text = "Form1" Me.ResumeLayout(False) End Sub #End Region

A prxima parte dentro da classe um Sub pblico chamado New, localizado dentro da regio de cdigo gerado automaticamente. Note que ele chama um Sub nomeado InitializeComponent. A rotina InitializeComponent criada para voc pelo VS .NET. A nova rotina similar ao procedimento de evento Form_Load que voc est acostumado a ver no VB6. Note que voc pode adicionar algum cdigo seu aps a chamada a InitializeComponent .

Aps o sub New, h o sub Dispose, parecido com o evento Form_Unload do VB6. Este o lugar de limpeza de tudo que voc pode ter feito. No se preocupe sobre as palavras Overloads e Overrides por enquanto, elas sero explicadas quando voc aprender mais sobre herana. Como voc pode ver, a rotina InitializeComponent est neste bloco e ela que configura os controles no formulrio. Note que o boto tem propriedades atribudas, tais como localizao e tamanho, e ento adicionado a uma coleo de controles. Finalmente, abaixo desta regio de cdigo, est a rotina para tratar o evento click do boto. Isto tambm se mostra diferente do que voc tem visto anteriormente. Na verdade, se voc inicia um novo projeto no VB6, adiciona um boto ao formulrio e d um duplo clique sobre o boto, seu projeto inteiro mostra apenas este cdigo:
Private Sub Command1_Click() End Sub

Contudo, no VB .NET, voc ver um bocado mais de cdigo. Na verdade, o evento Click no tratado antes da linha 57, ao menos neste exemplo. A declarao do procedimento de evento tambm completamente diferente. No VB .NET, o procedimento de evento parece-se com isto:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End Sub

Novamente, no se preocupe com todas as mudanas por enquanto. Agora, digite a seguinte linha de cdigo: MsgBox "Ol, Mundo!" Quando voc sair desta linha, voc ver que o VB .NET automaticamente adiciona parnteses em torno do argumento, deixando voc com isto: MsgBox("Ol, Mundo!") Esta uma das primeiras mudanas fundamentais da linguagem.. Subs e funes requerem parnteses entorno dos argumentos. O comando MsgBox uma funo, mas no VB6, voc no precisava adicionar parnteses entorno de um parmetro se voc estivesse ignorando o valor de retorno. No VB .NET, voc precisa sempre de parnteses, assim sendo acostume-se a adicion-los ou ao menos acostume-se a ver o VB .NET adicion-los para voc.

Agora hora de rodar esta demonstrao no muito excitante e ver como ela funciona. Voc pode clicar no boto Start na barra de ferramentas (isto deve lhe ser familiar) ou voc pode ir ao menu Debug e escolher Start. O Form1 ser carregado. Clique no boto e voc dever receber a caixa de mensagem com o texto "Ol, Mundo!". Na Figura 2.11, voc notar que o ttulo da caixa de mensagem igual ao nome do projeto, do mesmo modo que era no VB6. Feche a aplicao e retorne ao IDE. Figura 2.11. A aplicao Ol Mundo sendo executada.

Note que uma nova janela est aparecendo na base da tela, uma janela de Output est aberta agora. A Figura 2.12, mostra esta janela. A janela de Output tem uma listbox estilo drop-down que pode exibir diferentes informaes. Atualmente, ela lhe mostra todas as mensagens de depurao. Voc no adicionou nenhum debug.print no seu cdigo, mas certas aes do compilador introduzem automaticamente comentrios na janela de Debug. Figura 2.12. A nova janela de Debug.

Antes de avanar mais, voc pode querer mudar o ttulo da caixa de mensagem. Retorne nica linha de cdigo que voc escreveu at aqui e modifique-a para parecer-se com isto:
MsgBox("Ol, Mundo", , "Minha primeira aplicao VB .NET")

Agora que voc adicionou um ttulo caixa de mensagem, rode o projeto novamente e o ttulo da sua caixa de mensagem ser "Minha primeira aplicao VB .NET". Se voc pensa que ela no pode melhorar alm disto, segure firme. Melhorias para Aplicaes Windows O Visual Studio .NET acrescentou uma variedade de recursos ao VB .NET para tornar o IDE mais poderoso e melhorar a funcionalidade de formulrios Windows. H melhorias no suporte a criao de menus, controles que automaticamente redimensionam baseados no texto a ser exibido. melhor posicionamento de controles para janelas redimensionadas e um melhorado mecanismo de atribuio da ordem de tabulao. Ancorando Controles nas Margens do Formulrio Quantas vezes voc criou formulrios e configurou a propriedade BorderStyle para fixa de modo a impedir que os usurios o redimensionassem? Se voc posicionou uma srie de botes na base do formulrio, voc no quer que as pessoas o redimensionem e, subitamente, a linha de base dos botes fique no meio do formulrio. O VB .NET permite que voc ancore os controles em um ou mais lados do formulrio. Isto permite que um controle se mova conforme o formulrio seja redimensionado de forma a ficar no lugar apropriado. Voltando ao Form1, remova o cdigo inserido no procedimento de evento Button1_Click. Faa o formulrio ficar um pouco maior e mova o boto em direo ao canto inferior direito. Agora, adicione um TextBox ao formulrio. Mude a propriedade Multiline do TextBox para True e redimensione o TextBox de modo a preencher a maior parte do formulrio, exceto a poro que agora contm o boto. Seu formulrio deve, agora, assemelhar-se ao que mostra a Figura 2.15. Figura 2.15. O formulrio como mostrado em tempo de design.

Rode o projeto. Aps a janela ser carregada, redimensione a movendo o canto inferior direito para baixo e para a direita. Voc ter algo que se parece com o que mostra a Figura 2.16. Figura 2.16. O formulrio em tempo de execuo mostrando o que ocorre aps o redimensionamento.

Naturalmente, isto parece um bocado estranho e exatamente o que voc est acostumado a ver que acontece no VB6. Sua soluo em VB6, a menos que voc use um componente extra, escrever um bocado de cdigo que executado quando o evento Resize do formulrio disparado. Voc usa este cdigo para mover o boto e redimensionar o TextBox. O VB .NET tem uma forma melhor de lidar com isto, portanto, pare a aplicao e retorne ao IDE. Certifique-se de que voc est na tab Form1.vb[Design] e clique no Button1. Na janela de propriedades, role para baixo at encontrar a propriedade Anchor. Quando voc abrir a list, voc ver uma estranha caixa que mostra algo cinza no meio e quatro retngulos ao seu redor. Por default, os retngulos da esquerda e do topo so escurecidos, enquanto os retngulos da direita e da base esto vazios. Os retngulos escurecidos indicam que, neste momento, o boto est ancorado no topo e esquerda do formulrio. Quando voc redimensiona o formulrio, o boto permanecer mesma distncia do topo e da esquerda do formulrio. Isto no o que voc quer, portanto, clique nos retngulos da esquerda e do topo para limp-los, e clique nos retngulos da direita e da base para escurec-los. Quando voc terminar, a propriedade Anchor dever mostrar-se como na Figura 2.17. Aps voc fechar a lista, a propriedade Anchor dever mostrar Botton, Right.

Figura 2.17. A ferramenta da propriedade Anchor.

Em seguida, clique no TextBox e escolha a propriedade Anchor. Clique nos retngulos da base e da direita, mas deixe os retngulos da esquerda e do topo como j esto. Agora, o TextBox est preso a todas as bordas, e permanecer mesma distncia delas. A propriedade Anchor para o TextBox dever mostrar agora Top, Bottom, Left, Right. Rode o projeto novamente. Aps o formulrio se abrir, redimensione-o. Note que o boto agora permanece no canto direito inferior, e o TextBox automaticamente se redimensionou com o formulrio. Voc pode ver este comportamento na figura 2.18. O redimensionamento e o movimento foram obtidos sem escrever uma linha de cdigo. Figura 2.18. O formulrio mostrando como os controles podem ser redimensionados e movidos conforme o formulrio redimensionado.

Menus Facilitados Se voc odiava a criao de menus em verses anteriores do VB, voc no est sozinho.O editor de menus do VB nunca ganhou nenhum prmio de facilidade de uso nem por ser amigvel ao usurio. O novo editor de menus do VB .NET pode at tornar divertida a criao de menus. Usando o mesmo formulrio do exemplo anterior, v caixa de ferramentas e d um duplo clique no controle MainMenu. O controle MainMenu adicionado rea abaixo do formulrio, chamada de Componente Tray, que voc ver em maiores detalhes mais adiante. Se voc der um clique simples no controle MainMenu na Component Tray, voc ver uma barra de menus adicionada ao formulrio, que simplesmente desloca para baixo o TextBox. O menu mostra um item que diz Type Here, conforme mostrado na Figura 2.19. Figura 2.19. O novo Editor de Menus em ao.

D um clique na caixa que diz Type Here (Digite aqui) e digite &File. Isto ir criar uma nova caixa Type Here direita e uma nova caixa Type Here abaixo. Clique na Type Here abaixo da palavra &File e digite &Open. Do mesmo modo que em verses anteriores do VB, o "&" usado para significar uma seleo Alt+Tecla. Digitando &Open cria uma nova caixa Type Here direita e uma nova abaixo. Como voc pode ver, voc est criando graficamente um menu. Clique na caixa abaixo de Open e digite &Close. Voc pode clicar na caixa Type Here abaixo do menu File e escolher adicionar mais um menu de nvel mximo. Por exemplo, voc poderia adicionar &Edit direita do menu File. Agora, o menu Edit ganha entradas em branco e voc pode adicionar itens copiando e colando. Clique no menu Open que voc acaba de criar. Se voc olhar na janela de propriedades, voc ver que o nome real do objeto MenuItem2. Voc pode mudar isto se quiser, mas no se preocupe com isto por enquanto. Clique na lista para a propriedade Shortcut. Role a lista at encontrar a opo Ctrl+O. A propriedade ShowShortcut configurada para True por default, mas voc no ver o atalho em tempo de design. Rode a aplicao. A Figura 2.20 mostra lhe o que voc deveria ver. Note que o sublinhado das letras (gerado pelo &) no aparece a menos que voc pressione a tecla Alt. Figura 2.20. O novo menu sendo exibido em tempo de execuo.

Configurando a Ordem de Tabulao Se voc detestava criar menus em verses prvias do VB, bem provvel que voc tambm odiava a configurao da ordem de tabulao, especialmente em formulrios complexos. Voc tinha que clicar em cada controle, um de cada vez, e certificar-se de que a propriedade TabIndex estivesse correta. Agora, usando o formulrio com que voc tem trabalhado, remova o textbox. Deixe o Button1 no canto direito do formulrio. Adicione trs novos botes ao formulrio. Posicione-os de tal forma que o Button1 seja o ltimo na srie. Pode at mistur-los, se preferir. Se voc der uma olhada na Figura 2.21, voc ver que os botes foram posicionados de tal forma que voc iria querer que a ordem de tabulao fosse Button2, Button4, Button3 e Button1. Se voc rodar o projeto desta forma, contudo, a ordem ainda ser Button1, Button2, Button3 e Button4. Figura 2.21. O formulrio com botes na ordem errada.

Para configurar a ordem de tabulao, clique no menu View e escolha Tab Order. Voc ter, agora, pequenos nmeros em cada controle que podem receber o foco como mostrado na Figura 2.22. Para modificar a ordem de tabulao, simplesmente clique nos controles na ordem que voc quer que eles recebam o foco. Neste exemplo, voc apenas clica no Button2, Button4, Button3 e Button1, nesta ordem, e a ordem de tabulao criada para voc conforme evidenciado pelo nmero no canto alto esquerdo de cada boto. Figura 2.22. A nova forma de configurar a ordem de tabulao.

Voc pode escolher View, Tab Order novamente e desativar a exibio da ordem de tabulao. Rode o projeto e verifique a nova ordem de tabulao. Controles Line e Shape Se voc examinar a caixa de ferramentas, poder estranhar a ausncia dos controles Line e Shape. Eles se foram. Estes controles se foram, mas voc tem uma alternativa. A Microsoft os removeu porque eles eram controles sem janela correspondente, isto , eles no tinham uma propriedade hWnd, mas eram desenhados diretamente sobre o formulrio. Nos novos formulrios do VB .NET, todos os controles precisam ser janelas e voc no pode mais ter controles transparentes. Agora que voc recebeu a explicao tcnica, o que voc pode fazer sobre isto? A forma fcil de forjar uma linha usar um label. Ative a borda e ento atribua a altura (ou largura) para 1. Isto faz com que o label se parea com uma linha e funciona bem. Para formas mais complexas, a Microsoft recomenda que voc use os objetos GDI+, que so muito poderosos. Os objetos GDI+ esto no namespace System.Drawing, e sero examinados brevemente no captulo 3, "Principais Mudanas do VB .NET". Opacidade de Formulrio

Os formulrios, agora, tm a propriedade Opacity. um recurso necessrio? Provavelmente no, mas pode ser usado para alguns propsitos bastante teis. Por exemplo, voc pode us-la para fazer os formulrios desaparecerem e reaparecerem, e torn-los translucentes enquanto esto sendo arrastados. No formulrio Form, que voc tem trabalhado at aqui, localize sua propriedade Opacity e modifique-a para 50%. Agora, rode o projeto e voc notar que o formulrio est quase todo transparente. O formulrio ainda funciona normalmente. Voc pode clicar e arrastar o formulrio, pressionar os botes. Ele funciona bem, mas est translcido no momento. Feche o projeto e voc poder adicionar algum cdigo para tirar vantagem deste nova propriedade. V caixa de ferramentas e adicione um timer ao seu formulrio. Diferentemente do VB6, o timer no aparece de fato no formulrio, mas na Component Tray para o formulrio. Clique no timer nesta janela e atribua True propriedade Enabled do timer. O intervalo de 100 est bom. Agora, clique na tab Form1.vb para acessar o cdigo. Na rotina Sub New, adicione a seguinte linha aps o comentrio "Add any initialization ..." : Me.Opacity = 0 Isto to somente atribui a opacidade 0, o que significa que o formulrio estar completamente invisvel quando carregado. Em seguida, use as combos Class Name e Method Name no topo da janela de cdigo e escolha o evento Elapsed do controle Timer1. Isto faz com que seja adicionado um procedimento de evento para tratar o evento Timer1_Elapsed. Dentro deste procedimento de evento, entre com o seguinte cdigo: Me.Opacity = Me.Opacity + 0.01 If Me.Opacity >= 1 Then Timer1.Enabled = False Beep() End If Este cdigo simplesmente incrementa a opacidade em .01 a cada vez que o evento Elapsed ocorre. Quando finalmente ele atinge 1 (100%), o timer se desliga atribuindo False sua propriedade Enabled e o bip chamado para soar um alarme tal que voc saiba que ele terminou. Se voc est todo confuso com o cdigo, a listagem 2.2 mostra como a listagem completa ficar (com o cdigo gerado para Windows Form Designer oculto).

Listagem 2.2 Sua Primeira Aplicao VB .NET com Todo o Cdigo Discutido At Aqui. 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 End Sub Private Sub Timer1_Elapsed(ByVal Sender As Object, _ ByVal e As System.Timers.ElapsedEventArgs)Handles Timer1.Elapsed Me.Opacity = Me.Opacity + 0.01 If Me.Opacity >= 1 Then timer1().Enabled = False Beep() End If End Sub End Class Rode o projeto. Voc dever ver o seu formulrio surgir aos poucos medida que a opacidade lentamente aumentada. Voc ouvir um bip quando a formulrio estiver plenamente opaco. Sumrio Este captulo procurou introduzi-lo rapidamente no IDE do VB .NET. Voc criou seu primeiro programa em VB .NET e viu alguns dos novos recursos apresentados no IDE. Agora mais fcil fazer os controles manterem suas posies mesmo quando os formulrios so redimensionados. A ajuda mais rapidamente acessvel. O Server Explorer torna mais fcil localizar e usar recursos disponveis na corporao. Novos tipos de projetos abrem um novo mundo para os desenvolvedores VB .NET.
Em adio a estas mudanas, h tambm algumas mudanas fundamentais na linguagem. Algumas das quais foram mencionadas neste captulo e, se voc olhou o cdigo, deve ter visto ainda outras. O prximo captulo dedicado a apresentar algumas das mais importantes mudanas na linguagem

Captulo 3. Principais Mudanas do VB .NET


NESTE CAPTULO Mudanas Gerais Novos Itens O VB. NET apresenta grandes mudanas para a linguagem Visual Basic. Algumas so modificaes a formas j existentes de trabalhar, enquanto outras so novas por inteiro. Este captulo ir cobrir algumas destas mudanas, mas no uma lista exaustiva de todas as mudanas do VB para o VB .NET. Inicialmente voc ver alguns dos recursos que foram modificados. Ento, voc ir ver alguns dos recursos inteiramente novos. Mudanas Gerais H um nmero de mudanas gerais para se conhecer na migrao do VB para o VB .NET. Entre elas h tpicos tais como a remoo das propriedades default, subs e funes requerendo parnteses e ByVal passando a ser o modo padro de passagem de parmetros. Estas mudanas e outras sero detalhadas nesta seo. Propriedades Padro No VB6, objetos poderiam ter propriedades padro. Por exemplo, o cdigo seguinte perfeitamente vlido no VB6, se voc assumir que Text1 uma textbox: Text1="Hello, World" Este cdigo atribui a string "Hello Word" propriedade default da textbox, a propriedade Text. A principal desvantagem em ter propriedades default que elas exigem que voc tenha um comando Set no VB. Por exemplo, d uma olhada no seguinte bloco de cdigo em VB6:: Dim txtBillTo as TextBox Dim txtShipTo as TextBox txtShipTo = txtBillTo A linha de cdigo txtShipTo = txtBillTo atribui o valor da propriedade Text de txtShipTo ao valor da propriedade Text de txtBillTo. Mas, e se isto no fosse o que voc desejasse? E se, ao contrrio, voc quisesse criar uma referncia em txtShipTo que referenciasse o objeto txtBillTo? Voc teria que usar este cdigo:

Set txtShipTo = txtBillTo Como voc pode ver, propriedades default exigem que voc use Set para atribuir referncias de uma varivel de objeto a outra. O VB .NET se livra deste problema livrando-se das propriedades default. Portanto, para copiar a propriedade Text de txtBillTo para a propriedade Text de txtShipTo, voc tem de usar este cdigo: txtShipTo.Text = txtBillTo.Text Atribuindo uma varivel outra, faz com que a referncia de uma seja passada para a outra. Em outras palavras, voc obtm uma referncia a um objeto sem usar a palavra Set. txtShipTo = txtBillTo ' Referncia de objeto no VB.NET Propriedades Default Requerem Propriedades Parametrizadas Para ser mais preciso, as propriedades default sem parmetros no mais so suportadas. Propriedades default que requerem parmetros so ainda suportadas. Propriedades default com parmetros so muito comuns em classes de colees, como em ADO. Num exemplo de ADO, se voc assumir que rs um recordset ADO, confira o seguinte cdigo: rs.Fields.Item(x).Value ' OK, completamente qualificado rs.Fields(x).Value ' OK, porque o item parametrizado rs.Fields(x) ' Erro, porque Fields no parametrizado A soluo simples qualificar totalmente tudo. Isto evita qualquer confuso sobre quais propriedades so parametrizadas e quais no so. Contudo, como voc sabe dos seus dias de VB, o nmero de pontos que voc usa devem ser minimizados. A razo para isto que cada ponto requer uma pesquisa de OLE, o que torno o cdigo mais lento. Portanto, voc deve codificar cuidadosamente quando estiver lidando com parmetros. Subs e Funes Requerem Parnteses Como voc viu no ltimo captulo, quando voc usa a funo MsgBox, voc precisa sempre usar parnteses com funes, mesmo se voc estiver ignorando o valor de retorno. Em adio, voc precisa usar parnteses tambm quando chamar subs, o que voc no precisava fazer no VB6. Por exemplo, assuma que voc tem este sub tanto em VB6 quanto em VB .NET:

Sub foo(ByVal Greeting As String) 'cdigo de implementao aqui End Sub No VB6, voc poderia chamar este sub de duas formas: foo "Hello" Call foo("Hello") No VB .NET, voc tambm pode chamar este sub de duas formas: Foo("Hello") Call foo("Hello") A diferena entre o modo como o VB e o VB .NET tratam isto , naturalmente, que o VB .NET sempre requer os parnteses nas chamadas, mesmo que voc no esteja retornando nada. No VB .NET, o comando Call ainda suportado, mas no realmente necessrio. Mudanas em Operadores Booleanos Os operadores And, Not e Or eram para ter sofrido algumas mudanas no VB .NET. Inicialmente a Microsoft disse que estes operadores iriam ter um curto-circuitar, mas no momento eles continuam funcionando do mesmo modo que eram no VB6. Curto-circuitar significa dizer que, se voc estivesse examinando duas condies com um operador AND e a primeira delas fosse falsa, seu programa no precisaria examinar a segunda condio. Seu cdigo ficaria mais eficiente. Mas, como no houve nenhuma mudana no VB .NET, isto significa que, assim como no VB6, se voc tiver duas condies em um AND e a primeira falhar, voc ainda ter que examinar a segunda. Examine o seguinte cdigo: Dim x As Integer Dim y As Integer x=1 y=0 If x = 2 And y = 5/y Then ... Como um humano, voc sabe que a varivel x igual a 1. Portanto, quando voc examina a primeira parte do If, voc sabe que x no igual a 2, assim voc pensaria logicamente que deveria parar de avaliar a expresso. Contudo, o VB e o VB .NET examinam a segunda parte da expresso, assim este cdigo

ir causar um erro de diviso por zero, mesmo que o erro esteja na segunda parte da expresso e a primeira parte j tenha sido reconhecida como falsa. Se voc quer curto-circuitar, o VB .NET apresenta agora uma dupla de novos operadores: AndAlso e OrElse. Neste caso, o cdigo seguinte no gerar um erro no VB .NET: Dim x As Integer Dim y As Integer x=1 y=0 If x = 2 AndAlso y = 5/y Then ... Este cdigo no causa um erro; por x no ser igual a 2, o VB .NET no examina a segunda condio. Mudanas em Declaraes Voc pode agora inicializar suas variveis quando voc as declara. Voc no podia fazer isto no VB6. No VB6, a nica forma de inicializar variveis era fazendo-o numa linha separada, como esta: Dim x As Integer x=5 No Vb .NET, voc pode reescrever isto em uma s linha: Dim x As Integer = 5 Uma outra mudana significativa, e muito solicitada, a de poder declarar mltiplas variveis e o tipo de dados a ser assumido por todas elas de uma s vez. Exemplo: Dim x, y As Integer Na declarao acima, como voc provavelmente sabe, no VB6, y ser um tipo de dados Integer, e x um Variant. No VB .NET, isto mudou, assim ambos x e y so Integers. Se voc pensar, "J era em tempo", h muitos que concordam com voc. Isto remove muitos bugs e estranhas converses de tipos que novos programadores experimentam. Fazer com que as variveis sejam de um tipo esperado tambm faz com que o cdigo fique mais eficiente. Suporte para Novos Operadores de Atribuio

O VB .NET agora suporta atalhos para fazer certas operaes de atribuio. No VB6, voc incrementava x de 1 com a seguinte linha de cdigo: x=x+1 No VB .NET, voc pode criar um comando equivalente escrevendo assim: x += 1 No apenas voc pode usar o sinal de mais, mas o VB .NET agora suporta -=, *=, /=, \= e ^= para operaes matemticas e &= para concatenao de strings. Se tudo isto se parece com C/C++, de l que veio. Contudo o operador ++ no suportado. Os desenvolvedores da Microsoft tomaram a deciso de no incluir o operador ++ por achar que isto faria o cdigo menos legvel. ByVal Agora o Default O que muitos consideram uma estranha deciso, o modo padro de passagem de parmetros no VB tem sido sempre a passagem por referncia (ByRef). A escolha foi feita porque realmente a passagem por referncia mais rpida quando feita dentro da mesma aplicao, mas pode se tornar ineficiente quando se faz chamadas a componentes rodando em outro processo. Se voc no sabe bem o que passagem por referncia, por referncia significa que voc est passando apenas um endereo de memria de uma varivel dentro da rotina chamadora. Se a rotina chamada modifica a varivel, ela realmente atualiza a varivel no endereo de memria passado, fazendo com que a varivel se modifique tambm na rotina que a chamou. Passando dados por valor (ByVal) significa que voc est passando uma cpia dos dados rotina chamada. A rotina chamada precisa reservar uma nova rea na memria para armazenar aquele valor. Se a rotina chamada modifica o valor, ele modificado no endereo de memria reservado pela rotina chamada, mas a localizao de memria da rotina chamadora fica intacta. Veja este exemplo em VB6: Private Sub Command1_Click() Dim x As Integer x=3 foo x MsgBox x End Sub Sub foo(y As Integer) y=5 End Sub

Se voc rodar este exemplo no VB6, a caixa de mensagem exibe o valor 5. Isto ocorre porque no VB6, quando voc passa x para foo, voc est enviando o endereo de memria da varivel x. Assim, quando foo modifica y para 5, ela muda o valor no mesmo endereo de memria para o qual x aponta e isto faz com que o valor de x mude tambm. Se voc tentasse digitar este exemplo no VB .NET, voc veria algo acontecer. Primeiro, naturalmente, voc teria que adicionar parnteses ao redor de x na sua chamada a foo. Contudo, quando voc tentasse digitar a definio de foo, o VB .NET automaticamente adicionaria a palavra chave ByVal na sua definio, assim ela terminaria parecendo-se com isto: Sub foo(ByVal y As Integer) Se voc quisesse passar por referncia, voc teria que adicionar a palavra chave ByRef por conta prpria, ao invs de deixar o VB .NET usar o novo padro de ByVal. Isto elimina muitos erros vistos por programadores novatos que no entenderam bem o conceito de passagem por referncia em verses prvias do VB. Assim, no VB .NET, aceitando o padro resulta em passagem de dados por valor. Se voc rodar este cdigo no VB .NET, voc ver 3 na caixa de mensagem. Passagem de dados por valor um benefcio para aqueles que vo chamar rotinas cruzando fronteiras de processos, algo muito comum em aplicaes distribudas. A razo de ser um benefcio depende de como voc passa parmetros entre componentes. Se voc tem duas rotinas no mesmo processo que o que ocorre mesmo quando voc usa dlls locais -, e uma rotina passa um parmetro para a outra ByRef, ambas as rotinas podem acessar o mesmo endereo de memria. Contudo, se voc agora move uma destas rotinas para um outro processo, elas no podem acessar o mesmo endereo de memria (ao menos no com facilidade). Assim, mesmo se voc passar um parmetro para uma rotina fora do processo usando ByRef, a rotina chamada receber uma cpia dos dados e reservar memria para eles. E qualquer mudana feita nos dados pela rotina chamada tem que ser reconduzida para a rotina chamadora, o que requer uma lenta e custosa viagem dos dados entre fronteiras de processos. Passando parmetros para rotinas fora do processo usando ByVal, voc no tem que reconduzir as mudanas para a rotina chamadora. Muitos desenvolvedores criaram componentes para rodar em processos externos no VB (out-of-process), mas passando valores ByRef, no se apercebendo ser mais lento do que a passagem ByVal. O padro do VB .NET de passagem de parmetros ByVal deve evitar muitos destes enganos. Escopo a Nvel de Bloco

O VB .NET acrescenta a possibilidade de criar variveis que so visveis apenas dentro de um bloco. Um bloco qualquer seo de cdigo que termina com uma das palavras: End, Loop ou Next. Isto significa que blocos For...Next, If...End podem ter suas prprias variveis. Veja o seguinte cdigo: While y < 5 Dim z As Integer ... End While A varivel z visvel apenas dentro do loop While. importante perceber que, embora z seja visvel apenas dentro do loop While, seu tempo de vida o mesmo do procedimento. Isto significa que, se voc reentrar no loop, z ter o mesmo valor de quando voc saiu. Portanto, diz-se que o escopo de z de nvel de bloco, mas o seu tempo de vida de nvel de procedimento.
While...Wend

Torna-se While...End

While

O loop While ainda suportado, mas o fechamento do loop agora End While ao invs de Wend. Se voc digitar Wend, o editor automaticamente muda para End While. Esta mudana finalmente modifica o loop While para finalmente se assemelhar a outras estruturas de bloco do VB, as quais sempre terminam com uma sintaxe de End <bloco>. Mudanas em Procedimentos O VB .NET tem mudanas que afetam como voc define e trabalha com procedimentos. Algumas destas mudanas so mencionadas nesta seo. Argumentos Opcionais Requerem um Valor Padro No VB6, voc podia criar um argumento opcional ( ou vrios argumentos opcionais ) quando definia um procedimento. Voc poderia, opcionalmente, passar um valor por eles. Se voc no atribusse um valor padro e o chamador no passasse um valor, a nica forma de voc checar isto era pela chamada a IsMissing. no mais suportado, porque o VB .NET no deixar que voc crie argumentos opcionais que no tenham um valor default. IsMissing no mais necessrio, porque um argumento opcional ter sempre um valor. Por exemplo, sua declarao poderia parecer-se com isto:
IsMissing

Sub foo(Optional ByVal y As Integer = 1) Note que a palavra Opcional exibida, do mesmo modo que no VB6. Isto significa que o parmetro no precisa ser passado. Contudo, se ele no for

passado, y recebe o valor default de 1. Se a rotina chamadora passar um valor, naturalmente, y ter o valor que for passado nele.
Static

No Mais Suportada em Subs ou Functions

No VB6, voc por Static na declarao de um sub ou funo. Assim fazendo, tornava estticas todas as variveis naquele sub ou funo, o que significa que elas reteriam o valor entre chamadas rotina. Por exemplo, isto era aceito no VB6: Static Sub foo() Dim x As Integer Dim y As Integer x=x+1 y=y+2 End Sub Neste exemplo, x reter seu valor entre chamadas. Assim, a segunda vez que esta rotina for chamada, x j ter um valor de 1 e o valor de x ser incrementado para 2. A varivel y ter o valor de 2 e, portanto, na segunda vez ser incrementada para 4 O VB .NET no suporta mais a palavra chave Static na frente de declaraes de sub ou function como fazia o VB6. Se voc quiser que todas as variveis de um sub ou function sejam estticas, voc ter que colocar a palavra chave Static na frente da declarao de cada varivel. No VB .NET, o sub equivalente ao do exemplo anterior seria: Sub foo() Static x As Integer Static y As Integer x=x+1 y=y+2 End Sub O Comando Return O comando Return pode ser usado para produzir um imediato retorno de uma rotina chamada e, opcionalmente retornar um valor. Por exemplo, veja neste bloco de cdigo: Function foo() As Integer While True Dim x As Integer x += 1

If x >= 5 Then Return x End If End While End Function Neste cdigo, voc entra no que se costuma chamar de loop infinito pela instruo While True. Dentro do loop, voc declara um integer chamado x e comea a increment-lo. Voc testa o valor de x e quando ele se torna maior que 5, voc chama Return e retorna o valor de x. Isto causa um retorno imediato, o que significa que o programa no espera chegar no End Function para retornar. A velha forma de retorno ainda funciona. Por exemplo, para reescrever este procedimento usando o modo antigo de retornar um valor, voc faria como no cdigo a seguir. Voc atribuiria o valor a ser retornado ao nome do procedimento foo. Ento voc sairia do loop e chegaria ao End Function. Voc tambm poderia usar Exit Function ao invs de Exit Do. Function foo() As Integer Do While True Dim x As Integer x += 1 If x >= 5 Then foo = x Exit Do End If Loop End Function ParamArrays So Agora Passadas ByVal Uma matriz de parmetros, ou ParamArray, usada quando voc no sabe quantos valores voc ir passar para um procedimento. Uma ParamArray permite um nmero ilimitado de argumentos. Uma matriz de parmetros automaticamente se redimensiona para conter o nmero de elementos que voc est passando. Um s pode ter uma ParamArray e ela deve ser o ltimo argumento na definio. A matriz deve ser de uma dimenso e todos os elementos devem ser do mesmo tipo de dados. Contudo, o tipo de dados padro Object, que o que substitui o tipo de dados Variant no VB .NET. No VB6, todos os elementos de uma ParamArrary eram passados ByRef. Isto no podia ser modificado. No VB .NET, todos os elementos so passados

ByVal. Isto tambm no pode ser mudado. Novamente, ByRef era usado em verses anteriores do VB por ser mais eficiente para passar parmetros dentro de um programa em que tudo estivesse rodando no mesmo espao de aplicao. Quando estiver trabalhando com componentes out-of-process, contudo, mais eficiente passar parmetros ByVal, como explicado anteriormente. Propriedade Podem Ser Modificadas Para ByRef No VB6, se uma classe tivesse uma propriedade , voc poderia passar aquela propriedade para um procedimento como argumento. Se voc passasse a propriedade ByVal, naturalmente, o valor seria apenas copiado. Se voc a passasse ByRef, a rotina chamada poderia modificar o valor, mais o novo valor no seria refletido de volta na propriedade do objeto. No VB .NET, contudo, voc pode passar uma propriedade para um procedimento ByRef e qualquer mudana feita no valor pela rotina chamada ser refletida no valor da propriedade do objeto. Veja o seguinte exemplo em VB .NET. No se incomode se a sintaxe da classe parecer estranha; apenas observe que voc est criando uma classe chamada Test com a propriedade Name. Voc instancia a classe no procedimento de evento Button1_Click e passa a propriedade Name por referncia para foo. foo modifica a varivel e termina. Voc ento usa uma caixa de mensagem para exibir a propriedade Name. Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim x As New Test() foo(x.Name) MsgBox(x.Name) End Sub Sub foo(ByRef firstName As String) firstName = "Torrey" End Sub Public Class Test Dim firstName As String Property Name() As String Get Name = firstName End Get Set(ByVal Value As String) firstName = Value

End Set End Property End Class Quando voc rodar este exemplo, a caixa de mensagem ir exibir "Torrey". Isto mostra que a propriedade do objeto est sendo passada por referncia e que as mudanas na varivel so refletidas de volta na propriedade do Objeto. Isto novo no VB .NET. Mudanas em Matrizes As matrizes sofreram algumas mudanas tambm. As matrizes podiam ser algo confusas nas verses anteriores do VB. O VB .NET procura eliminar qualquer confuso pela simplificao das regras e removendo a capacidade de ter limite inferior diferente de zero. Limite Inferior Sempre Zero O VB6 permitia que voc tivesse um limite inferior em suas matrizes diferente de zero de duas maneiras. Primeiro,voc poderia declarar uma matriz para um certo intervalo. Se voc quisesse uma matriz iniciando de 1, voc a declararia desta forma: Dim y(1 To 3) As Integer Isto iria criar uma matriz com trs elementos indexados 1-3. Se voc no quisesse este mtodo, voc poderia usar Option Base, que lhe permitiria atribuir o limite inferior padro tanto para 0 (o padro) ou 1. O VB .NET remove estas opes para voc. Voc no pode usar a sintaxe 1 to x e Option Base no mais suportado. Na verdade, porque o limite inferior de matrizes sempre 0, a funo LBound no mais suportada no VB .NET. Atribuio de Matrizes ByRef ao Invs de ByVal No VB6, se voc tivesse duas variveis do tipo matriz e atribusse uma outra, voc estaria criando uma cpia da matriz atribuda. Agora, no VB .NET, atribuindo uma matriz a outra, voc est apenas atribuindo uma referncia matriz. Para copiar uma matriz, voc usa o mtodo Copy do objeto Array. Option Strict uma nova declarao que desabilita qualquer converso automtica de tipo que resultaria em perda de dados. Voc passa a poder fazer apenas converses de um tipo menor para um tipo com maior capacidade de
Option Strict

armazenamento. Voc no poder converter, por exemplo, de um Long para um Integer, mas poder converter de um Integer para um Long. Option Strict tambm impede a converso entre nmeros e strings. desligado por default. Para lig-lo, v ao topo da janela de cdigo e digite Option Strict On.
Option Strict

Se voc for ao topo de um mdulo e digitar Option Strict On, voc poder ver que o IDE reconhecer potenciais problemas de converso de tipos com as seguintes linhas de cdigo: Dim longNumber As Long Dim integerNumber As Integer integerNumber = longNumber Com este cdigo, o IDE ir sublinhar longNumber e uma tooltip ir dizer lhe o seguinte:
Option Strict disallows implicit conversions from Long to Integer.

Nota Eu recomendo fortemente que voc use Option Strict On e Option Explicit On. Ligando os dois pode ajudar a reduzir erros que podem ocorrer apenas em tempo de execuo. Mudanas em Tipos de Dados H vrias mudanas em tipos de dados que so importantes de apontar. Estas mudanas podem ter um impacto na performance e na utilizao de recursos do seu cdigo. Os tipos de dados no VB .NET correspondem aos tipos de dados no namespace System, que importante para interoperabilidade entre linguagens. Todas as Variveis So Objetos Tecnicamente, no VB .NET, todas as variveis so derivadas da classe base Object. Isto significa que voc pode tratar todas as variveis como objetos. Por exemplo, para saber o comprimento de uma string, voc pode usar o seguinte cdigo: Dim x As String x = "Hello, World" MsgBox(x.Length)

Isto significa que voc pode tratar x como um objeto e examinar sua propriedade Length. Outras variveis tm outras propriedades e mtodos. Por exemplo, um Integer tem o mtodo ToString que voc pode usar e ir v-lo num momento.
Short, Integer,

e Long

No VB .NET, o tipo de dados Short um inteiro de 16 bits, o Integer um inteiro de 32 bits e o Long um inteiro de 64 bits. No cdigo VB6, o Integer era um inteiro de 16 bits e um Long era um inteiro de 32 bits. Tornou-se comum para os programadores de VB usar o Long no lugar do Integer, porque o Long oferecia melhor performance em sistemas operacionais de 32 bits que o Integer. Contudo, em sistemas operacionais de 32 bits, inteiros de 32 bits so mais rpidos que inteiros de 64 bits. Portanto, no VB .NET, voc preferir voltar a usar o tipo de dados Integer ao invs do Long. Converso Automtica String/Nmero No Suportada por OptionStrict No VB6, era fcil converter de nmeros para strings e vice-versa. Por exemplo, examine este bloco de cdigo: Dim x As Integer Dim y As String x=5 y=x No VB6, no havia nada de errado com este cdigo, O VB iria tomar o valor de 5 e automaticamente convert-lo para uma string "5". O VB .NET, contudo, desabilita este tipo de converso se Option Strict estiver em On. Ao contrrio, voc ter que usar CStr para converter um nmero para uma string, ou a funo Val para converter uma string para um nmero. Voc poderia reescrever o cdigo anterior para o VB .NET da seguinte forma: Dim x As Integer Dim y As String x=5 y = CStr(x) y = x.ToString ' Isto equivalente linha anterior Strings de Tamanho Fixo No Mais Suportadas No VB6, voc poderia declarar um string de comprimento fixo usando um declarao como esta: Dim y As String * 30

Isto declararia y para ser uma string de comprimento fixo que armazenaria 30 caracteres. Se voc tentar usar este mesmo cdigo no VB .NET, voc produzir um erro. Todas as strings no VB .NET so de tamanho varivel. Todas as Strings So Unicode Se voc se cansou de preocupar-se com a passagem de strings do VB para certas chamadas de API que aceitam tanto strings ANSI ou Unicode, voc ficar feliz de ouvir que todas as strings no VB .NET so Unicode. O Valor de True Desde o Visual Basic 1.0, o valor de True no VB e no Access tem sido igual a -1. A .NET Framework declara que o valor de True igual a 1. Isto parece ser um conflito entre o VB .NET e o .NET Framework subjacente. |Na verdade, 0 False e qualquer valor True no VB .NET.Contudo, se voc perguntar pelo valor de True, voc receber -1 dentro do VB .NET. Voc pode verificar que qualquer valor diferente de zero True usando o seguinte cdigo: Dim x As Integer x=2 If CBool(x) = True Then MsgBox("Value is True") End If Se voc atribuir a x qualquer valor positivo ou negativo, a funo CBool ir retornar True. Se voc atribuir 0 a x, CBool ir retornar False. Mesmo True sendo exibido como -1 no VB .NET, se voc pass-lo para qualquer outra linguagem .NET, ela ir v-lo como 1. Isto significa que todas as outras linguagens o vem com o valor correto. Assim como aconteceu com o modo como as matrizes so dimensionadas, a Microsoft originalmente disse que o valor True, no VB .NET, iria mudar para 1. Contudo, muitos programadores em VB reclamaram e a Microsoft decidiu deixar True como -1. Isto uma vergonha, mas no porque True deveria ser 1. uma vergonha, porque significa que muitos programadores tm escrito cdigo que usa o valor -1 ao invs de usar a constante True. importante entender isto: no escreva cdigo para o valor (1 ou -1). Apenas use a constante True e voc ir evitar muitos problemas. O Tipo de Dados Currency Foi Trocado

O tipo de dados Currency foi trocado pelo tipo de dados Decimal. O tipo de dados Decimal um inteiro de 12 bytes sinalizado que pode ter at 28 dgitos direita do ponto decimal. Ele suporta maior preciso do que o Currency e foi criado para aplicaes que no podem tolerar erros de arredondamento. O tipo de dados Decimal tem um equivalente direto na .NET Framework, o que importante para interoperabilidade de linguagens. O Tipo de Dados Variant Foi Trocado O tipo de dados Variant foi trocado. Antes que voc comece a pensar que no h mais um tipo de dados para qualquer valor, entenda que o tipo de dados Variant foi trocado pelo tipo de dados Object. O tipo de dados Object ocupa apenas quatro bytes porque tudo que ele armazena um endereo de memria. Portanto, mesmo se voc atribuir um inteiro varivel, a varivel Object ocupa quatro bytes que apontam para o endereo de memria usado para armazenar o inteiro. O inteiro armazenado na memria. Ele ir ocupar oito bytes mais quatro bytes para o inteiro, consumindo assim doze bytes. Examine o cdigo a seguir: Dim x x=5 Neste caso, x uma varivel do tipo Object. Quando voc atribui 5 a x, o VB .NET armazena o valor 5 em outra localizao de memria e x armazena o endereo desta localizao de memria. Quando voc tenta acessar x, uma pesquisa requerida para localizar o endereo de memria e recuperar o valor. Portanto, do mesmo modo que o Variant, o tipo de dados Object mais lento que usar tipos de dados explicitos. Um tipo de dados Object pode ser Nothing. Em outras palavras, ele pode conter nada, o que significa dizer que ele pode no apontar para endereo algum de memria. Voc pode testar por Nothing usando o operador de comparao (=), usando a funo IsNothing ou perguntando se o objeto Is Nothing. Todas as trs opes so mostradas no cdigo a seguir: Dim x If x = Nothing Then MsgBox("Nothing") If IsNothing(x) Then MsgBox("Ainda nothing") If x Is Nothing Then MsgBox("E Ainda Nothing") Tratamento de Erros Estruturado O tratamento de erros mudou no VB .NET. Na verdade, a antiga sintaxe ainda funciona, mas h uma nova estrutura chamada Try...Catch...Finally que remove a necessidade de usar a antiga estrutura On Error Goto.

A idia geral da estrutura Try...Catch...Finally por o cdigo que pode causar o erro na poro Try e ento pegar o erro. Dentro da poro Catch, voc trata o erro. A poro Finally executa o cdigo que vem aps os comandos includos no Catch serem executados, independentemente de ter ou no havido um erro. Eis aqui um exemplo simples: Dim x, y As Integer ' Ambos sero Integers Try x \= y ' causa diviso por zero Catch ex As Exception msgbox(ex.Message) End Try Note A parte ex
As Exception

do comando Catch opcional.

Aqui voc tem duas variveis que so ambas Integers. Voc tentou dividir x por y, mas como y ainda no tinha sido inicializada, ela continha o padro 0. Esta diviso por zero gerou um erro e voc o pegou na linha seguinte. A varivel ex do tipo Exception, que contm um erro que acabou de ocorrer. Assim, voc simplesmente imprime a propriedade Message do mesmo modo como imprimia Err.Description no VB6. Na verdade, voc ainda pode usar Err.Description e o objeto Err no geral. O objeto Err ir pegar quaisquer erros que sejam gerados. Por exemplo, assuma que sua lgica dita que um erro seja gerado se o saldo da conta de algum se tornar muito baixo, e um outro erro gerado se o saldo se torna negativo. Examine o cdigo seguinte: Try If bal < 0 Then Throw New Exception("Saldo negativo!") ElseIf bal > 0 And bal <= 10000 Then Throw New Exception("Saldo negativo; cobrar juro") End If Catch MessageBox.Show("Error: " & Err.Description) End Try Neste caso, sua lgica de negcio diz que se o saldo cair abaixo de zero, voc gera um erro informando o usurio que o saldo est abaixo de zero. Se o saldo cair abaixo de 10.000 mas permanece acima de zero, voc notifica o usurio para iniciar a cobrana de juro. Neste caso, Err.Description pega a descrio que voc atribuir na sua Exception.

Voc pode tambm ter mltiplos comandos Catch para pegar vrios erros. Para ter um Catch para um erro em particular, voc adiciona uma clusula When ao Catch. Examine este cdigo: Dim x As Integer Dim y As Integer Try x \= y ' causa diviso por zero Catch ex As Exception When Err.Number = 11 MsgBox("Voc tentou dividir por zero") Catch ex As Exception MsgBox("Serve como um Catch para todos os demais erros") End Try Neste exemplo, voc est testando por um Err.Number igual a 11, que o erro da diviso por zero. Portanto, se voc tiver uma diviso por zero, voc exibe a mensagem que diz "Voc tentou dividir por zero". Contudo, se um erro diferente acontecer, voc ir cair no Catch sem a clusula When. Na verdade, um Catch sem uma clusula When age como uma seo "else" ou "otherwise" para tratar tudo que no foi tratado antes. Note que o cdigo no passa por todos os Catches; ele para no primeiro que encontra. No exemplo anterior, voc gerou um erro com o nmero 11. Voc ver a mensagem "Voc tentou dividir por zero", mas voc ir pulas o Catch genrico. Se voc quiser rodar algum cdigo no final, independente de que erro tenha ocorrido (ou, at mesmo, se nenhum erro ocorreu, voc pode adicionar um comando Finally. O cdigo para isto o seguinte: Dim x As Integer Dim y As Integer Try x \= y ' causa diviso por zero Catch ex As Exception When Err.Number = 11 MsgBox("Voc tentou dividir por zero") Catch ex As Exception MsgBox("Serve como um Catch para todos os demais erros") Finally MsgBox("Rodando o cdigo em Finally") End Try Neste cdigo, se voc teve ou no um erro, o cdigo na seo Finally ser executado.

Saindo de um Try...Catch...Finally Mais Cedo s vezes, voc quer sair de um Try...Catch...Finally antes do final. Para sair antecipadamente, use o comando Exit Try. Exit Try pode ser posto em qualquer bloco Catch ou no bloco Try, mas no no bloco Finally. Aps o Exit Try, o cdigo cai no bloco Finally. A sintaxe se parece com isto: Dim x As Integer Dim y As Integer Try x \= y ' causa diviso por zero Catch ex As Exception When Err.Number = 11 msgbox("Voc tentou dividir por zero") Exit Try Catch ex As Exception msgbox("Serve como um Catch para todos os demais erros") Finally msgbox("Rodando o cdigo em Finally") End Try Estruturas Substituem Tipos Definidos Pelo Usurio (UDTs) Tipos definidos pelo usurio, ou UDTs, eram o modo de criar tipos de dados personalizados no VB6. Voc podia criar um novo tipo de dados que continha outros elementos nele. Por exemplo, voc podia criar um tipo de dados Cliente usando esta sintaxe: Private Type Cliente Nome As String Pagamento As Currency End Type Voc pode ento usar este UDT na sua aplicao com um cdigo como este: Dim comprador As Cliente comprador.Nome= "Martha" comprador.Pagamento= 20000 MsgBox(comprador.Nome & " " & comprador.Pagamento) A declarao Type no mais suportada no VB .NET. Ela foi substituda pela declarao Structure. A declarao Structure tem algumas grandes mudanas, mas para recriar o UDT mostrado acima, a sintaxe esta: Structure Cliente Dim Nome As String

Dim Pagamento As Decimal End Structure Note que a nica diferena real at aqui que voc tem de usar Dim em cada varivel dentro da estrutura, o que algo que voc no tinha de fazer em declaraes Type, mesmo com Option Explicit ligado. Note tambm que o Dim o mesmo que Public aqui, significando que as variveis so visveis para qualquer instncia da estrutura Estruturas tm muitos outros recursos, contudo. Uma das maiores diferenas que estruturas podem suportar mtodos. Por exemplo, voc poderia adicionar o mtodo Remessa estrutura Cliente para calcular os custos de envio baseados na zona de entrega. Este cdigo adiciona uma propriedade ZonaDeEntrega e uma funo CustoDeEnvio: Structure Cliente Dim Nome As String Dim Pagamento As Decimal Dim ZonaDeEntrega As Integer Function CustoDeEnvio() As Decimal If ZonaDeEntrega > 3 Then Return 25 Else Return CDec(12.5) End If End Function End Structure Aqui, voc tem uma funo embutida chamada CustoDeEnvio. Para usar esta estrutura, seu cdigo seria algo assim: Dim comprador As Cliente comprador.Nome = "Martha" comprador.Pagamento = 20000 comprador.ZonaDeEntrega = 4 msgbox(comprador.CustoDeEnvio) Neste caso , a mensagem exibir um valor de 25. Se voc pensar que isto se parece com uma classe, certamente similar. Na verdade, estruturas podem ter propriedades, mtodos e eventos. H certos inconvenientes, contudo. Algumas das limitaes incluem as seguintes:

Voc no pode herdar uma estrutura.

Voc no pode inicializar os campos dentro de uma estrutura. Por exemplo, este cdigo ilegal: Structure Cliente Dim Nome As String = "Martha" End Structure

Propriedades so pblicas por padro, ao invs de privadas como so nas classes.

Structures so tipos de valor e no tipos de referncia. Isto significa que se voc atrubuir uma varivel de estrutura a outra varivel de estrutura, voc obtm uma cpia da estrutura e no uma referncia para a estrutura. O cdigo seguinte mostra que est ocorrendo uma cpia porque uma atualizao em vendedor no atualiza comprador: Dim comprador As Cliente Dim vendedor ' tipo de dados Object vendedor = comprador vendedor .Nome = "Linda" MsgBox(comprador.Nome) MsgBox(vendedor.Nome) Note que o cdigo acima no ir funcionar se voc tiver Option Strict ligado. Se voc quiser testar este cdigo, voc ter que entrar com Option Strict Off. Novos Itens Em adio s mudanas ao ncleo da linguagem e em algumas ferramentas, h alguns recursos completamente novos no VB .NET. As principais novidades incluem recursos como construtores e destrutores, namespaces, herana, sobrecarga, multitarefa livre e garbage collection. Esta no uma lista completa de forma alguma, mas vale a pena discutir estes seis recursos em algum grau. Um recurso que deve ser mencionado j que algo que voc ver em toda parte a auto-indentao. To logo voc crie um bloco, como um Sub ou If, o IDE indenta a prxima linha de cdigo automaticamente. Construtores e Destrutores Construtores e destrutores so conceitos provavelmente novos para programadores em VB6. Eles so similares aos eventos Class_Initialize e Class_Terminate que voc tem nas classes de VB6. No seu nvel mais simples, construtores e destrutores so procedimentos que controlam a inicializao e destruio de objetos, respectivamente. Os procedimentos Sub New e Sub Finalize substituem os mtodos Class_Initialize e Class_Terminate

do VB6. Diferente de Class_Initialize, Sub New executado s uma vez, quando o objeto criado.Sub New no pode ser chamado explicitamente, exceto em raras circunstncias. chamado pelo sistema quando o objeto recebe atribuio de Nothing ou quando todas as referncias ao objeto so desfeitas. Contudo, voc no pode saber exatamente quando o Sub Finalize realmente ser chamado, em razo do modo como o VB .NET usa garbage collection, que ser discutido nas prximas sees.
Sub Finalize

Uma das razes para haver construtores que voc pode criar um objeto e passar alguns parmetros para inicializao. Por exemplo, assuma que voc quer criar uma classe lidando com um curso de treinamento e voc quer inicializar a classe com um nmero de curso de tal forma que ela possa encontrar certas informaes sobre o curso num banco de dados. Na sua classe, voc cria um mtodo Sub New que aceita um argumento para a identificao do curso. A primeira linha dentro do Sub New uma chamada a outro construtor, geralmente o construtor da classe base da qual esta se deriva. Felizmente o VB .NET lhe oferece uma forma fcil de chamar o construtor da classe base da sua classe atual: MyBase.New Se voc quer criar uma classe para um curso de treinamento e inicializ-la com um identificador de curso, sua classe se parecer talvez com isto: Class Course Sub New(ByVal CourseID As Integer) MyBase.New() FindCourseInfo(CourseID) ' localiza informaes sobre o curso ... End Sub End Class Para chamar esta classe do cdigo cliente, sua chamada ir se parecer com algo assim: Dim TrainingCourse as Course = New Course(5491) Como o Sub Finalize trabalha ser coberto na seo sobre garbage collection, onde voc ir ver o Sub Dispose. Namespaces Talvez um dos aspectos mais confusos do VB .NET para programadores em VB o conceito de namespace. Um namespace um modo fcil de organizar objetos em um assembly. Quando voc tem muitos objetos, tais como no

System namespace fornecidos pelo runtime, um namespace pode simplificar o acesso porque ele organizado em uma estrutura hierrquica e objetos relacionados aparecem agrupados sob o mesmo n. Por exemplo, digamos que voc quer criar objetos, propriedades e mtodos para um loja de animais. Voc poderia criar o namespace PetStore. Voc poderia ento criar alguns subnamespaces. Por exemplo, voc poderia vender animais vivos e suprimentos como duas categorias principais de produtos. Dentro da categoria de animais vivos, voc poderia vender ces, gatos e peixes. Se isto lhe parece um modelo de objetos, pode ser pensado de modo semelhante. Contudo, na verdade no se trata de objetos. Voc pode ter um namespace chamado PetStore.Animais.Caes e neste namespace voc teria as classes e mtodos necessrios para lidar com ces. Se voc quisesse saber que tipo de comidas de ces voc tem no estoque, voc poderia procurar no PetStore.Suprimentos.Caes. Onde estas classes existem fisicamente depende de voc; elas podem estar todas dentro de um grande assembly, mas logicamente separadas nestes vrios namespaces. Se voc quiser usar objetos em um assembly sem ter de qualific-los completamente toda vez, use um comando Imports. Assim fazendo voc usa os nomes dos objetos sem ter que qualificar suas hierarquias completas de namespace. Por exemplo, quando voc criou seu primeiro projeto VB .NET no captulo 2, "Sua Primeira Aplicao VB .NET", voc viu alguns comandos Imports no topo do mdulo de cdigo do form. Um destes comandos era Imports System.WinForms. Este comando tornou todas as classes, interfaces, estruturas, delegates e enumeraes disponveis para voc sem que voc tivesse que qualific-los completamente. Isto significa que o seguinte cdigo legal: Dim x as Button Sem o Imports
System.WinForms,

sua linha de cdigo teria que ser assim:

Dim x as System.WinForms.Button Na verdade, at a MsgBox que voc conhece e ama teria de ser substituda pela classe System.WinForms.MessageBox. A funo MsgBox ainda funciona por razes de compatibilidade, mas ela parte do namespace Microsoft.VisualBasic.Interaction , que contm um nmero de mtodos correspondentes a funes de verses prvias do VB. Se voc est se perguntando do porqu de a Microsoft ter sacado estes elementos da linguagem e os ter tornado parte do runtime, a razo bvia:

qualquer linguagem voltada para o runtime, em qualquer plataforma, tem acesso funcionalidade comum. Isto significa que voc pode entrar no C# e ter uma caixa de mensagem simplesmente importando o System.WinForms e usando a classe MessageBox. A MessageBox bastante poderosa - o mtodo Show tem doze variaes disponveis graas sobrecarga. Voc ir aprender o que sobrecarga em um instante. Criando Seu Prprio Namespace Voc livre para criar seu prprio namespace dentro de seus assemblies. Voc pode faz-lo simplesmente inserindo seu bloco Namespace... End Namespace. Dentro do bloco namespace, voc pode ter estruturas, classes, enums, interfaces e outros elementos. Quando voc nomeia o namespace, ele se torna possvel de ser importado. Seu cdigo poderia ser algo assim:: Namespace VolantTraining Public Class Customer 'cdigo aqui End Class Public Class Student 'cdigo aqui End Class End Namespace Namespaces podem ser aninhados dentro de outros namespaces. Por exemplo, seu namespace poderia se parecer com algo assim: Namespace TreinamentoVolante Namespace Cliente Class Trainamento ... End Class Class Consultoria ... End Class End Namespace Namespace Estudante ... End Namespace End Namespace Aqui, um namespace, TreinamentoVolante, contm dois outros namespaces: Cliente e Estudante. O namespace TreinamentoVolante.Cliente contm as

classesTrainamento e Consultoria, e voc pode ter clientes que usam seus servios de treinamento e clientes que usam seus servios de consultoria Se voc escolher no criar explicitamente namespaces, todas as suas classes e mdulos ainda pertencem a um namespace. Este namespace o namespace padro e o nome do seu projeto.Voc pode ver este namespace e mud-lo se quiser, basta ir caixa de dilogo Project Properties para o seu projeto. Se voc declara um namespace dentro do seu projeto, ele subordinado a este namespace raiz. Portanto, se um namespace raiz da sua aplicao for Project1, o namespace completo para TreinamentoVolante Project1.TreinamentoVolante. Herana O recurso mais requisitado para ser adicionado ao VB por anos tem sido a herana. A Microsoft frequentemente afirmou que o VB j possuia herana; o VB suportava herana de interface, o que significa que voc podia herdar uma interface usando o comando Implements. Contudo, as interfaces herdveis no VB no podiam ter qualquer cdigo nelas, ou se tivesse, o cdigo era ignorado na herana. Portanto, a classe que estivesse herdando a interface tinha que fornecer mtodos para todos os mtodos na interface. Se voc tivesse mais de uma classe que herdasse a interface, voc teria que reescrever o cdigo em cada uma delas. Os programadores de VB queriam poder escrever o cdigo de implementao da interface uma nica vez em uma classe base e ento herdlo em outras classes, que seriam chamadas de classes derivadas. As classes derivadas poderiam usar o cdigo da classe base. Com o VB .NET, os programadores tem o queriam. No apenas suas classes derivadas herdam as propriedades e mtodos da classe base, elas podem estender os mtodos e, naturalmente, criar novos mtodos (apenas na classe derivada). As classes derivadas podem tambm substituir qualquer mtodo na classe base com um novo mtodo de mesmo nome, num processo chamado overriding. Formulrios, que na verdade so apenas classes, podem ser herdados para criar novos formulrios. H muitos conceitos relacionados a herana e v-la na prtica importante o bastante para justificar um captulo para isto. O captulo 5, "Herana com VB .NET", todo sobre a herana e como us-la no VB .NET. Sobre-Carregamento (Overloading) Sobre-carregamento um outro recurso que alguns desenvolvedores VB tm requisitado por um longo tempo. Resumidamente, sobre-carregamento permite que voc defina um mesmo procedimento mltiplas vezes. O

procedimento tem o mesmo nome, mas uma diferente lista de argumentos de cada vez. Voc poderia simular isto de uma forma deselegante no VB6. Voc poderia passar um argumento como um Variant, e ento usar o comando VarType para checar o tipo de varivel que estava sendo passada. Isto era desajeitado e o cdigo poderia se tornar intil se voc tivesse que aceitar uma matriz ou uma coleo. O VB .NET lhe d um modo timo para lidar com isto. Imagine que voc tem um procedimento capaz de aceitar strings ou inteiros. A funcionalidade dentro do procedimento ser totalmente diferente dependendo se o que passado for uma string ou um inteiro. O seu cdigo se parecer com isto: Overloads Function FindCust(ByVal psName As String) As String ' pesquisa pelo valor de psName End Function Overloads Function FindCust(ByVal piCustNo As Integer) As String ' pesquisa por piCustNo End Function Voc tem agora uma funo chamada FindCust que pode receber tanto um inteiro como uma string. Suas chamadas a ela podem ser feitas assim: Dim x As String x = FindCust("Smith") x = FindCust(1) Se Option Strict estiver em On, voc no consegue compilar uma chamada invlida. Por exemplo, no h nenhuma verso sobre-carregada de FindCust que aceita um valor de ponto flutuante de qualquer tipo. O VB .NET no permitir que o cdigo seguinte compile: x = FindCust(12.5) Multithreading Pela primeira vez, o VB NET deu aos desenvolvedores a possibilidade de escrever aplicaes verdadeiramente multi-encadeadas (com multithreading). Se suas aplicaes devem realizar uma tarefa que ir demorar um longo perodo, tal como percorrer um longo recordset ou realizar uma srie de complexos clculos matemticos, voc pode confinar aquele processo sua prpria thread (encadeamento) e ainda deixar que a sua aplicao esteja acessvel para o usurio realizar outras tarefas. No VB6, o melhor que voc

poderia fazer para impedir que o resto de sua aplicao ficasse travado era usar o mtodo DoEvents. Examine este cdigo que foi escrito para VB .NET. Aqui voc tem algum cdigo para o Button4. Este cdigo chama a rotina BeBusy (esteja ocupado), que tem um loop apenas para tomar tempo. Contudo, enquanto estiver neste loop voc estar consumindo a thread para a aplicao e a interface com o usurio no responder enquanto o loop estiver rodando. CUIDADO Isto levou por volta de oito segundos para rodar na minha mquina. Pode ser muito mais lento ou mais rpido na sua mquina. A boa nova que o VB .NET IDE roda numa thread separada. Assim, se voc se achar esperando para sempre, apenas clique no IDE e escolha Stop Debugging no menu Debug. Private Sub Button4_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button4.Click BeBusy() End Sub Sub BeBusy() Dim i As Decimal For i = 1 To 10000000 'nada faz, mas segura a aplicao Next Beep() End Sub Se voc rodar este cdigo e tentar clicar no formulrio antes que BeBusy termine de rodar, voc ver que o formulrio no responde a nenhum evento. Por exemplo, outros botes no podem ser clicados enquanto BeBusy estiver rodando. Para que o formulrio continue a responder enquanto BeBusy estiver rodando, voc pode rodar BeBusy em uma thread separada. Para criar uma nova thread, voc precisa usar a classe System.Threading.Thread. Na criao da classe, voc passa o nome do procedimento ou mtodo que voc quer rodar naquela thread. Voc prefixa o nome do procedimento ou mtodo com o operador AddressOf. Seu cdigo iria parecer com isto: Dim busyThread As New System.Threading.Thread(AddressOf BeBusy) Para corrigir o cdigo e evitar que BeBusy continue consuminto a thread do programa principal, voc criou agora uma nova thread e ir rodar BeBusy

nesta thread. Contudo, aquela linha de cdigo no o suficiente. Em seguida, voc deve chamar o mtodo Start na nova thread. Com o VB .NET, para chamar BeBusy na sua prpria thread ficaria assim: Private Sub Button4_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button4.Click Dim busyThread As New System.Threading.Thread(AddressOf BeBusy) busyThread.Start() End Sub Nenhuma mudana necessria na rotina BeBusy. Se voc rodar este cdigo agora, a interface continuar ativa enquanto BeBusy estiver rodando. O Beep em BeBusy ir faz-lo saber quando o procedimento chegar ao final. H algumas limitaes para usar mtli-encadeamento livre. Elas podem ser significativas, mas para cada uma delas h uma forma de contorno. Algumas destas limitaes so:

O procedimento ou mtodo que voc estiver rodando em uma nova thread no pode aceitar argumentos. Para resolver este problema, voc tem duas escolhas. Voc pode usar variveis globais, mas esta no uma soluo elegante. Em vez disto, crie propriedades ou campos na classe cujo mtodo voc estiver chamando e atribua valores a estas propriedades aps criar o objeto. Obviamente isto no funcionaria no exemplo anterior, porque a chamada era simplesmente um sub no mesmo programa. O procedimento ou mtodo que voc roda em uma nova thread no pode retornar um valor. Para solucionar este problema, voc pode usar variveis globais, mas novamente esta no uma soluo elegante. O principal problema que sua aplicao ter que ficar checando a thread para saber quando ela terminou antes de poder usar com segurana a varivel global. Ao invs disto, voc deveria considerar a gerao de um evento com o valor de retorno como um parmetro do evento.

A sincronizao tambm um problema com aplicaes multi-encadeadas. Se voc estiver realizando uma srie de clculos complexos em uma thread, outras partes da sua aplicao precisam esperar at que a thread termine antes que possam usar seus resultados. Voc pode monitorar threads para ver quando elas terminam ou voc pode ter mtodos nas threads que disparam eventos para notific-lo quando as threads terminam. VB .NET fornece a propriedade IsAlive para cada thread, desta forma voc pode checar e ver quando a thread est rodando. H muito mais sobre multithreading, e ser coberto em detalhe no captulo 11, "Multithreading no VB .NET."

Garbage Collector (Coletor de Lixo) No VB6, se voc atribusse Nothing a um objeto, ele era destrudo imediatamente. Isto no mais verdade no VB .NET. Ao invs disto, quando voc atribui Nothing a um objeto ou todas as referncias a ele terminam, ele marcado para a garbage collection. Ele ainda est na memria, consumindo recursos. O garbage collector roda em uma thread separada e procura de tempos em tempos por objetos para serem destrudos. O garbage collector trabalha apenas quando voc comea a ficar sem recursos e se faz necessrio liberar recursos destruindo objetos. No entanto, se o sistema estiver muito carregado, o tempo de demora para que o garbage collector entre em ao e destrua os objetos pode levar muitos segundos - uma eternidade em termos de CPU. Pelo fato de os objetos no serem destrudos quando voc lhes atribui Nothing, a Microsoft chama isto de "finalizao no determinstica", porque o desenvolvedor no mais est no verdadeiro controle de quando o objeto ser destrudo. O mtodo Sub Finalize chamado quando o objeto destrudo pelo garbage collector. importante entender que mesmo que um objeto tenha sido marcado pelo garbage collector os recursos que o objeto tenha aberto permanecem abertos, incluindo quaisquer dados ou arquivos que ele possa ter obtido. Por que o objeto ainda est na memria, mantendo referncias abertas, cursos abertos, voc poderia querer chamar explicitamente o garbage collector chamando o mtodo Collect da classe GC no namespace System. Uma simples chamada GC.Collect fora o garbage collector a entrar em ao e limpar quaisquer objetos que tenham sido marcados para coleta. Quando um objeto destrudo, Sub Finalize chamado automaticamente. Contudo, uma conveno usada pelos desenvolvedores .NET ter um Sub Dispose nas classes. O Sub Dispose chamado especificamente, e libera todos os recursos. Uma vez que o cdigo no Sub Dispose fecha todos os recursos abertos, ele age de modo parecido com a finalizao determinstica do VB6. Seguindo esta conveno, o seu Sub Dispose ir fechar todos os recursos abertos, tais como arquivos, conexes a bancos de dados, e outros objetos. Portanto, voc no tem que chamar diretamente o garbage collector, pois todos os recursos do objeto j foram liberados. Para ver a coleta de lixo em ao, crie uma nova aplicao Windows e nomeie-a GCTest. No formulrio, adicione dois botes. Adicione um componente ao projeto e nomeie-o Garbage. Dentro do componente Garbage, adicione o cdigo seguinte:

Protected Overrides Sub Finalize() Beep() End Sub Isto apenas adiciona um som de bip quando o objeto removido da memria pelo garbage collector. De volta ao formulrio, adicione o seguinte cdigo: Dim oGarbage As New Garbage() Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click oGarbage = Nothing End Sub Private Sub Button2_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Button2.Click GC.Collect() End Sub Agora, rode o projeto. Quando voc clica no Button1, voc atribui Nothing ao objeto. Contudo, voc no ouve o bip, porque o objeto no foi realmente removido da memria. Agora, clique no Button2, e voc ouvir um bip. Voc forou o garbage collector a entrar em ao e remover o objeto, o que faz com que o cdigo em Sub Finalize seja executado. Mudanas no IDE H inmeras mudanas no IDE. Muitas das quais foram mostradas no captulo 2: a falta dos controles Line e Shape, o novo criador de menus, a nova forma de atribuir a ordem de tabulao e a janela de help dinmico. Uma rea interessante so as mudanas disponveis graas biblioteca GDI+. Como mencionado anteriormente, os controles Line e Shape se foram. Voc pode substitu-los com labels de altura 1 e bordas visveis. Ou, voc pode usar o namespace System.Drawing. Por exemplo, o System .Drawing tem uma classe Graphics que contm mtodos como DrawCurve, DrawEllipse, DrawLine e DrawRectangle. Voc realmente precisa de algum cdigo para desenhar uma linha. Voc precisa colocar o cdigo no sub OnPaint para ter o cdigo chamado automaticamente. Apenas crie um novo formulrio e adicione o cdigo seguinte, mas no esquea de adicionar Imports System.Drawing no topo do formulrio.

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) Dim LineMaker As Graphics LineMaker = e.Graphics Dim RedPen As New Pen(Color.Red, 3) Dim Point1 As New Point(30, 30) Dim Point2 As New Point(Me.Size.Width - 30, 30) LineMaker.DrawLine(RedPen, Point1, Point2) End Sub Voc pode ver o resultado deste cdigo na Figura 3.1. Figura 3.1. Um formulrio com uma linha desenhada graas GDI+.

Apenas desenhar linhas com a GDI+ no to excitante. Com o VB .NET, voc pode realmente criar formulrios que no so retangulares. Para criar um formulrio circular, crie um formulrio e adicione um boto a ele. Digite Imports System.Drawing.Drawing2D no topo e adicione o seguinte cdigo ao formulrio: Private Sub Button1_Click_1(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim graPath As GraphicsPath = New GraphicsPath() graPath.AddEllipse(New Rectangle(0, 0, 200, 200)) Me.Region = New [Region](graPath) End Sub Rode o projeto e clique no boto. O form se torna um crculo, conforme mostrado na Figura 3.2. Figura 3.2. Um formulrio circular graas GDI+.

Sumrio H vrias mudanas na linguagem VB na transio para o VB .NET. importante entend-las medida que voc avana. Algumas mudanas so de menor importncia, tais como a exigncia de usar parnteses e a ausncia de propriedades default. Mudanas mais significativas na lista so recursos como o tratamento de erros Try ... Catch ... Finally. Finalmente, h algumas mudanas crticas. Namespaces so as mudanas mais dramticas que iro afetar o desenvolvedor VB .NET. Herana e threading livre tambm iro ser de grande importncia no modo como as aplicaes vo ser escritas. Agora que voc viu muistas das mudanas significativas na prpria linguagem, cada novo captulo cobrir um tpico em particular, mostrando tanto novas funcionalidades (como Windows Services e Web Services ) ou mudanas no modo como as coisas so feitas (tais como criao de classes e assemblies).

Captulo 4. Construindo Classes e Assemblies com o VB .NET


NESTE CAPTULO Criando Sua Primeira Biblioteca de Classes O Cdigo "Final" Compilando o Assembly Trabalhando Com Assemblies e o GAC

Durante os ltimos trs anos, muitos desenvolvedores em VB tm passado boa parte do seu tempo criando componentes COM. Estes componentes so usados em camadas mdias em sistemas multicamadas. Os benefcios da criao de aplicaes multicamadas so bem conhecidos e incluem:

Reutilizao de Cdigo Eliminao de muitas das dores de cabea de distribuio Encapsulamento da lgica de negcio para controlar processos de negcios e acesso ao banco de dados

Por isto no surpresa que o VB .NET lhe permita criar componentes, mas eles no mais so componentes COM. Componentes COM tm certos elementos tais como IDs de classes (CLSIDS), type libraries e IDs de interfaces (IIDs). Cada classe em um componente COM tem que suportar as interfaces IUnknown e IDispatch. O VB .NET trata uma ou mais classes compiladas dentro de um arquivo como uma biblioteca de classes e no como um componente COM. Bibliotecas de classes so compiladas dentro de um assembly, que frequentemente tem a extenso .dll. Voc pode usar classes de uma biblioteca de classes quase do mesmo modo como usa classes de um componente COM. Voc pode instanciar os objetos na aplicao cliente e ento chamar propriedades, mtodos e responder a eventos. Contudo, assemblies no so componentes COM; eles so assemblies .NET. Criando Sua Primeira Biblioteca de Classes Para ver como criar a sua primeira biblioteca de classes, inicie o Visual Studio .NET e, da pgina de incio, clique em Create new Project. Da caixa de dilogo New Project, escolha Visual Basic Projects na listbox Project Types e, ento, escolha Class Library na listbox Templates. Nomeie o projeto Healthcare e clique no boto OK. Neste ponto, voc tem uma nova classe criada para voc. A primeira coisa que voc pode notar que a classe no possui um designer, que o "formulrio" sobre o qual voc pode dispor controles. Esta falta de um designer torna a classe diferente de muitos outros tipos de arquivos VB .NET, tais como formulrios, formulrios Web e mesmo Web Services. Voc inicia com uma classe vazia. Voc nem mesmo tem um bloco de cdigo gerado pelo Visual Studio .NET como voc tem em muitos outros tipos de arquivos. Neste momento, voc tem uma classe chamada Class1. Aqui onde as coisas comeam a divergir do VB6. No VB6, voc tinha uma classe por mdulo de classe e elas eram compiladas em um nico componente. Os mdulos de classe do VB6 tinham uma extenso .CLS. No VB .NET, o seu mdulo tem

uma extenso VB e um nico arquivo .VB de cdigo fonte pode conter mais de uma classe. Voc pode criar uma nova classe a qualquer momento usando um bloco Class ... End Class. Finalmente, um ou mais arquivos de cdigo podem ser compilados em um assembly. Na janela de cdigo, mude a linha de definio da classe para nome-la Paciente. Em outras palavras, mude esta linha: Public Class Class1 para esta: Public Class Paciente Agora voc mudou o nome da classe, mas se voc olhar na janela do Soluction Explorer ou se apenas olhar na tab da janela de cdigo atual, voc v que o nome do arquivo continua sendo Class1.vb. Clique com o boto direito sobre o cone Class1.vb no Soluction Explorer e escolha Rename. Nomeie o arquivo Healthcare.vb. Voc pode ver a tab na principal janela de cdigo mudar para refletir o novo nome de arquivo. O que voc fez foi mudar o nome do arquivo que contm uma ou mais classes. Adicionando uma Classe "Incrementada" Voc j tem a sua primeira classe, que foi criada para voc quando voc criou a biblioteca de classes. Esta classe agora chamada Paciente, mas ela no tem um construtor (Public Sub New) como muitos novos arquivos no VB .NET tm. Voc pode adicionar o seu prprio construtor se voc quiser que sua classe tenha um. Esta classe no tem um construtor pr-criado para voc e nem tem um designer. Mas possvel criar uma classe que vem com um designer e um construtor j criados. No Soluction Explorer, clique com o boto direito no nome do projeto, escolha Add e ento escolha Add Component. Da caixa de dilogo que se abre, escolha Component Class e clique em Open. Isto adiciona um novo arquivo ao projeto, que tem uma classe nele. Esta classe, contudo, inclui um designer, conforme mostrado na Figura 4.1. Figura 4.1. Uma nova classe criada com um designer e um construtor j criado.

Como a nova classe inclui um designer, voc pode realizar aes tais como arrastar conexes a bancos de dados para facilitar a criao de componentes de acesso a dados. Dando um clique duplo no designer abre a janela de cdigo. Voc pode ver que h mais cdigo nesta classe que na classe que foi criada com o projeto da biblioteca de classes. Se voc examinar o cdigo, voc notar a seguinte linha: Inherits System.ComponentModel.Component Esta linha faz a classe herdar da classe base Component no System.ComponentModel. Se voc adicionasse esta linha sua classe Healthcare, voc teria acesso a um designer tambm l. Por enquanto, retorne classe genrica Healthcare que voc criou antes. Criando Propriedades Voc pode iniciar agora a criao de propriedades para a sua classe, mas saiba que a sintaxe para a criao de propriedades mudou. Adicione uma propriedade chamada FirstName criando primeiro uma varivel privada. Dentro da classe adicione o seguinte cdigo: Dim msFirstName as String

Agora, adicione o seguinte cdigo. Repare que to logo voc digita a primeira linha, muito do restante do cdigo ser completado para voc pelo IDE. Voc ainda ter que adicionar o Return e o assinalamento. Public Property FirstName() As String Get Return msFirstName End Get Set(ByVal Value As String) msFirstName = Value End Set End Property Repare na nova sintaxe para criar propriedades. Voc no mais criar procedimentos Public Property Get/Public Property Let. Agora, voc cria um bloco Public Property e adiciona uma seo Get e Set a ele. No h mais Let, o que torna a vida mais fcil. Observe tambm que voc no tem que adicionar um argumento definio da propriedade como voc tem de fazer no procedimento Public Property Let do VB6. Isto significa que voc no mais tem que criar especificamente um argumento para aceitar o valor recebido; se o usurio passar um valor, ele posto na varivel Value automaticamente. Criando um Cliente de Teste Agora hora de testar esta classe. verdade que ela s tem uma propriedade, mas voc precisa ver como chamar esta classe numa aplicao cliente. Do menu File, escolha New e ento Project. Desta vez adicione uma aplicao Windows. Nomeie-a HealthcareClient, mas antes de clicar em OK, certifiquese de que voc selecionou o boto de opo Add to Soluction. O padro fechar a solution atual e criar uma nova. Escolhendo adicionar este novo projeto solution atual, voc tem o equivalente a um grupo do VB6. Aps voc clicar no boto OK, o novo projeto carregado no Soluction Explorer, conforme mostrado na Figura 4.2. Como no VB6, o nome do projeto que aparece em negrito no Soluctoin Explorer o projeto que ir iniciar quando voc iniciar a aplicao. Simplesmente clique com o boto direito sobre o projeto HealthcareClient e escolha Set as StartUp Project do menu pop-up. Figura 4.2. O Solution Explorer exibindo dois projetos carregados ao mesmo tempo.

No Soluction Explorer, clique com o boto direito no n References para o projeto HealthcareClient e escolha Add Reference. A caixa de dilogo Add Reference aparecer. Clique na tab Projects e voc ir ver o seu projeto Healthcare. Ele j est destacado, mas o boto OK est desabilitado, como voc pode ver na figura 4.3. Clique o boto Select para mover o Healthcare para dentro da caixa Selected Components e ento clique no boto OK. Figura 4.3. A caixa de dilogo Add Reference.

Agora, no formulrio de HealthcareClient, adicione um boto. D um clique duplo para abrir a janela de cdigo e entre com o cdigo a seguir para o procedimento de evento Button1_Click: Protected Sub button1_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles button1.Click Dim myPaciente As New Healthcare.Paciente() myPaciente.FirstName = "Bob" MsgBox(myPaciente.FirstName) End Sub Este cdigo deve parecer muito familiar para os desenvolvedores de VB6. Aps adicionar uma referncia, voc instancia o objeto atribuindo New Healthcare.cPaciente varivel myPaciente. Se voc est acostumado com o VB6, voc pode ser tentado a experimentar um atalho e digitar esta linha de cdigo: Dim myPaciente As New Paciente() Se voc digitar esta linha, contudo, voc receber um erro que diz Userdefined type not defined: Paciente. Isto mostra que voc necessita ter o nome do componente completamente qualificado. A palavra Healthcare neste caso no o nome do assembly, ela o namespace.

Para contornar este problema, voc pode importar o namespace contendo a classe Paciente. Como foi visto no captulo 3, "Principais Mudanas noVB .NEt", todos os projetos tm um namespace padro, e o nome do namespace padro o mesmo do projeto. Portanto, se voc for ao topo do mdulo de cdigo e adicionar um comando Imports, a referncia abreviada para a classe Paciente ir funcionar. O seu comando Imports precisa estar no topo do mdulo e ele ir se parecer com isto: Imports Healthcare Voc pode ter notado, no cdigo, que voc usou a palavra New para criar um objeto. No VB6, voc poderia usar a palavra New de duas formas. Aqui est a primeira: Dim myPaciente as New Healthcare.Paciente No VB6, este cdigo funciona, mas no a melhor forma de criar objetos. Quando voc usa este mtodo, o objeto no realmente criado at que voc chame a primeira propriedade ou mtodo. Na verdade, cada chamada a propriedade ou mtodo requer uma checagem para ver se o objeto j foi instanciado. Para evitar este sobre-trabalho, voc deve usar este mtodo no VB6: Dim myPaciente as Healthcare.Paciente Set myPaciente = New Healthcare.Paciente No VB .NET, contudo, os dois mtodos seguintes so considerados equivalentes: Dim myPaciente As New Paciente() Dim myPaciente As Paciente = New Paciente() Em ambas as linhas, o objeto criado na memria imediatamente. Isto significa que com o VB .NET, voc ter o objeto na memria, e voc evita o sobre-trabalho de ter que checar se o objeto j est na memria. Com o VB6, este sobre-trabalho poderia ocorrer a cada chamada ao objeto se o instanciasse usando a sintaxe abreviada. Com o VB .NET, voc evita completamente isto porque o VB .NET sabe que o objeto instanciado imediatamente e no precisa checar se ele j existe. Propriedades Apenas de Leitura e Apenas de Gravao Voltando biblioteca de classes que voc criou, voc pode notar que a propriedade FirstName, que voc criou, tem tanto uma seo Get como Set no bloco da propriedade. No VB6, para tornar uma propriedade apenas leitura,

voc simplesmente no criava o procedimento Public Property Let. Para criar uma propriedade apenas de gravao, voc no criava o procedimento Public Property Get. Voc pode querer criar uma propriedade apenas de leitura no VB .NET simplesmente deixando de fora o bloco Set ... End Set. Contudo, o VB .NET trata propriedades apenas de leitura e apenas de gravao de modo diferente: Voc precisa adicionar uma palavra chave na declarao da propriedade. Para criar uma propriedade apenas de leitura chamada Idade (voc pode assumir que ela calculada da data de nascimento da pessoa), o seu cdigo deve se parecer com isto: Public ReadOnly Property Idade() As Single Get 'obtm a data de nascimento 'calcula idade com a data de nascimento 'retorna idade End Get End Property A criao de uma propriedade apenas de gravao igualmente simples. Apenas ponha a palavra WriteOnly na declarao da propriedade e tenha apenas um bloco Set ... End Set no procedimento da propriedade. Propriedades Parametrizadas possvel criar propriedades parametrizadas. Usando o exemplo de um paciente, considere que um paciente pode ter vrios mdicos a atend-lo ao mesmo tempo. Portanto, embora a sua biblioteca de classes Healthcare tenha uma classe Mdico, o paciente poder ter uma coleo de objetos Mdico. Voc poderia acessar esta coleo atravs de uma propriedade parametrizada e percorrer a coleo. A criao de uma propriedade parametrizada simples: voc apenas adiciona um parmetro ao procedimento de propriedade. Se voc tem uma propriedade Mdicos que percorre uma coleo de objetos Mdico, o cdigo se pareceria com isto: Dim ListaDeMdicos As New Collection() Public ReadOnly Property Mdicos(ByVal iIndex As Integer) _ As Mdico Get Return CType(ListaDeMdicos(iIndex), Mdico) End Get End Property

Voc pode notar algo de incomum neste cdigo.A funcionalidade bsica est ali, voc passa um ndice e obtm um objeto particular da coleo. Note, porm, que, embora a ListaDeMdicos esteja definida como um tipo de dados Collection, o Option Strict ir impedir a converso automtica de uma tipo de dados Collection para o tipo Mdico. Portanto, se Option Strict estiver ligado, voc precisa chamar a funo CType para passar o objeto que voc quer converter e o tipo de classe na qual voc quer converter o objeto. Apenas ento o retorno ser bem sucedido. Propriedades Default No comeo do captulo 3, voc aprendeu que as propriedades default sem parmetros se foram. Contudo, se uma propriedade tiver um ou mais parmetros, ela pode ser a propriedade default. Portanto, a propriedade Mdicos em Paciente poderia ser uma propriedade default. Para tornar uma propriedade na propriedade defalt to simples quanto adicionar a palavra Default na frente da declarao da propriedade. Para tornar a propriedade Mdicos a default, a sua declarao ficaria assim: Default Public ReadOnly Property _ Mdicos(ByVal iIndex As Integer) As Mdico Agora, no seu programa cliente, voc poderia chamar a propriedade default do objeto Paciente. As duas ltimas linhas deste cdigo so equivalentes: Imports Healthcare ... Dim Paciente As New Paciente() Dim Med As New Mdico() Med = Paciente.Mdicos(1) Med = Paciente(1) 'equivalente linha acima Construtores nas Suas Classes A classe que voc criou at agora, Paciente, no veio com um construtor; em outras palavras, no havia um Sub New disponvel quando voc acabou de criar a classe. Construtores podem ser bastante teis, porque eles lhe permitem instanciar um objeto j com alguns valores nele. Por exemplo, assuma que voc gostaria de poder passar uma identificao de paciente ao instanciar um objeto Paciente. Isto significa que voc poderia escrever cdigo que criaria o objeto e, em tempo de criao, ler um banco de dado e preencher as propriedades de um Paciente em particular. Sua definio para o Sub New ficaria assim:

Public Sub New(Optional ByVal iPacienteID As Integer = 0) Seu cdigo cliente poderia agora instanciar o objeto e passar um valor na instanciao. Qualquer das linhas seguintes lhe permitiriam criar uma instncia do objeto com um valor j atribudo: Dim Paciente As New Paciente(1) Dim Paciente As Paciente = New Paciente(1) 'equivalente linha de cima Classes Sem Construtores Obviamente, suas classes no tm que ter uma construtor. Se voc somente usa o bloco Class ... End Class para criar uma classe, voc no receber um Sub New. Mesmo que uma classe no tenha construtores ou implemente System.ComponentModel.Component, a classe pode ainda ter propriedades e mtodos, e pode ser criada como qualquer outra classe. A classe Mdicos que foi mencionada em exemplos anteriores poderia ser assim: Public Class Mdico Dim miMedID As Integer Public Property MdicoID() As Integer Get Return miMedID End Get Set miMedID = Value End Set End Property Public ReadOnly Property Idade() As Single Get 'obtm a data de nascimento 'calcula idade com a data de nascimento 'retorna idade End Get End Property End Class Adicionando Mtodos s Classes Para adicionar um mtodo a uma classe procede-se do mesmo modo como no VB6. Se voc quiser criar um mtodo Internar na classe Paciente, o seu cdigo poderia ser assim:

Public Function Internar() As Boolean 'inclui o Paciente no banco de dados Return True End Function A chamada a este mtodo do cliente igualmente simples: If Paciente.Internar Then... Antes que voc comece a pensar que nada mudou nos mtodos, entenda que h vrias mudanas na definio de mtodos. Contudo, as mudanas so especficas da herana e elas sero cobertas no captulo 5, "Herana no VB .NET".. Adicionando Eventos Para adicionar um evento sua classe, use a palavra chave Event. Imagine que voc queira adicionar um evento classe que o notifique quando voc tiver resultados pendentes de exames laboratoriais. Voc poderia criar o evento usando um cdigo como este dentro da classe que necessita disparar o evento: Event LabResult(ByVal TipoLab As String) Isto apenas criar a definio do evento no seu cdigo. Para realmente causar o disparo do evento, voc tem que ter um comando RaiseEvent em alguma parte do seu cdigo. Por exemplo, se voc atribui a propriedade PacienteID, voc pode checar o banco de dados para verificar algum novo resultado de exame para aquele paciente. Se houver algum, voc pode disparar um evento. Seu cdigo seria parecido com isto: Dim miPacienteID As Integer Public Property PacienteID() As Integer Get Return miPacienteID End Get Set miPacienteID = Value 'verifica o banco de dados de exames para este paciente 'se houver resultados de novos exames RaiseEvent LabResult("CBC") End Set End Property Se isto fosse um procedimento real, voc no codificaria fixo o valor "CBC" no evento, mas o iria pegar do banco de dados.

Trantando o Evento Usando WithEvents Voc tem duas opes para tratar este evento no cliente. A primeira forma usar a palavra chave WithEvents. A segunda forma usar o comando AddHandler. Para usar a palavra chave WithEvents, voc precisa declarar o objeto e incluir a palavra WithEvents. Note que se voc estiver usando WithEvents, a declarao no pode ser local a um sub ou funo. Portanto, o cdigo a seguir deve estar fora de qualquer sub ou funo, e estar a nvel de mdulo no seu cliente: Dim WithEvents Paciente As New Paciente Esta linha assume que voc importou o namespace HealthCare. Esta linha fica a nvel de mdulo da sua classe, porque voc no pode usar WithEvents em uma declarao interna a um procedimento. Agora, para adicionar um procedimento de evento, clique na combo Class Name no topo da janela de cdigo e escolha Paciente. Na combo Method Name, escolha LabResult. Isto cria um procedimento de evento chamado Paciente_LabResult que se parece com isto: Public Sub Paciente_LabResult(ByVal TipoLab As System.String) _ Handles Paciente.LabResult ... End Sub Tratando o Evento com AddHandler A segunda forma de tratar eventos usar o comando AddHandler.Voc agora no tem que declarar um objeto usando WithEvents. Voc o define como fez antes. Voc precisa ter um sub ou funo que agir como um procedimento de evento. Em seguida, voc usa o comando AddHandler para ligar um evento em particular do objeto ao procedimento que voc criou para tratar o evento. Por exemplo, assuma que voc quer criar um tratamento de evento chamado LabHandler. Este procedimento seria definido como um sub padro. Ele teria que ter os mesmos argumentos definidos no evento LabResult da classe Paciente. No exemplo mostrado aqui, o evento LabResult passa um parmetro com o tipo de dados String. Portanto, o seu procedimento teria que aceitar uma string como um argumento.

Quando voc usa AddHandler, voc especifica o nome do evento na classe Paciente que voc quer que seja tratado (LabResult), mas voc precisa tambm referir o procedimento; neste caso, LabHandler. Contudo, voc no refere LabHandler diretamente; voc o refere por endereo usando o operador AddressOf. Seu cdigo para configurar o tratamento de evento com AddHandler ficaria assim: Protected Sub Button1_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim Paciente As New Paciente() AddHandler Paciente.LabResult, AddressOf Me.LabHandler ... End Sub Private Sub LabHandler(ByVal TipoLab As String) ... End Sub Note que no AddHandler, voc refere a varivel de objeto (Paciente) e o nome do evento (LabResult) usando a sintaxe Objeto.Evento. Por que voc poderia querer usar AddHandler ao invs de WithEvents? A vantagem de usar AddHandler que voc pode criar um procedimento que pode tratar mltiplos eventos, mesmo se os eventos forem disparados de diferentes componentes. Voc tambm pode tratar eventos de objetos que voc cria em tempo de execuo. Por exemplo, voc poderia obter uma coleo de objetos passados para voc, mas ainda ser capaz de tratar os seus eventos usando AddHandler. O Cdigo "Final" O cdigo seguinte nada faz e algumas mudanas anteriores foram desfeitas neste cdigo. Se voc ainda estiver tentando estud-lo e quiser ter certeza de que ele ir compilar, eis aqui como o seu cdigo dentro do projeto Healthcare dever ficar: Public Class Paciente Dim msFirstName As String Dim ListaDeMdicos As New Collection() Dim miPacienteID As Integer Public Property FirstName() As String Get Return msFirstName End Get

Set(ByVal Value As String) msFirstName = Value End Set End Property Default Public ReadOnly Property Mdicos _ (ByVal iIndex As Integer) As Mdico Get Return CType(ListaDeMdicos(iIndex), Mdico) End Get End Property Public Function Admit() As Boolean 'adiciona um Paciente ao banco de dados Return True End Function Event LabResult(ByVal TipoLab As String) Public Property PacienteID() As Integer Get Return miPacienteID End Get Set(ByVal Value As Integer) miPacienteID = Value 'verifica o banco de dados de exames para este Paciente 'se houver algum resultado de exame RaiseEvent LabResult("CBC") End Set End Property End Class Public Class Mdico Dim miMedID As Integer Public Property MdicoID() As Integer Get Return miMedID End Get Set(ByVal Value As Integer) miMedID = Value End Set End Property Public ReadOnly Property Idade() As Single Get 'pega data de nascimento 'calcula idade com a data de nascimento

'retorna a idade End Get End Property End Class Compilando o Assembly Agora que voc criou uma biblioteca de classe com duas classes (Paciente e Mdico), hora de compilar o seu assembly. No VB6, voc compilaria um componente COM, mas voc no mais est no VB6. Voc agora est escrevendo para a .NET Framework e isto significa que voc ir compilar um assembly. O assembly pode ter uma extenso .DLL, mas ele no uma DLL tradicional no sentido da API do Windows nem uma DLL de componente no sentido do VB6. Criar o asembly bem simples. A opo de criao no mais est no menu File, mas est agora em um menu separado intitulado Build. Se voc clicar no menu Build, voc ver vrias escolhas. Por qu, neste exemplo, voc tem uma solution com uma biblioteca de classe (Healthcare) e uma aplicao Windows (HealthcareClient), voc ver opes para compilar ou re-compilar a solution. Voc tambm tem uma opo para distribuir a aplicao. Na prxima seo do menu Build, voc tem a opo para compilar ou re-compilar um dos projetos da solution, dependendo de que projeto est destacado no Solution Explorer quando voc clica no menu. Finalmente, h a escolha para a compilao batch e uma para o Configuration Manager. No .NET, voc pode compilar seus assemblies tanto no modo Debug ou no modo Release, ou voc pode criar seus prprios modos customizados. O modo Debug compila no usa nenhuma otimizao do compilador e compila em informaes simblicas de depurao. O modo Release no compila qualquer informao simblica de depurao e aplica otimizaes do compilador. Naturalmente, voc usar o modo Debug enquanto estiver desenvolvendo e depurando sua aplicao. Aps voc ter usado o modo Debug durante o desenvolvimento e depurao da sua aplicao, voc muda para o modo Release e re-compila o seu assembly. Observe que voc pode modificar estes modos ou adicionar o seu prprio. Por exemplo, voc poderia adicionar informao de depurao em projetos compilados no modo Release, se voc optar por modificar o modo Release desta forma. Voc pode ver que a opo Debug selecionada por padro se voc olhar na barra de ferramentas. A combo de configurao de solutions permite que voc escolha Debug ou Release e entrar no Configurations Manager. Voc v isto na figura 4.4. Figura 4.4. A opo de configurao de solutions na barra de ferramentas.

Agora, apenas clique no projeto Healthcare uma vez na janela do Solution Explorer. Isto ir selecion-lo como o projeto a ser compilado se voc escolher no compilar a solution total. Agora, clique no menu Build e escolha Buid Healthcare. A janela de Output na base do IDE ir reportar quando a compilao terminar e mostrar quantos projetos compilaram, quantos falharam e quantos foram pulados. Neste caso, o projeto HealthcareClient no contado como pulado, desta forma voc dever ver que um projeto foi compilado, sem falhas e nenhum projeto foi saltado. O processo de compilao cria dois arquivos. A localizao default para o projeto Meus Documentos\Visual Studio Projects\Healthcare. Se voc olhar na pasta, voc ver uma pasta bin abaixo dela. Dentro da pasta bin h dois arquivos: healthcare.dll e healthcare.bdb. A DLL o assembly e o PDB tambm usado como um formato comum para arquivos usado pelo sistema operacional Palm. Isto significa que os arquivos .PDB esto associados com a aplicao desktop Palm. Reutililzando o Assembly em Outras Aplicaes Um das outras grandes diferenas entre isto e o VB6 que os assemblies do VB .NET no usam o registry. Na verdade o VB .NET no adiciona nenhuma informao sobre o assembly no Registry. Se voc pesquisar pelo Registry, voc no encontrar qualquer meno ao assembly Healthcare. Voc encontrar informao sobre o projeto e a solution, mas isto apenas para que o Visual Studio possa mostr-los na lista dos mais recentemente utilizados.

Dado que no h nada sobre o assembly no registry, como voc o reutiliza em outra aplicao? Se voc iniciar um novo projeto de aplicao Windows no VB .NET e clicar com o boto direito no n References na janela do Solution Explorer, a caixa de dilog Add Reference ir aparecer. Contudo, o componente Healthcare no estar listado. Isto no deve ser muito surpreendente; ele estava mostrado antes porque o projeto HealthcareClient era parte da mesma solution. Agora, contudo, voc iniciou um novo projeto que cria uma nova solution. Esta solution est em um diretrio diferente e, portanto, no tem qualquer conhecimento do componente Healthcare. Para que o novo projeto use o componente Healthcare, certifique-se de estar na tab .NET Framework da caixa de dilogo Add Reference e clique no boto Browse. Navegue at Meus Documentos\Visual Studio Projects\Healthcare\bin e escolha Healthcare.dll. O n References na janela do Solution Explorer agora mostra o componente Healthcare. Sua aplicao pode agora usar o componente Healthcare. Voc pode criar objetos digitando o seguinte cdigo: Dim Paciente As New Healthcare.Paciente() Voc pode sempre usar o comando Imports para importar o namespace Healthcare, assim voc poderia instanciar objetos com apenas este cdigo: Dim Paciente As New Paciente() Como o .NET localiza os Assemblies Pense de novo no COM: Quando um programa faz uma chamada a um componente, o Service Control Manager vai ao registry, pesquisa a informao do componente, localiza o objeto, cria-o e retorna aplicao chamadora um ponteiro para o objeto recm criado. O .NET no usa o registry, portanto, ele tem que usar um mecanismo diferente para localizar os assemblies que so referenciados em uma aplicao ( ou em outro assembly ). Os detalhes completos no so de necessidade fundamental para se entender como criar componentes, mas um conhecimento bsico do processo importante para solucionar problemas. Passo 1: Obtendo a Informao da Referncia Sua aplicao tenta chamar uma referncia assembly. A referncia contm a seguinte informao sobre o assembly:

Nome Verso Cultura

Chave pblica (para assemblies rigorosamente nomeados)

O runtime usa esta informao para tentar localizar o assembly usando os passos seguintes. Passo 2: Pesquisando no arquivo de configurao O arquivo de configurao um conceito poderoso. Voc pode criar um arquivo de configurao para tratar qualquer informao de referncia que pode mudar. Por exemplo, se voc pensar que voc ir necessitar de atualizar uma verso particular de um assembly usado pela sua aplicao, voc pode armazenar esta informao em um arquivo de configurao. Voc tambm pode forar uma aplicao a se ligar apenas a verses de componentes que estavam disponveis quando a aplicao foi criada. Isto chamado de Modo Seguro. O arquivo de configurao um arquivo XML. Passo 3: Usando CodeBases Se voc quiser impedir a pesquisa por um componente, voc pode especificar um tipo de valor chamado CodeBase no arquivo de configurao. Quando o runtime carrega o arquivo especificado no CodeBase, ele checa a informao de verso para certificar-se de que ela confere com a referncia usada na aplicao. Por default, se o assembly apontado pelo CodeBase tiver a mesma verso ou maior, a ligao ocorrer. Se no houver nenhum CodeBase, o processo de busca ser iniciado. A busca simplesmente feita pelo runtime usando o seguinte critrio. Primeiro, o runtime procura no GAC se o assembly for rigorosamente nomeado. Se o assembly for privado, a pesquisa feita somente no diretrio raiz da aplicao, referido como AppBase. O runtime v uma referncia na aplicao a um assembly tal como Healthcare e pesquisa pelo assembly primeiramente como Healthcare.DLL. Se o assembly no for encontrado no diretrio AppBase, a pesquisa continua e o runtime pesquisa baseando-se no caminho informado no arquivo de configurao. Este caminho especificado com a tag <AppDomain> , por exemplo, desta forma: <probing privatePath="MyAssemblies"/> O runtime automaticamente junta algumas outras informaes ao caminho da pesquisa. Por exemplo, se o assembly que voc est procurando for Healthcare, o runtime pesquisa em AppBase\Healthcare. Ele tambm examina o diretrio bin, portanto, ele pesquisa AppBase\bin. Por qu voc especificou

MyAssemblies na tag <AppDomain>, o runtime pesquisa AppBase\MyAssemblies . Finalmente, a pesquisa inclui outras informaes de localizao de lngua. Portanto, se voc estiver criando um aplicao para mltiplas lnguas ou para uma lngua especfica, o local adicionado. Se o local for de, o caminho da pesquisa incluir AppBase\Bin\de, AppBase\Healthcare\de e AppBase\MyAssemblies\de. Passo 4: O GAC Lembra-se que o Global Assembly Cache (GAC) um cache para assemblies usados por mltiplas aplicaes na mesma mquina? Mesmo se um assembly for encontrado por busca ou por uso de um CodeBase, o runtime procura por verses atualizadas no GAC, desde que voc no tenha desligado esta funcionalidade. Se uma verso mais recente existir no GAC, ela ser usada. Se nenhum assembly for encontrado usando um CodeBase ou a busca, o runtime pesquisa o GAC por um que confira. Se um assembly for encontrado, ele ser usado. Para adicionar assemblies, remover assemblies ou ver assemblies no GAC, use a aplicao de console gacutil.exe fornecida pelo Framework. O GAC tambm um diretrio, portanto, voc pode adicionar assemblies ao GAC meramente copiando-os para dentro do diretrio. Passo 5: O Administrador entre em cena possvel para o administrador criar um arquivo que especifica uma verso particular de um assembly a ser usado. Se uma aplicao est pesquisando pela verso 2.1.4.0 do Healthcare, o arquivo do Administrador pode apontar a aplicao para uma outra verso, forando uma atualizao ou regresso para uma verso mais antiga. Trabalhando Com Assemblies e o GAC Nota Voc precisa possuir privilgios de administrador no seu computador para completar os exemplos nesta seo. Apenas um administrador pode deletar arquivos do GAC. Frequentemente, quando voc criar um assembly, voc ir querer compartilhlo entre mltiplas aplicaes. Isto no um problema, porque mltiplas aplicaes podem apontar para a mesma DLL. Contudo, quando voc atribui uma referncia a uma DLL dentro de um projeto, ele grava o caminho da

DLL. E se o caminho mudar posteriormente? Ou se voc no souber o caminho final na mquina de produo? Conforme voc j leu, o Global Assembly Cache permite lhe colocar componente em um cache que pode ser acessado por qualquer aplicao. Portanto, voc poderia pegar a Healthcare.DLL e adicion-la ao GAC, permitindo que as aplicaes a acessem independentemente da localizao fsica da DLL. Atribuindo o Nome Rigoroso Par ver isto em ao, a primeira coisa que voc precisa atribuir um nome rigoroso ao componente. Um nome rigoroso uma forma de identificar claramente um componente. Isto inclui algumas informaes padro, tais como o nome do assembly, nmero de verso e informaes de cultura se fornecidas. Tambm inclui uma chave pblica e uma assinatura digital. Nomes rigorosos so uma forma de um cliente verificar se um componente no foi modificado desde que o componente foi referenciado pelo cliente quando da sua criao. Isto significa que o cliente pode certificar-se de que o assembly no foi modificado e de sua origem. O uso de um nome rigoroso segue este procedimento: 1. O assembly compilado com um nome rigoroso atribudo a ele. A assinatura digital criada com a chave privada do desenvolvedor e a assinatura armazenada num arquivo executvel portvel do assembly. Esta combinao de nome e chave garante unicidade da mesma forma que uma GUID (Identificao Global nica) no mundo do COM. 2. O cliente referencia o assembly. A criao desta referncia adiciona a chave pblica do assembly como parte da referncia. Tecnicamente, apenas uma parte da chave pblica do assembly adicionada referncia para economizar espao. 3. Em tempo de execuo, o cliente verifica o nome rigoroso usando a chave pblica para checar a assinatura digital. Atribuindo um nome rigoroso tambm garante que ningum mais pode criar uma nova verso do seu componente. Por qu o seu componente est assinado com a sua chave nica, ningum mais pode criar uma novo verso porque ele no possui a sua chave. Clientes podem certificar-se de que as novas verses vm apenas do autor original. Finalmente, nomes rigorosos so usados para verificar que um componente no foi modificado desde a sua criao, bastante parecido com a tecnologia Authenticode e controles ActiveX que so baixados e usados em um navegador.

Para atribuir um nome rigoroso ao seu assembly Healthcare, esteja certo de que o projeto Healthcare est fechado na janela do Solution Explorer. Clique em Project, Properties para abrir a janela de propriedades do Healthcare. Clique em Strong Name na janela de navegao do lado esquerdo. Voc tem duas formas de criar nomes rigorosos: voc pode usar um arquivo chave ou um container de chave. O mtodo do arquivo chave no to seguro como o mtodo do container de chave. Com o arquivo chave, voc inclui o arquivo no projeto, o que significa que ele pode ser compartilhado inadvertidamente. e voc advertido disto na caixa de dilogo. O container de chave realmente acessa a chave do runtime e portanto no tem que armazenar o arquivo chave no projeto. Por enquanto, voc far do modo mais simples e usar o arquivo chave. Clique em Generate Key sob a textbox Key File e KeyFile.snk aparece na textbox. Voc pode ver isto na Figura 4.5. Figura 4.5. A tabe Strong Name da caixa de dilogo Project Properties.

Aps clicar no boto OK, voc pode ver que o arquivo KeyFile.snk foi adicionado ao seu projeto se olhar no Solution Explorer. Os prximos passos iro parecer antigos a princpio, mas eu explicarei o que est acontecendo na medida que voc avanar. Entenda que voc est prestes a testar usando o componente de um caminho especificado e ento do GAC. Adicionando o Assembly ao GAC

Agora que voc atribuiu um nome rigoroso para o assembly, v em frente e compile o assembly novamente escolhendo Build Healthcare no menu Build. Relembre que, por default, voc cria o assembly na pasta Meus Documentos\Visual Studio Projects\Healthcare\bin (se voc estiver usando o diretrio default para criar a aplicao). Agora, porm, copie o Healthcare.dll que voc criou e mova-o para outro diretrio; para estes exemplos, eu assumirei que ele foi copiado para o raiz do drive C:, mas voc livre para copi-lo para onde quiser. O importante que fique num diretrio fcil de acessar. Agora, crie um novo projeto tipo Windows Application e chame-o NewHealthcareClient. D um duplo clique com o boto direito no n References da janela do Solution Explorer e escolha Add Reference. Clique na tab Projects e ento clique no boto Browse. Navegue at o raiz de C: , selecione o Healthcare.dll que voc copiou para l e, ento, clique OK. Voc adicionou uma referncia sua nova aplicao cliente ao assembly que voc criou anteriormente. Se voc expandir o n References no Solution Explorer, clicar em Healthcare e olhar na janela Properties, voc notar que a propriedade Path est configurada para C:\Healthcare.dll. Isto parece ser exatamente o que voc fez no exemplo anterior e, at aqui, de fato . A nica diferena, at aqui, que o assembly tem um nome rigoroso. Agora, no formulrio do seu projeto NewHealthcareClient, adicione um boto e o seguinte cdigo: Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim myPaciente As New Paciente() myPaciente.FirstName = "Sue" MsgBox(myPaciente.FirstName) End Sub Voc pode ir em frente e rodar esta aplicao para test-la, mas voc querer compil-la antes de continuar testando. Clique no menu Build e escolha Build. O seu arquivo NewHealthcareClient.exe estar em Meus Documentos\Visual Studio Projects\NewHealthcareClient\bin por padro. Se voc olhar neste diretrio, ver algo estranho: uma copia de Healthcare.dll! Ele foi automaticamente copiado para o diretrio no qual voc compilou a aplicao. No sempre que se deseja ter a dll no diretrio de execuo de cada aplicao. Primeiro, uma nica aplicao pode referenciar dzias de assemblies e voc no quer que todos eles dentro do diretrio da aplicao. Alm disto, voc pode querer o componente compartilhado por mltiplas

aplicaes, de modo que voc pode distribuir ajustes sem ter de se preocupar em copiar para mltiplos diretrios. No diretrio para o qual o EXE foi compilado, rode o NewHealthcareClient para ver se ele funciona. Ele deve funcionar sem problems. Agora, neste diretrio, delete o Healthcare.dll. Rode a aplicao novamente e clique no boto que voc adicionou. Agora, voc tem uma mensagem de erro esquisita como mostrado na Figura 4.6. Figura 4.6. Um erro indicando que um assembly no pode ser encontrado.

Se voc clicar no boto Details na caixa de mensagem do erro, voc ver a seguinte informao: "System.IO.FileNotFoundException: File or assembly name Healthcare, or one of its dependencies, was not found." , traduzindo: "System.IO.FileNotFoundException: Arquivo ou assembly de nome Healthcare ou uma das suas dependncias no foi localizado.". Voc pode agora estar coando sua cabea. Voc referenciou um assembly no diretrio raiz do drive C: e o assembly ainda existe. Contudo, sua aplicao aparentemente est procurando pelo arquivo apenas no diretrio local. Agora que a cpia local se foi, a aplicao fica confusa e indica que no consegue achar o assembly. Contudo, a aplicao tambm est pesquisando o GAC e, naturalmente, tambm no est localizando o assembly l. Voc precisa primeiro adicionar o assembly ao GAC para que a aplicao possa encherg-lo. Abra uma janela de console e navegue at o diretrio raiz do drive C:. Voc usar o gacutil para instalar o assembly no GAC. Contudo, voc precisa achar o gacutil e tambm digitar o caminho completo ou, neste caso, apenas copi-lo para um diretrio no caminho. Voc o encontrara provavelmente no diretrio C:\Arquivos de programas\Microsoft Visual Studio

.NET\FrameworkSDK\Bin . Aps ter localizado o gacutil, digite o seguinte comando: gacutil /i healthcare.dll Isto instala o assembly no GAC. Se voc no tivesse criado um nome rigoroso, voc receberia um mensagem de que no poderia instalar o assembly no GAC sem um nome rigoroso. Por voc ter criado um nome rigoroso para este assembly, ele instalado no GAC sem problemas. Agora, volte sua aplicao NewHealthcareClient e execute-a novamente. Desta vez, ela roda normalmente. Voc no fez uma mudana sequer aplicao cliente, mas quando ela procura pelo assembly, ela checa no apenas o diretrio local (que no mais contm uma cpia do assembly), mas tambm o GAC. Neste caso, naturalmente, ela encontra o assembly no GAC e o usa. Agora, remova o assembly do GAC. De volta janela de console, digite o seguinte comando: gacutil /u healthcare Note que voc no inclui a extenso .DLL no nome do assembly a remover. Aps ter removido o assembly, rode sua aplicao cliente novamente. Agora, duas coisas podem acontecer. Se voc no encerrou o cliente antes de desinstalar o assembly do GAC, o cliente continua a rodar sem problemas. Contudo, se voc o encerrou e agora o reinicia, ele no ir rodar. Isto por qu o cliente armazenou o assembly num cache de memria e no notou que ele havia sido removido do GAC, a menos que fosse encerrado e reiniciado. Verso e Assemblies .NET importante compreender agora o esquema de controle de verso dos assemblies .NET. A primeira regra a recordar simples: Apenas assemblies com nomes rigorosos tm a poltica de verso aplicada a eles. Portanto, se voc no estiver usando nomes rigorosos, isto no algo com que tenha que se preocupar. Assuma que voc vai usar nomes rigorosos. Talvez voc queira nomes rigorosos porque voc quer usar o GAC ou voc usar nomes rigorosos para uma pequena segurana adicional. De qualquer forma, importante entender como o controle de verso funciona com assemblies rigorosamente nomeados. Nmeros de Verso .NET O nmero de verso .NET consiste de quatro partes:

<nmero principal>.<nmero secundrio>.<compilao>.<reviso> Assuma que voc est trabalhando num projeto e que voc est compilando uma nova verso constantemente, digamos diariamente. A cada vez que voc compila a aplicao, voc ir incrementar a verso de compilao. Se voc tiver que fazer mltiplas compilaes no mesmo dia, voc pode incrementar o nmero de reviso. Independente de como voc usa as quatro partes da verso para acompanhar seus projetos, eles se tornam muito importantes quando voc comea a modific-los. Os dois primeiros nmeros so constantemente referenciados como o nmero de verso lgica de um assembly. Por exemplo, no mundo do COM, comum perguntar "Qual a verso de ADO que voc est usando?" com respostas comuns do tipo "2.5" ou "2.6". Embora os dois primeiros nmeros possam ser a verso lgica, contudo, as aplicaes clientes de assemblies rigorosamente nomeados consideram todos os nmeros. O runtime v assemblies de diferentes nmeros de verso como assemblies diferentes, e isto significa que o seu cliente, por default, os ver como diferentes tambm. tambm possvel para um administrador passar por cima deste comportamento default se necessrio. A atribuio do nmero de verso pode ser obtida de duas formas. Se voc examinar o arquivo AssembyInfo.vb que criado como parte do seu projeto, voc ver a seguinte linha: <Assembly: AssemblyVersion("1.0.*")> Isto lhe permitir atribuir a verso da aplicao. Ou, voc pode entrar com as seguintes linhas no mdulo de cdigo para as suas classes: Imports System.Reflection <Assembly: AssemblyVersionAttribute("2.3.4.6")> Estas linhas tm que ficar fora das classes que voc cria. Sumrio A criao de classes (ou objetos) uma das coisas mais comumente feitas por um desenvolvedor em VB. A criao de classe diferente no VB .NET, como voc pode ver neste captulo. Ela muda ainda mais quando voc comea a estudar a herana, que o que veremos no prximo captulo. As principais diferenas esto em como voc cria propriedades, como trata propriedades apenas leitura, apenas gravao e default, e como voc trata eventos. H tambm uma grande diferena no fato de que voc compila

assemblies ao invs de componentes COM. Finalmente, o modo como os arquivos so alocados tambm muito diferente. Finalmente, voc viu o compartilhamento de arquivos usando o GAC, e deu uma olhadela em como feito o controle de verso no .NET. Ao longo do restante do curso, voc ver bibliotecas de classes usadas ocasionalmente para encapsular alguma funcionalidade das suas aplicaes.

Captulo 5. Herana no VB .NET

NESTE CAPTULO O que Herana? Um Rpido Exemplo de Herana Membros Compartilhados Palavras Chave de Herana Polimorfismo Um Exemplo Visual de Herana Quando Usar e Quando No Usar Herana Chegou a herana! Chegou a herana! Voc est excitado? Talvez o mais requisitado recurso para o Visual Basic deste a verso 1.0 tem sido a herana. Finalmente, a herana chegou para satisfazer o desejo dos adeptos da programao orientada para objeto (POO). E ela venho bem. Muitos dos desenvolvedores podem desprezar este recurso, mas ele realmente muito poderoso e, com o poder vem a responsabilidade. Voc precisa ter plena conscincia de quando est fazendo uso da herana. Se voc nunca teve contato com o conceito de herana antes, voc pode estar se perguntando o que vem a ser herana ou, ao menos, o que ela pode fazer por voc. Este captulo procurar apresentar-lhe a herana no estilo .NET. O que Herana? Por anos, um dos recursos mais requisitados para o VB tem sido a herana. A Microsoft tem disponibilizado uma forma de herana no VB: a herana de interface, disponvel no VB desde que o VB iniciou o suporte criao de objetos no VB4. Os desenvolvedores, contudo, queriam ter o que conhecido como herana de implementao. Com o VB .NET, os desenvolvedores finalmente realizaram seu desejo, graas CLR (common language runtime).

Se voc no sabe o que so herana de interface e herana de implementao, veja a seguir. Herana um modo poderoso de reutilizar cdigo. Com a herana, voc escreve uma classe que contm algumas propriedades e mtodos. Esta classe torna-se a base para outras classes e conhecida como classe base. Classes que usam esta classe base so conhecidas como classes derivadas. Muito frequentemente, as classes derivadas estendem a funcionalidade da classe base. Imagine se voc quisesse criar uma aplicao para modelar parte de uma universidade. Como parte da aplicao, voc gostaria de criar dois objetos representando estudantes e professores. Estudantes e professores tm ambos um nmero de coisas em comum. Cada um tem um nome, um endereo, e assim por diante. Contudo, cada um tambm tem algumas diferenas. Estudantes tm especializao, enquanto professores tm cursos que ministram. Estudantes so cobrados, enquanto professores so pagos pelos seus trabalhos. Professores aprovam , enquanto estudantes so aprovados. Como voc pode ver, h similaridades e diferenas que devem ser levadas em conta quando estes objetos so criados. O objetivo de se usar herana escrever o cdigo para as similaridades apenas uma vez, e ento, reutiliz-lo em ambos os objetos: estudantes e professores. Herana de Interface no VB6 No VB6, voc tinha o que era chamado de herana de interface. Com a herana de interface, voc podia criar a interface de um componente reutilizvel. Suponhamos que voc queira criar um objeto Pessoa que tenha todas as propriedades compartilhadas por estudantes e professores. No caso do VB6, voc criaria um mdulo de classe que contivesse as definies daquelas propriedades, mas no o verdadeiro cdigo de implementao. Sua classe de interface poderia ser chamada IPessoa e parecer-se com isto: Public Property Get Nome() As String End Property Public Property Let Nome(psNome As String) End Property Public Property Get Endereco() As String End Property Public Property Let Endereco(psEndereco As String) End Property Public Function Matricular() As Boolean End Function

No VB6, voc podia criar uma interface usando um mdulo de classe. Tecnicamente, o VB no podia criar interfaces, mas voc podia usar o truque de criar um mdulo de classe apenas com definies de propriedades e mtodos, e ento implement-los em outra classe. Era apenas a criao de uma classe, mas sem nenhum cdigo de implementao dentro dela, assim ela era vista como uma interface. Por exemplo, o mtodo Matriculado no tem nenhum cdigo para tratar a matrcula. E, se voc est curioso para saber o porqu de haver um mtodo Matricular na interface IPessoa, por que professores tambm podem fazer cursos na universidade, o que alguns fazem, porque eles tm a vantagem de faz-lo de graa em muitas instituies. Para usar esta interface em outras classes do VB6, voc tinha de adicionar esta linha de cdigo na classe: Implements IPessoa Esta linha prepara a sua nova classe para herdar a interface da classe IPessoa. No VB6, voc podia realmente adicionar cdigo de implementao dentro da classe de interface, mas ele era ignorado quando voc implementava a interface na classe derivada. Imagine que voc tenha usado a palavra Implements em um classe chamada Estudante. Esta classe precisa agora implementar cada propriedade pblica, mtodo e evento encontrado em IPessoa. Portanto, o seu cdigo para Estudante incluiria algo parecido com o seguinte: Public Property Get IPessoa_Nome() As String IPessoa_Nome = msNome End Property Public Property Let IPessoa_Name(psNome As String) msName = psName End Property Public Property Get IPessoa_Endereco() As String IPessoa_Endereco = msEndereco End Property Public Property Let IPessoa_Endereco(psEndereco As String) msEndereco = psEndereco End Property Public Function IPessoa_Matricular() As Boolean 'Abre banco de dados

'Verifica se curso est completo 'Se no, adiciona estudante End Function O cdigo em Estudante contm a implementao da interface projetada em IPessoa. Examinando isto, voc provavelmente reconhecer que, na maior parte do tempo, a implementao para a classe Estudante ser a mesma para a classe Professor, ao menos para estes membros de classe. No seria mais fcil criar este cdigo de implementao na classe IPessoa e ento apenas ter este cdigo trazido para dentro da classe Estudante e Professor? Isto o que a herana de implementao faz. Herana de Implementao do VB .NET No VB .NET, voc no tem que criar uma interface em separado, embora voc at possa. Voc pode criar uma classe com cdigo de implementao e herd-la em outra classe. Isto significa que voc poderia adicionar o cdigo para as propriedades Nome e Endereco e para o mtodo Matricular em uma classe Pessoa. Ento, as classes Professor e Estudante poderiam ambas herdar da da classe base Pessoa. Estudante e Professor teriam ambos acesso ao cdigo interno Pessoa, ou poderiam substitu-lo pelo seu prprio cdigo se fosse preciso. Uma coisa a observar que no VB .NET, todas as classes so herdveis por default. Isto inclui formulrios, que so apenas mais um tipo de classe. Isto significa que voc pode criar um novo formulrio baseado em um j existente. Voc ver um exemplo de herana de formulrios mais adiante neste captulo. Embora o VB .NET possibilite a verdadeira herana de implementao, as interfaces no desapareceram. Na verdade, elas foram muito melhoradas no VB .NET; juntas, herana e interfaces lhe do a possibilidade de usar polimorfismo. Isto ser examinado no final deste captulo. Um Rpido Exemplo de Herana Crie uma nova aplicao Windows com o VB .NET e nomeie o projeto TesteDeHeranca. Adicione um boto ao formulrio e v para a janela de cdigo. No cdigo, adicione a seguinte classe. Certifique-se de que voc a adiciona fora da definio de classe para o formulrio! Public Class Pessoa Dim msNome, msEndereco As String

Property Nome() As String Get Nome = msNome End Get Set(ByVal Value As String) msNome = Value End Set End Property Property Endereco() As String Get Endereco = msEndereco End Get Set(ByVal Value As String) msEndereco = Value End Set End Property Public Function Matricular() As Boolean 'Verifica se h disponibilidade de aulas 'Se h, matricula pessoa Matricular = True End Function End Class Este cdigo cria a classe Pessoa com duas propriedades, Nome e Endereco, e o mtodo Matricular. At aqui, no h nada sobre esta classe que voc j no tenha visto antes. Agora, adicione uma segunda classe chamada Estudante. O seu cdigo deve ficar assim: Public Class Estudante Inherits Pessoa End Class Como voc pode ver, no h nenhum cdigo de implementao em Estudante. No h nenhuma propriedade nem mtodos. Tudo o que voc faz herdar da classe Pessoa. Agora, no procedimento de evento Button1_Click no formulrio, adicione o seguinte cdigo: Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click

Dim mEstudante As New Estudante() MsgBox(mEstudante.Matricular) End Sub O seu formulrio est criando uma instncia da classe Estudante. O nico cdigo na classe Estudante um comando Inherits que herda a classe Pessoa. Contudo, porque o VB .NET suporta herana de implementao, voc poder chamar o mtodo Matricular da classe Pessoa de dentro da classe Estudante, mesmo que a classe Estudante no defina explicitamente um mtodo Matricular. Porm, o mtodo Matricular est presente porque Estudante herda o mtodo de Pessoa. V em frente e rode o projeto para verificar que a caixa de mensagem retorna um valor True. possvel instanciar Pessoa diretamente? Neste caso, sim. Por exemplo, voc poderia modificar o procedimento de evento Button1_Click para ficar assim: Dim mEstudante As New Estudante() Dim mPessoa As New Pessoa() MsgBox(mEstudante.Matricular) MsgBox(mPessoa.Matricular) Ambas as chamadas ao mtodo Matricular funcionaro. Isto pode gerar uma srie de perguntas. Por exemplo, poderia Estudante modificar o mtodo Matricular de tal forma que ela no estaria usando o cdigo em Pessoa? A resposta sim. Pessoa poderia impedir que algum a instanciasse diretamente e, com isto, forar as pessoas a instanciar somente outras classes que herdam dela? Novamente, a resposta sim. Voc ver isto muito mais na medida que voc aprenda mais sobre o que pode ser feito com herana. Membros Compartilhados O VB .NET apresenta o conceito de membros compartilhados. Membros compartilhados uma forma de criar um membro (propriedade, procedimento ou campo) que compartilhado entre instncias de uma classe. Por exemplo, voc poderia criar uma propriedade para uma string de conexo a banco de dados. Ela seria a mesma para todas as instncias, de modo que voc poderia atribu-la em uma instncia e todas as demais instncias poderiam ver seu valor. Propriedades compartilhadas so muito usadas em herana, de forma que os objetos criados de classes derivadas possam compartilhar o mesmo membro por todas as instncias da classe. Contudo, membros compartilhados tambm podem ser usados independente mente de voc estar usando herana.

Para ver como propriedades compartilhadas funcionam, suponha que voc queira criar um mecanismo de log para gravar todo tipo de mensagem criada por uma aplicao (mensagens de informao, mensagens de erro e assim por diante). Voc quer gravar a mensagem em um arquivo de log e manter a contagem do total de mensagens independentemente do tipo de mensagem. Inicie o Visual Studio .NET e crie uma nova aplicao Windows e chame-a de TesteLogMensagem. Crie um novo projeto, mas mantenha-o na mesma solution. Este novo projeto deve ser uma biblioteca de classes e nomei-o LogDeMensagem. No cdigo para o LogDeMensagem, mude o nome da classe para Logger e entre com o cdigo a seguir: Imports System.IO Public Class Logger Public Function LogMsg(ByVal psMensagem As String) Static iCount As Integer iCount += 1 Dim file As TextWriter = New StreamWriter("c:\output.txt", True) file.WriteLine(psMensagem & ". " & iCount) file.Close() End Function End Class Nesta aplicao, voc est criando um mtodo chamado LogMsg, que aceita uma string do cliente. O mtodo tem um inteiro esttico chamado iCount. iCount conta o nmero de mensagens que o logger grava e adicionado a cada mensagem de modo a voc poder ver seu valor. Retorne aplicao TesteLogMensagem. D um clique duplo no n References da janela do Solution Explorer e escolha Add Reference. V tab Project e voc ver o projeto LodDeMensagem. Clique no boto Select e ento em OK. Isto adiciona uma referncia da aplicao Windows para a biblioteca de classes que voc criou. No formulrio, adicione dois botes. V janela de cdigo e entre com o seguinte cdigo (o cdigo gerado pelo Windows Form Designer ocultado): Imports LogDeMensagem Public Class Form1 Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code " Dim infoLogger As New LogDeMensagem.Logger() Dim errorLogger As New LogDeMensagem.Logger() Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click infoLogger.LogMsg("Mensagem de informao") End Sub Private Sub Button2_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Button2.Click errorLogger.LogMsg("Mensagem de erro") End Sub End Class Agora, rode a aplicao (certifique-se de que a aplicao selecionada para startup TesteLogMensagem, que seguramente ser se voc a criou primeiro). Clique em cada um dos botes. Se voc olhar no arquivo output.txt, ver algo assim: Mensagem de informao. 1 Mensagem de erro. 1 Voc notar que ambos os objetos criados (infoLogger e errorLoger) gravaram o arquivo de texto. Contudo, a contagem esttica do nmero de mensagens mostra ambas as mensagens com o nmero um. Por que? Voc criou dois objetos separados na memria. Eles so completamente separados, de modo que cada objeto tem seu prprio mtodo LogMsg, significando que cada um tem sua prpria cpia da varivel esttica iCount. Portanto, uma mensagem enviada usando infoLogger obtm o valor 1, mas uma mensagem enviada com errorLogger vai ao outro objeto na memria e tambm obtm 1. Para evitar esta situao, voc poderia compartilhar o mtodo LogMsg. Isto permite que voc compartilhe o mtodo entre mltiplas instncias do objeto, significando dizer que todos os objetos iro chamar a mesma cpia do mtodo.

Para compartilhar a funo LogMsg, retorne aplicao LogDeMensagem e , na classe Logger, modifique a definio da funo como a seguir: Public Shared Function LogMsg(ByVal psMensagem As String) Adicionando a palavra Shared, este mtodo ir agora ser compartilhado entre mltiplas instncias da classe. Para testar isto, delete o arquivo output.txt. Agora, rode a aplicao novamente e pressione cada um dos botes uma vez. Se voc examinar o arquivo output.txt novamente, voc ver que a seguinte sada foi produzida: Mensagem de informao. 1 Mensagem de erro. 2 Agora, voc pode ver que, independente de qual objeto voc usa, a contagem do nmero de mensagens incrementada corretamente. Isto significa que o mesmo mtodo LogMsg foi chamado de dois objetos diferentes, porque ele foi compartilhado entre os dois objetos. Palavras-Chave de Herana H vrias palavras chave associadas com herana. Lembre-se que por default, toda classe que voc criar herdvel. Voc herda de classes usando a palavra Inherits. A classe de onde voc herda chamada de classe base. A palavra Inherits somente pode ser usada em classes e interfaces. importante lembrar que uma classe derivada somente pode herdar de uma nica classe base, ou seja, no h herana mltipla. Forando ou Impedindo Herana O modificador NotInheritable usado para marcar uma classe como no herdvel, em outras palavras, ela no pode ser usada como classe base. Se voc fosse modificar a classe pessoa para no poder ser herdada, voc codificaria assim: Public NotInheritable Class Pessoa Se voc modificar a definio da classe Pessoa para ficar como na linha acima, Estudante no mais poder herdar da classe Pessoa. Em contraste com o modificador NotInheritable, h tambm o modificador MustInherit. MustInherit diz que uma classe no pode ser instanciada diretamente, mas que ela precisa ser herdada de uma classe derivada e a classe derivada pode, ento, ser instanciada.

Se voc mudar Pessoa para incluir a palavra MustInherit, ela ficar assim: Public MustInherit Class Pessoa Agora, voc no poder usar a seguinte linha de cdigo no cliente: Dim mPessoa As New Pessoa Contudo, voc ainda poder herdar Pessoa na sua classe Estudante e o seu cliente poder instanciar Estudante. Sobreposio de Propriedades e Mtodos A sobreposio da herana de uma propriedade ou mtodo a substituio, em uma classe derivada, da implementao da propriedade ou do mtodo existente na classe base por uma implementao criada na classe derivada. Quando o cliente chama o membro sobreposto, o cdigo executado aquele da classe derivada e no o da classe base. Quando voc herda uma classe base, o padro as propriedades e mtodos no poderem ser sobrepostos. Dado o seu exemplo anterior em TesteDeHeranca, voc no poderia ter criado uma funo chamada Matricular em Estudante porque j existia uma em Pessoa. H um modificador, NotOverridable, que diz que uma propriedade ou mtodo em particular no podem ser sobrepostos. A despeito de os mtodos normalmente j no poderem ser sobrepostos, voc pode usar esta palavra em um nico caso: se voc tiver um mtodo que j est sobrepondo um mtodo de classe base, voc pode marc-lo como NotOverridable. Se voc quiser que uma propriedade ou mtodo possa ser sobreposto, voc pode marc-lo com o modificador Overridable conforme mostrado aqui: Public Overridable Function Matricular() As Boolean Agora, sua classe Estudante pode criar seu prprio mtodo Matricular. Para fazer isto, o seu cliente ter que usar o modificador Overrides, de modo que ele ficar assim: Public Overrides Function Matricular() As Boolean O que acontece se o mtodo Matricular for marcado como Overridable na classe base, mas voc no o sobrepor na classe derivada? Neste caso, ele se comportar como qualquer outro mtodo na classe base e as chamadas na classe derivada iro chamar a implementao do mtodo na classe base.

No IDE do VB .NET, tambm possvel usar as combos no topo da janela de cdigo para sobrepor mtodos ou implementar interfaces. Como voc pode ver na figura 5.1, h duas classes no arquivo. A classe Estudante est herdando da classe Pessoa e, assim fazendo, capaz de sobrepor o mtodo Matricular. Se voc mudar a seleo da combo com o nome da classe para (Overrides), o mtodo Matricular aparece na combo com os nomes dos mtodos e pode ser usada para criar a verso de sobreposio do mtodo na classe Estudante. Figura 5.1. Mtodos que podem ser sobrepostos so exibidos na combo de mtodos quando voc herda no VB .NET.

H tambm um modificador MustOverride. Ele fora uma classe derivada a sobrepor a propriedade ou mtodo. O modificador MustOverride muda a estrutura da propriedade ou do mtodo. Isto porque, se a propriedade ou mtodo devem ser sobreposto, voc no adiciona nenhum cdigo de implementao nele. De fato, no h sequer um End Property ou End Sub ou End Function quando se usa o modificador MustOverride. Se uma classe tem ao menos um mtodo ou propriedade marcada como MustOverride, esta classe precisa ser marcada como MustInherit, porque o mtodo pode ser usado apenas se ele for sobreposto em uma outra classe. Portanto, a classe precisa ser herdada para ser usada. Por exemplo, aqui voc tem uma classe base Transporte, que tem o mtodo Mover marcado como MustOverride. Isto significa que Transporte precisa ser marcada com MustInherit. A classe Trem herda da classe Transporte e ento sobrepe o mtodo Mover. Public MustInherit Class Transporte MustOverride Function Mover() As Boolean End Class

Public Class Trem Inherits Transporte Public Overrides Function Mover() As Boolean 'o cdigo vai aqui End Function End Class <="" e=""> MyBase e MyClass Embora voc possa sobrepor uma propriedade ou mtodo de uma classe base na sua classe derivada, voc ainda pode acessar as propriedades e mtodos da classe base usando a palavra MyBase. Isto permite que voc chame os membros da classe base mesmo que voc os tenha sobreposto na classe derivada. Por exemplo, assuma que voc quer ter uma classe Transporte com uma funo sobreposta chamada Mover. A classe Trem herda da classe Transporte e implementa seu prprio mtodo Mover sobrepondo aquele da classe Transporte. Agora, de dentro de Trem, voc pode chamar o mtodo Mover em Trem ou a verso da classe Transporte. Para chamar a verso Mover da classe base Transporte, voc usa a sintaxe: MyBase.Mover. Veja abaixo como poderia ficar o cdigo de definio das classes: Public Class Transporte Overridable Function Mover() As Boolean MsgBox("Ol da classe Transporte!") End Function End Class Public Class Trem Inherits Transporte Public Overrides Function Mover() As Boolean MsgBox("Ol da classe Trem!") End Function Public Sub ChamarMetodos() Mover() MyBase.Mover() End Sub End Class Relacionado a MyBase, existe a palavra MyClass. Assuma que, na sua classe base, voc tem um mtodo A chamando um mtodo sobreposto B. Se voc

quiser garantir que est chamando o mtodo B que voc escreveu na classe base e no o mtodo derivado e sobreposto na classe derivada, chame o mtodo B com o modificador MyClass, assim: MyClass.B. Por exemplo, assuma que voc tem uma classe Transporte que tem dois mtodos: FazerReserva e ComprarBilhete. FazerReserva chama ComprarBilhete. FazerReserva e ComprarBilhete so ambas marcadas com Overridable. Sua classe Trem pode herdar de Transporte e criar um mtodo ComprarBilhete que sobrepe ComprarBilhete na classe base Transporte. Se voc no criar um FazerReserva em Trem, sua chamada a FazerReserva ir usar o cdigo da classe Transporte. Contudo, se o cdigo em Transporte.FazerReserva chama ComprarBilhete, por padro voc ir chamar o mtodo ComprarBilhete que voc criou em Trem. Eis o cdigo: Public Class Transporte Overridable Function FazerReserva() As Boolean ComprarBilhete() 'etc End Function Overridable Function ComprarBilhete() As Boolean MsgBox("Implementao Genrica na classe Transporte") End Function End Class Public Class Trem Inherits Transporte Public Overrides Function ComprarBilhete() As Boolean MsgBox("Implementao especfica de Trem") End Function End Class Agora, suponha que voc queira que FazerReserva chame o mtodo ComprarBilhete em Transporte, mesmo se Trem sobrepe ComprarBilhete. Para conseguir isto, basta mudar Transporte.FazerReserva para: Public Class Transporte Overridable Function FazerReserva() As Boolean MyClass.ComprarBilhete() 'etc End Function importante observar que, se a sua classe Trem sobrepuser FazerReserva, MyClass no funcionar. A razo que a implementao de FazerReserva na

classe base no ser chamada (a menos que Trem chame MyBase.FazerReserva por alguma razo). Compreendendo Acesso e Herana O acesso pode ser um pouco complicado quando se usa herana. H vrios modificadores usados para configurar o acesso. Eles so:
Public

Acessvel por todo o projeto e qualquer outro projeto que o referencie Friend Acessvel dentro do projeto, mas no fora dele Protected Acessvel dentro da classe na qual foi criado ou qualquer classe derivada da classe que contm o elemento protegido Protected Friend Acessvel dentro do mesmo projeto, em uma classe derivada ou ambos Private No acessvel fora do mdulo ou classe contendo o elemento

Para ver um exemplo disto, veja o cdigo a seguir. Voc tem trs classes em uma biblioteca de classes: Pessoa, Estudante e Foo. Pessoa um classe base contendo um Sub de cada tipo de acesso mencionado acima. Estudante uma classe derivada de Pessoa. Foo uma classe no mesmo projeto, mas no deriva de Pessoa. A seguir, voc tem uma aplicao cliente que instancia apenas a classe Estudante. Veja aqui o cdigo para a biblioteca de classe: Public Class Pessoa Public Overridable Sub PublicSub() End Sub Friend Overridable Sub FriendSub() End Sub Protected Overridable Sub ProtectedSub() End Sub Protected Friend Overridable Sub ProtectedFriendSub() End Sub Private Sub PrivateSub() End Sub End Class Public Class Estudante Inherits Pessoa

Public Overrides Sub PublicSub() End Sub Friend Overrides Sub FriendSub() End Sub Protected Overrides Sub ProtectedSub() End Sub Protected Friend Overrides Sub ProtectedFriendSub() End Sub End Class Public Class Foo Dim mEstudante As New Estudante() Public Sub Test() mEstudante.PublicSub() mEstudante.FriendSub() mEstudante.ProtectedFriendSub() End Sub End Class Note que Estudante, que derivada de Pessoa, pode ver tudo menos o mtodo PrivateSub de Pessoa, porque ele est marcado como Private e, portanto, apenas visvel para Pessoa. Foo, por outro lado, pode ver apenas PublicSub, FriendSub e ProtectedFriendSub. ProtectedSub pode ser visto apenas na classe na qual ele existe e em classe derivada desta classe base. Finalmente, veja o cdigo do cliente que instancia um objeto Estudante: Imports AccessibilityTest Public Class Form1 Inherits System.Windows.Forms.Form Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim mEstudante As Estudante mEstudante.PublicSub()

End Sub End Class Note que, no cliente, o nico mtodo que est acessvel o mtodo PublicSub. A figura 5.4 mostra cada Sub e at onde ele visvel em cada caso. Figura 5.4 A acessibilidade de vrios mtodos baseada nos modificadores de acesso.

Polimorfismo Polimorfismo a habilidade de mudar a implementao de uma classe base para diferentes objetos. Por exemplo, se voc tem uma bicicleta e um carro, ambos podem se mover, mas eles o fazem de modos bem diferentes. Eles usam diferentes mecanismos para se movimentarem e a distncia que cada um pode se mover em uma hora significativamente diferente. Mesmo assim, tanto a classe Carro como a classe Bicicleta podem herdar da classe base Transporte, que poderia tambm ser usada como a base para uma classe Aeroplano, um classe Trem, e etc. Polimorfismo com Herana Polimorfismo era possvel no VB6 usando interfaces, o que examinaremos em um momento. O VB .NET permite que voc realize polimorfismo usando herana. A diferena do que voc tem feito at aqui que voc pode realmente usar a classe base como um tipo de varivel e voc pode manipular qualquer classe derivada com aquela varivel Por exemplo, examine o cdigo a seguir. A classe Transporte contm somente um mtodo, Mover. Duas classes herdam de Transporte: Carro e Bicicleta. Ambas sobrepem o mtodo Mover. O cdigo fica assim: Public MustInherit Class Transporte Public MustOverride Function Mover() As Boolean End Class

Public Class Bicicleta Inherits Transporte Overrides Function Mover() As Boolean 'cdigo vai aqui Mover = True End Function End Class Public Class Carro Inherits Transporte Overrides Function Mover() As Boolean 'cdigo diferente vai aqui Mover = True End Function End Class At aqui, parece igual. Contudo, note agora o que o seu cliente pode fazer. Ele no pode criar diretamente uma instncia de Transporte, porque ela est marcada como MustInherit. Mas, voc pode declarar uma varivel do tipo Transporte. Voc pode estar certo de que qualquer objeto que herde de Transporte tem um mtodo Mover e voc no tem que se preocupar sobre que tipo de objeto . O cdigo do seu cliente poderia ser como este: Protected Sub Button1_Click _ (ByVal sender As Object, ByVal e As System.EventArgs) Dim mCarro As New Carro() Dim mBicicleta As New Bicicleta() EntreEmMovimento(mCarro) EntreEmMovimento(mBicicleta) End Sub Public Sub EntreEmMovimento(ByVal Veiculo As Transporte) If Veiculo.Mover() Then 'faa algo End If End Sub Voc notou que o Sub EntreEmMovimento aceita um argumento do tipo Transporte.Este Sub no se preocupa se voc lhe passa um objeto do tipo Carro ou Bicicleta. Por que o objeto sendo passado herda de Transporte, ele

garantidamente suporta o mtodo Mover, desta forma o cdigo iria rodar sem problemas. Polimorfismo com Interfaces Interfaces ainda existem no VB .NET. No VB6 e no COM, elas eram muito usadas quando voc necessitava de poder modificar o seu cdigo sem travar clientes existentes. Voc poderia modificar de fato a estrutura de suas classes, mas fornecendo uma interface que fosse igual velha verso do componente. Isto manteria as aplicaes clientes j existentes enquanto, ao mesmo tempo, voc poderia modificar as classes para melhorar a funcionalidade. No VB .NET, voc ainda pode usar as interfaces desta forma. Contudo, as interfaces so melhor usadas quando voc quer poder usar diferentes tipos de objetos de uma mesma forma, e os objetos no necessariamente compartilham o mesmo tipo bsico. Por exemplo, a interface IEnumerable usada para expor um enumerador para uma classe. Usando esta interface, voc pode mover-se atravs de uma classe usando For Each, mesmo que a classe no seja baseada em um objeto Collection. Voc ver um exemplo de polimorfismo com interfaces usando o mesmo exemplo do Carro e da Bicicleta. Primeiro, Transporte ser criada como uma interface e no uma classe base, o que faz mais sentido: o mtodo Mover, bem provvel que seja completamente diferente entre Carro e Bicicleta. Ento, voc ir implementar a interface Transporte. Finalmente, voc poder chamar os objetos do cliente. Interface Transporte Function Mover() As Boolean End Interface Public Class Bicicleta Implements Transporte Function Mover() As Boolean Implements Transporte.Mover 'cdigo vai aqui Mover = True End Function End Class Public Class Carro Implements Transporte Function Mover() As Boolean Implements Transporte.Mover ' cdigo diferente vai aqui

Mover = True End Function End Class Voc notar que, agora, quando implementa de uma interface, voc no tem que usar o modificador Overrides. Em adio, a definio do mtodo seguida de uma palavra Implements que especifica qual mtodo na interface o mtodo corrente est implementando. Isto lhe permite ter diferentes nomes para os mtodos na classe que estiver implementando a interface. O cdigo do cliente aqui ser o mesmo de quando voc usa polimorfismo de herana. Um Exemplo Visual de Herana Voc j leu um pouco sobre herana e, at aqui, tem sido sobre classes noGUI. Contudo, formulrios so classes, de forma que voc pode herdar de formulrios to fcil como pode de qualquer outra classe. Desenvolvedores em VB tm solicitado a herana de formulrios por muitos anos, e agora eles tm o que queriam, graas ao Framework .NET. fcil ver a herana em funcionamento em formulrios, e h uns poucos detalhes que devem ser observados. Voc ir iniciar com um exemplo simples e ento estend-lo medida que trabalhar nele. Criando o Projeto Base Inicie uma nova aplicao Windows no Visual Studio e nomeie-a baseVisual. Na realidade, voc poderia criar como um projeto de tipo diferente, mas iniciar com uma aplicao Windows quase sempre a forma mais fcil de comear. O seu projeto baseVisual iniciar com um formulrio na janela de designer. Para manter as coisas simples, adicione dois botes ao formulrio. Para simplicidade do demo, deixe as coisas com o nome que tiverem. Mude a propriedade Text do primeiro boto para "Run Code" (executar cdigo) e a propriedade Text do segundo boto para Close. Mova os botes para o lado direito do formulrio, como mostrado na figura 5.5. Figura 5.5. O seu formulrio base.

V para a janela de cdigo e, para o Button1, adicione o seguinte cdigo: Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click MsgBox("Este o cdigo no formulrio base") End Sub Agora, adicione o seguinte cdigo para o Button2: Private Sub Button2_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Button2.Click Me.Close() End Sub Neste ponto, todo o cdigo est dentro de uma classe pblica chamada Form1. Voc pode ser tentado a criar um novo formulrio no projeto que herda de Form1, mas a herana de formulrios funciona um pouco diferente. A primeira coisa que voc precisa fazer de diferente mudar o tipo de projeto. Clique com o boto direito no projeto baseVisual na janela do Solution Explorer e escolha Properties. Mude o Output Type para Class Library, como mostra a figura 5.6. Figura 5.6. Mudando o tipo de projeto de Aplicao Windows para Class Library.

O projeto baseVisual compilar agora como uma DLL, mas ele tem o seu formulrio dentro de si. Adicione um novo projeto soluo. Faa do projeto uma aplicao Windows e nomeie-o derivedVisual. O seu novo projeto derivedVisual automaticamente vir com um novo formulrio chamado Form1. Delete Form1 do derivedVisual. Voc pode estar tentado a herdar do formulrio base de baseVisual agora, mas h um passo adicional: Voc no pode derivar o formulrio de um outro projeto at que o assembly seja criado. Portanto, clique com o boto direito no baseVisual no Solution Explorer e escolha Build. Note que voc poderia derivar um novo formulrio no mesmo projeto, baseado em Form1, sem ter que primeiro criar o assembly. Aps criar o assembly, clique com o boto direito novamente no projeto derivedVisual no Solution Explorer. Escolha Add e note que uma das escolhas no menu Add Inherited Form (adicionar formulrio herdado). Escolha para adicionar um formulrio herdado e uma caixa de dilogo aparece. Ela ir perguntar-lhe pelo nome do formulrio que voc quer criar. O nome no importa, de modo que voc pode deix-lo como Form2.VB. Clique no boto Open. Agora, uma nova caixa de dilogo aparece, que voc pode ver na figura 5.7. Este o Inheritance Picker (selecionador de herana), e permitir que voc localize um assembly compilado do qual herdar. O Inheritance Picker j mostra Form1 em baseVisual, porque ele est na mesma solution. Clique no Form1 em baseVisual para habilitar o boto OK e clique em OK.

Figura 5.7. O Inheritance Picker mostrando os formulrios que voc pode herdar.

Aps clicar em OK, duas coisas acontecem. Primeiro, baseVisual aparece sob o n References para o projeto. Mais notavelmente, um novo formulrio criado no derivedVisual. Surpresa! Ele parece-se exatamente como o formulrio que voc criou no baseVisual exceto por aqueles smbolos divertidos nos dois botes. Aqueles smbolos engraados, mostrados na figura 5.8, indicam que os botes so herdados do formulrio base. Figura 5.8. O seu novo formulrio derivado.

Adicione um novo boto ao formulrio. Note que ele no tem o smbolo indicativo de herana, porque, naturalmente, ele no herdado. Configure derivedVisual como o projeto Startup e v s propriedades do projeto. Ajuste Form2 para ser o Startup Object e rode a aplicao. Clicando no boto que voc adicionou nada faz, porque voc no adicionou nenhum cdigo a ele. Contudo, clicando no boto Run Code faz com que seja exibida uma caixa de mensagem indicando que o cdigo da classe base foi herdado. O boto Close fecha o formulrio e encerra a aplicao. Aps a aplicao encerrar, d um duplo clique no boto Close. Nada acontece. Isto porque, por default, voc no pode mudar as propriedades de objetos em um formulrio herdado ou escrever cdigo para ele. Voc pode, naturalmente, escrever cdigo para o boto que voc adicionou, mas no para os botes fornecidos pelo formulrio de baseVisual. Contudo, voc pode mudar este comportamento. Volte para o formulrio Form1 no projeto baseVisual. Clique no boto Close e note que a propriedade Modifiers est configurada para Friend. Mude Modifiers para Protected. Protected, que voc viu antes, significa a classe pode ser modificada por classes herdeiras dela. Friend, o default, visvel a todas as classes no assembly em que ela reside. Contudo, o derivedVisual um projeto separado e, portanto, um assembly separado. Agora, tambm mude a propriedade Modifiers do boto Run Code para Protected. Recrie o assembly para o projeto baseVisual, porque voc fez algumas mudanas no formulrio. Retorne ao Form1 no derivedVisual. Voc pode ter que fechar o designer de formulrio e reabr-lo para que ele exiba as mudanas que voc fez na classe base. D um duplo clique no boto Run Code; desta vez, voc conduzido para a janela de cdigo. Adicione o seguinte cdigo: Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click MsgBox("Este o cdigo no formulrio derivado") End Sub Agora, rode o projeto novamente e clique no boto Run Code. Algo muito estranho ocorre: voc recebe duas caixas de mensagem. A primeira do formulrio base, enquanto a segunda do formulrio derivado. Se voc est curioso sobre o que est acontecendo, entenda que com formulrios, voc no est sobrepondo a funcionalidade da classe base; voc a est estendendo em um sentido pseudo-polimrfico. Por enquanto, siga esta regra simples: se voc quer sobrepor a funcionalidade de um controle no formulrio base, no adicione nenhuma implementao para ele no formulrio base.

Herana Entre Linguagens Voc tem ouvido um bocado sobre a herana entre linguagens na .NET, de modo que agora voc poder v-la por si mesmo. Adicione um novo projeto solution atual, mas, desta vez, crie uma aplicao Window C#. Noeie-a derivedVisualCs. O seu novo projeto, derivedVisualCs, ir se iniciar com formulrio, Form1.cs. Delete este formulrio do projeto. Agora, adicione um formulrio herdado a derivedVisualCs. No se preocupe com o nome, mas uma vez mais escolha o Form1 do projeto baseVisual no selecionador de herana. Adicione um novo boto ao formulrio. Voc pode dar um duplo clique ao boto e adicionar algum cdigo. Contudo, voc tambm ter que adicionar algum cdigo extra porque o formulrio no tem o cdigo necessrio para o C# abr-lo como o objeto de inicializao (startup). Portanto, certifique-se de adicionar todo este cdigo: [STAThread] static void Main() { Application.Run(new Form1()); } private void button3_Click(object sender, System.EventArgs e) { Windows.Forms.MessageBox("Ol do C#!"); } Torne o projeto derivedVisualCs o seu projeto de inicializao e ento rode a aplicao. Quando o formulrio carregar, clique no boto button3 que voc adicionou. Voc dever ver a caixa de mensagem que diz "Este o cdigo no formulrio base", que voc sabe foi escrito em VB .NET! Como voc pode ver na Figura 5.9, voc tem o cdigo VB .NET rodando em uma aplicao C#. Voc pode ver agora um pouco do poder da herana entre linguagens da plataforma .NET. Seus programadores de interface grfica poderiam criar formulrios bsicos em uma linguagem e os desenvolvedores em outras linguagens poderiam herdar destes formulrios e estend-los como bem quisessem. Figura 5.9. Cdigo herdado do VB .NET rodando em uma aplicao C#.

Quando Usar e Quando No Usar Herana Quando a herana foi apresentada pela primeira vez em algumas outras linguagens, ela causou problemas porque os usurios foram longe demais, criando profundas e complexas ramificaes de herana. O herana poderosa e til, mas no se deve abusar. Eu me lembro de ter trabalhado com um desenvolvedor que passou todo um dia projetando objetos e finalmente disse, "Eu no consigo entender onde usar polimorfismo.". Minha sugesto foi de que se ele no conseguia saber onde us-lo, era porque, provavelmente, ele no necessitava faz-lo. H, na verdade, trs formas de construir um modelo de objetos:

Encapsulamento - Se voc quer usar a funcionalidade de um objeto em outro, mas no tem neste outro nada que se assemelhe ao primeiro ou que sobrepe a sua funcionalidade, no herde; ao invs disto, encapsule uma instncia do objeto. Exemplo: voc tem uma aplicao calculadora, e voc quer exibir os nmeros em vermelho quando so negativos. Voc poderia definir um outro tipo de controle usando o controle TextBox ou Label que mostrariam o nmero em vermelho quando fosse negativo, ou voc poderia simplesmente tratar o evendo Change do TextBox e ajustar a cor ali. Implementao de Interface Se os objetos derivados no compartilham muito em termos de implementao, use uma interface de uma classe base comum. No faz sentido ter uma classe base para a qual todos os mtodos devem ser sobrepostos; uma interface ser, provavelmente, uma soluo melhor. Classes tambm podem implementar mltiplas interfaces, de modo que um carro pode implementar tanto iMovidoAGas e iDirigivel, enquanto um aeroplano pode implementar iMovidoAGas e iVoador. Um pssaro, por outro lado, implementaria iComeVermes e iVoador, mas no implementaria iMovidoAGas ou iDirigivel. Herana Use herana se voc quer utilizar a funcionalidade da classe base e estend-la enquanto buscar imitar a classe base. Se alguns dos mtodos na classe base no forem apropriados para a sua classe derivada, um bom indicador de que a herana no foi a escolha correta. Em alguns casos, meramente encapsulando uma outra instncia de classe e intermediando as chamadas para ela pode ser uma soluo mais simples.

Sumrio Como voc pode ver, iniciar a usar herana no difcil. Contudo, o desafio vem quando voc projeta seus componentes e seus modelo de objetos. Herana muito poderosa, mas voc deve definir inteligentemente suas classes base para que possam ser teis o bastante para tornarem-se herdveis, mas genricas o bastante para serem utilizveis por muitas classes derivadas. A herana est disponvel entre linguagens .NET, como voc viu na seo de herana visual. A herana visual uma tcnica poderosa para obter um conjunto comum de funcionalidade entre todos os formulrios da sua aplicao. Foram-se os dias de ter que simular a herana de formulrios criando novos mdulos de classe para controlar a aparncia dos formulrios e usar matrizes de controles para criar novos controles programaticamente. Embora voc ainda possa usar esta abordagem, as coisas tornaram-se mais simples porque voc pode realmente herdar formulrios e estend-los atravs do designer de formulrios. Com a apresentao da herana de implementao, o VB .NET entra no reino das linguagens orientadas a objeto pela primeira vez. O VB6 tinha alguns dos recursos da OO, mas a adio da herana de implementao, um dos mais bsicos conceitos de OO, em muito aumenta o prestgio da OO do VB .NET.

Captulo 6. Iniciando com o ADO.NET


NESTE CAPTULO A Importncia ADO.NET Construindo uma Aplicao Simples com ADO .NET Objetos Para Dados Desconectados Comparando ADO e ADO.NET ADO.NET a nova tecnologia da Microsoft para acessar dados. A Microsoft j vem a muito tempo na linha de frente do movimento de acesso universal a dados, iniciando com a Open Data Base Connectivity (ODBC) a quase nove anos atrs. No h dvidas sobre a importncia de acesso a dados para aplicaes modernas, mas o modo como voc acessa os dados tem um impacto significativo na performance e escalabilidade da aplicao. Some-se a isto o fato de que as aplicaes esto crescendo na sua distribuio, e a passagem de grandes quantidades de dados de um lugar para outro torna-se uma questo ainda mais crtica no design e criao de aplicaes.

A Microsoft tem dedicado um bocado de trabalho no acesso a dados. Ela tem realizado um grande nmero de mudanas na tecnologia de acesso a dados, e o ADO .NET no outra coisa seno mais um destes avanos. Os desenvolvedores descobriro toda uma nova forma de criar aplicaes orientadas para banco de dados. Combinando o poder acesso a dados, XML e da .NET Framework, a Microsoft apresentou sua mais poderosa tecnologia de acesso a dados at hoje. A Importncia do ADO.NET O mundo das aplicaes vem evoluindo a algum tempo. Inicialmente, as aplicaes eram centralizadas, e eram acessadas por terminais burros. Todo o cdigo rodava no mainframe, e os profissionais de tecnologia da informao (IT) controlavam tudo. Com o tempo surgiu o PC e tudo mudou. O poder de computao moveu-se para a mesa de trabalho e as pessoas passaram a executar planilhas, bancos de dados, processadores de texto e outras coisas mais. Contudo, nenhum PC podia ser uma ilha por muito tempo. Logo, as pessoas estariam ligando de volta seus PCs com cordes umbilicais a servidores, naturalmente, aqueles mainframes. Dado que os PCs estavam constantemente sendo ligados a servidores, voc viu surgir a computao Cliente/Servidor. Diferentemente da abordagem centralizada das aplicaes mainframe/terminal burro, voc tinha uma soluo distribuda na qual os dados ficavam no servidor e muito da funcionalidade rodava no cliente. Em seguida, veio o desenvolvimento n-camadas, no qual as regras de negcio estavam postas em objetos centralizados rodando no servidor. Isto significou que as aplicaes clientes eram usadas para tarefas como recebimento de entrada, exibio de dados, impresso e por a adiante. Regras de negcios e acesso a dados foram encapsulados em componentes compartilhados, reutilizveis, que acessavam dados em um banco de dados localizado em um micro potente ou em um mainframe No passo seguinte da evoluo, as aplicaes Web tornaram-se a moda, e logo o desenvolvimento retornou ao modelo centralizado dos tempos dos mainframes. O navegador estava atuando como nada mais do que um terminal burro, aceitando entradas do usurio e exibindo telas. Todo o processamento ocorria sob o controle do departamento de tecnologia da informao, e era distribudo por servidores Web, servidores de aplicao e servidores de bancos de dados.

Embora aplicaes Web ainda sejam comuns, muitas delas esto sendo desenvolvidas usando o modelo n-camadas. Mais importante que o aparecimento de uma nova classe de componentes, chamados Web Services, est mudando o modo como as aplicaes so desenvolvidas. Com Web Services, voc pode usar a Internet como um sistema operacional distribudo, com componentes localizados em qualquer parte do mundo e acessados via HTTP. Voc ver mais sobre Web Services no captulo 9, "Criando Web Services com VB .NET". neste mundo que o ADO .NET surge, pronto para enfrentar o desafio de ter componentes que, embora, distribudos pela Internet, ainda precisam passar dados de um para o outro. Algumas partes do ADO.NET so muito mais simples que as correspondentes nas tecnologias que o antecedem. Algumas facetas do ADO.NET podem parecer bem complexas, mas isto costuma ser devido a um nvel de indireo almejado para tornar o acesso a dados mais lgico nos ambientes dos nossos dias. Para melhor entender o ADO.NET, til compreender como ele evoluiu. Prepare-se para uma breve lio de histria e voc entender melhor o porqu do nascimento do ADO.NET. A rvore da Famlia ADO.NET ADO.NET a mais recente de uma linha de tecnologias de acesso a dados da Microsoft. Mesmo sendo um passo na evoluo, um grande passo para frente; pode ser considerado a maior mudana no acesso a dados da Microsoft desde o seu primeiro modelo de objetos lanado a dez anos atrs. ADO.NET representa a primeira vez que a Microsoft tentou separar o conceito de acesso a dados do conceito de manipulao dos dados, como ser visto nas sees seguintes. No Princpio: SQL Embutido e APIs No incio, as aplicaes acessavam dados pelo simples embutimento de comandos SQL no programa, juntamente com toda a informao necessria para acessar o banco de dados. Muitas aplicaes mainframe criadas antes de 1990 tinham acesso direto ao banco de dados pelo programa. Eles continham informaes de conexo, comandos SQL para acessar e manipular dados e cdigo para exibir os dados. Estas aplicaes fortemente ligadas aos dados, pressupunham a constncia do nome do servidor e do banco de dados. Em adio, qualquer mudana na estrutura de tabelas costumava exigir a recompilao das aplicaes clientes. Para abrir os bancos de dados a uma forma alternativa de acesso, APIs prprias para bancos de dados foram criadas, tais como a DB-Lib e OCL.

Estas APIs foram feitas para permitir que os desenvolvedores, quase sempre em C, acessassem os dados de uma mquina Unix ou Windows. Estas bibliotecas eram tipicamente rpidas por serem otimizadas para um banco de dados especfico. Contudo, elas eram difceis de usar; eram APIs de baixo nvel e no baseadas em objetos como as tecnologias posteriores viriam a ser. Em adio, porque elas eram especficas para um banco de dados, tornava-se muito difcil mudar de um banco de dados para outro. Para fazer a mudana, uma grande parte da aplicao teria que ser reescrita para usar uma biblioteca completamente nova. ODBC, DAO, e RDO Quando a Microsoft lanou o Access 1.0 nos anos noventa, era seu primeiro programa de banco de dados para Windows. O Access continha o JET database engine, que era o dispositivo de acesso a dados para aplicaes desktop da Microsoft (assim como o SQL Server o seu dispositivo de banco de dados servidor). A Microsoft viu que, embora o JET fosse bom para a criao de aplicaes baseadas no armazenamento de dados em um PC, nem todos os dados eram armazenados em um PC. Muitas companhias j tinham dados armazenados em bancos de dados servidores como SQL Server, Oracle e DB2. A Microsoft, portanto, queria que as pessoas no s tivessem acesso a estes dados em servidor, mas pudessem us-los com a mesma facilidade que usavam os dados armazenados pelo JET. Para atingir isto, em 1993, a Microsoft lanou a Open Database Connectivity ou ODBC. ODBC, diferente das APIs especficas de bancos de dados, permitia que o desenvolvedor programasse de tal forma que o banco de dados fsico tornassese menos importante que a estrutura lgica do esquema. Voc poderia escrever seus comandos SQL e, se fossem apenas SQL padro, voc poderia mudar o dispositivo de acesso a dados sem ter que reescrever parte alguma do seu cdigo. Isto era porque a ODBC tinha um nvel de indireo entre a sua aplicao e o banco de dados. Voc apontava para algo chamado de data source name, ou DSN. O DSN determinava qual banco de dados voc estaria acessando ( pelo carregamento do driver de ODBC apropriado) e a localizao do banco de dados. ODBC foi projetada para, no s permitir que voc acessasse os dados, mas fazer os dados remotos parecerem locais. As tabelas remotas pareciam como as tabelas locais do JET a ponto de voc poder criar consultas SQL juntando tabelas locais do JET com tabelas remotas. Ou, voc poderia realizar joins em tabelas de diferentes bancos de dados remotos, como realizar joins entre tabelas do SQL Server e tabelas do Oracle usando ODBC e o JET como uma camada intermediria.

No JET, a Microsoft tambm incluiu um modelo de objetos chamado Data Access Objects, ou DAO. O DAO continha um conjunto de classes que permitiam-lhe acessar facilmente bancos de dados, tabelas, registros e outros objetos de bancos de dados. Para qualquer tabela, voc poderia examinar as colunas, incluindo os nomes das colunas, tipos e etc. Voc podia usar comandos da linguagem de definio de dados (DDL) para criar ou excluir tabelas, criar ou excluir ndices e assim por diante. O JET fez sucesso entre os desenvolvedores, porque ele apresentava aos desenvolvedores um rico conjunto de objetos fceis de usar com os quais se poderia acessar e manipular dados. Os desenvolvedores usando Access ou Visual Basic poderiam usar DAO para trabalhar com qualquer dado em banco de dados JET, incluindo aquelas tabelas ligadas ao banco de dados JET via ODBC. Isto significou que os desenvolvedores tinham fcil acesso aos dados no importando o banco de dados real em que eles estivessem armazenados. O problema com o DAO, contudo, era que ele foi criado baseado no JET. E se todos os seus dados estivessem em SQL Server, ou Oracle, ou algum outro tipo de banco de dados? Voc poderia ligar todas as tabelas ao banco de dados JET via ODBC e usar DAO, mas ento voc teria o JET entre voc e seus dados, O JET era relativamente grande nesta poca, consumindo perto de 1 MB de memria numa poca em que as mquinas tipicamente tinham de 4 a 16 MB de RAM. Em adio, o JET inclua um otimizador de consultas, que j estava disponvel nos bancos de dados servidor. Todas as consultas ao banco de dados servidor tinham que passar pela camada do JET, incluindo pelo seu otimizador de consultas, e novamente pelo otimizador do servidor. O resultado era que a passagem pelo DAO e JET poderia ser lenta. Uma alternativa ao uso do DAO era programar diretamente com ODBC. Este era um modo muito mais rpido de acessar dados, mas era muito mais difcil. ODBC no era baseada em objetos, como o DAO. Portanto, programar com a API de ODBC requeria significativamente mais cdigo, e elementos tais como o cursor de banco de dados e mesmo memria tinham que ser gerenciados pelo programador. Por um bom tempo, os desenvolvedores que acessavam dados em servidores tinham estas duas opes: usar DAO, que era fcil, mas (relativamente) lento, ou programar com a API de ODBC, que era rpida mas difcil. A Microsoft reconheceu que deveria haver um modo melhor e, no lanamento do Visual Basic 4.0, em 1995, a Microsoft tambm lanou um novo modelo de objetos, baseado na ODBC, chamado Remote Data Objects ou RDO. RDO era muito parecido em estrutura com o DAO, mas muitos dos nomes de objetos eram diferentes o bastante para exigir que o cdigo em DAO tivesse de ser reescrito. Porm, os conceitos bsicos eram os mesmos, tais como

conectar-se a um banco de dados, ter acesso a colees de tabelas, e ento a colees de campos e assim por diante. O modo de acessar dados era parecido entre DAO e RDO, mas RDO no tinha que usar o JET, de modo que voc tinha quase a mesma velocidade de ODBC com a facilidade de programao que j tinha apenas no DAO. A Microsoft tinha DAO e RDO, ambos baseados em ODBC. Estes eram os dois modelos de objetos que os desenvolvedores estavam usando com grande sucesso. Contudo, a Microsoft viu uma nova tendncia de mercado, e decidiu acompanh-la com uma nova tecnologia: OLE DB. OLE DB e ADO A Microsoft criou a ODBC com uma inclinao particular: ela assume um modelo relacional de armazenamento de informaes. Entenda que, embora hajam drivers de ODBC para arquivos Excel, arquivos texto e outras fontes no relacionais, estes drivers fazem a fonte parecer relacional. DAO e RDO foram projetados com uma estrutura relacional em mente; quando voc conecta-se a um banco de dados, ele automaticamente preenche uma coleo de tabelas disponveis. Cada tabela tem uma coleo de colunas que automaticamente preenchida. Estas colees e objetos so disponibilizadas porque assumido que a fonte um banco de dados relacional. A Microsoft sabia que nem todos os dados de uma corporao so armazenados em bancos de dados relacionais. Por exemplo, dados corporativos pode estar armazenados no Exchange ou no Active Directory, nenhum dos quais usa um dispositivo relacional. Dados podem estar armazenados em arquivos Excel ou texto, ou uma variedade de outros formatos. A Microsoft queria projetar um modo de ler dados tanto relacionais quanto no-relacionais usando uma metodologia consistente. Foi criada ento a OLE DB. OLE DB uma API de baixo nvel como a ODBC. Contudo, OLE DB no assume uma fonte relacional. Pelo contrrio, OLE DB usa seus prprios drivers, chamados providers, para acessar os dados. Providers nativos de OLE DB permitem-lhe acessar dados relacionais ou no-relacionais usando a mesma API. Embora OLE DB seja uma API de baixo nvel, a Microsoft tinha aprendido com a sua experincia com a ODBC e RDO, de modo que a OLE DB foi lanada com o ActiveX Data Objects, ou ADO. ADO o modelo de objetos fcil de usar construdo sobre o topo da OLE DB. Usando ADO, voc pode fazer uma conexo ao banco de dados e acessar registros. ADO permite-lhe usar um nico conjunto de objetos para acessar fontes de dados no importando o formato dos dados.

Diferente do DAO e RDO, contudo, o modelo de objetos ADO bem reduzido. DAO e RDO contem ambos dzias de objetos, enquanto ADO contm menos de dez objetos principais. DAO e RDO podem automaticamente preencher colees de tabelas, colunas e relacionamentos. ADO no tem estes objetos porque ADO, sendo baseado na OLE DB, no pode automaticamente assumir um banco de dados relacional como a sua fonte. Portanto, com ADO, voc tem que saber como consultar as tabelas do sistema para examinar sua estrutura. Nota A Microsoft realmete lanou um modelo de objetos acompanhante para o ADO chamado ADOX. ADOX assume uma fonte relacional e tem os necessrios objetos para trabalhar com tabelas, colunas, relacionamentos, etc. Apesar disto, poucas pessoas chegam a usar ADOX. Dado o fato de que a OLE DB no assume uma fonte relacional, ADO tem um pequeno nmero de objetos e, portanto, tem um baixo consumo de memria. Tambm muito rpido; OLE DB providers tendem a superar em performance ao drivers de ODBC para um banco de dados. ADO, nas suas mais recentes verses, tambm soma alguns recursos de XML. Por exemplo, voc pode usar ADO para criar recordsets desconectados. Estes recordsets so armazenados em disco e voc os pode abrir com ADO sem a necessidade de primeiro conect-los a um banco de dados. Estes recordsets pode ser persistidos tanto em formato binrio ou no formato XML. Estes recordsets desconectados podem ser usados para aumentar a performance da aplicao, porque, com eles, voc no tem que manter uma dispendiosa conexo ao banco de dados para transmiti-los na rede. possvel mesmo fazer incluses, alteraes e excluses nestes recordsets desconectados e depois sincronizar suas mudanas com o banco de dados. A despeito desta capacidade de criar recordsets desconectados, ADO tipicamente assume um ambiente conectado onde voc transfere registros do banco de dados para o cliente usando um dos diversos tipos de cursores. Embora ADO seja diferente de DAO e RDO, todos os trs so construdos sobre um modelo conectado e combinam o acesso a dados com a manipulao dos dados. A diferena entre as duas aes importante e ser examinada na prxima seo. Em adio, dados so tipicamente recuperados e armazenados na memria de forma que fcil de acessar e manipular quando esto no processo da aplicao cliente. Contudo, se os dados so recuperados em uma camada intermediria e necessitam ser transferidos para o cliente para serem exibidos, uma constante luta para descobrir a melhor forma de transferir os dados de

uma camada para a outra. Passagem de dados entre processos sempre um desafio com aplicaes multicamadas. ADO.NET tenta responder a esta questo de separao do acesso a dados da exibio e manipulao dos dados, e tambm como passar dados entre camadas. Voc pode ver a linha evolutiva das tecnologias de acesso a dados da Microsoft na figura 6.1. Figura 6.1. A linha evolutiva das tecnologias de acesso a dados da Microsoft .

Por que Existe ADO.NET Do mesmo modo como a Microsoft viu a necessidade de mover da ODBC para a OLE DB, ela viu a necessidade de ir alm da OLE DB. Embora no haja nada de inerentemente errado com a ODBC ou OLE DB, a Microsoft viu que muitos dos esforos atuais de desenvolvimento so gastos criando sistemas n-camadas. No s estas aplicaes n-camadas foram criadas para rodar dentro da companhia, mas tambm podem querer utilizar um tipo especfico de componente - servios Web - que so expostos na Web via HTTP. Graas a um iniciativa chamada de Simple Object Access Protocol, ou SOAP, possvel chamar componentes em qualquer parte na Web vic HTTP. SOAP um protocolo baseado em XML criado para envio e recebimento de informao em um ambiente distribudo, habilitando chamadas de procedimentos remotos via HTTP. Com SOAP e servios Web, voc tem a vantagem adicional de independncia de plataforma; o servio Web pode ser escrito em C# e rodar em um servidor Windows XP, enquanto o cliente que o chama pode ser um servio Web escrito em C++ rodando em um Linux, ou poderia ser um telefone habilitado para Web. A questo que a chamada apenas uma solicitao HTTP, e o retorno dado em uma resposta HTTP com a solicitao e resposta real contendo XML. A passagem de dados de um servio Web para alguma forma de cliente mostra uma razo para a existncia do ADO.NET. A passagem de um recordset ADO de um servio Web para um cliente possvel, mas h certos

inconvenientes. Primeiro, voc tem de criar um cursor esttico. Ento, voc tem de salvar o recordset em formato XML e envi-lo de volta para o cliente. O formato padro ADTG dos recordsets ADO tipicamente instransfervel atravs de firewalls ou servidores proxy; mesmo se o for, o formato binrio ADTG ter pouco significado para uma aplicao cliente no-Windows. Portanto, ADO.NET, como voc ver, fala XML nativamente. Uma razo a mais para a existncia do ADO.NET o fato de que a Microsoft queria separar o acesso a dados do trabalho com os dados. Isto fornece um outro nvel de indireo, e permite que voc separe os objetos que lhe ajudam a trabalhar com dados dos objetos que o ajudam a acessar dados. Este novo nvel tambm torna bastante simples trabalhar com dados desconectados por padro, o que pode conduzir a grandes ganhos de escalabilidade. Alm disto, ADO. NET existe por causa da .NET Framework. No passado, ODBC e OLE DB, juntamente com seus modelos de objetos associados, eram independentes de qualquer ferramenta especfica. Com a .NET Framework, a Microsoft introduziu o ADO.NET no conjunto padro de servios disponvel para todas as linguagens que usam a .NET Framework. Agora, o acesso a dados torna-se um dos servios bsicos oferecidos pela infraestrutura de servios, garantindo uma tecnologia de acesso a banco de dados consistente ao longo de todas as linguagens .NET. Por ser criado dentro da .NET Framework, isto significa que o ADO.NET leva a vantagem de todos os servios fornecidos pela Framework, tais como gerenciamento automtico de memria, gargage collection, e assim por diante. Isto torna o ADO.NET fcil de manipular e significa que aqueles de vocs que escreverem cdigo gerenciado em C++ no tero que se preocupar com o tratamento da memria usada pelo ADO.NET. ADO.NET diferente de DAO, RDO e ADO pelo fato de que ele no tem uma API subjacente como a OLE DB ou ODBC. Ao contrrio, ADO.NET pode usar drivers nativos, chamados de provedores gerenciados, escritos para cada banco de dados, ou ele pode usar um provedor gerenciado genrico OLE DB que usa provedores OLE DB. Por haver um provedor de OLE DB para ODBC, isto significa que o ADO.NET pode usar seus provedores gerenciados, OLE DB ou ODBC. A melhor performance vem dos provedores gerenciados, como voc pode imaginar. Os nicos provedores gerenciados no lanamento da .NET Framework eram para SQL Server 7.0/2000 e para OLE DB. Verses anteriores de SQL Server, ou qualquer outro banco de dados, necessitariam usar o provedor gerenciado de ADO.NET para OLE DB. Arquitetura Desconectada do ADO.NET

Muito barulho se tem feito sobre a arquitetura desconectada do ADO.NET e ela importante. Antes de mergulharmos nesta arquitetura desconectada, contudo, importante entender que o ADO.NET tambm pode operar num modo conectado. ADO.NET usa diferentes objetos dependendo se voc est operando em um modo conectado ou desconectado, e este paradigma permite que voc identifique mais facilmente quando est usando um modo conectado em lugar de um desconectado. Em tecnologias de acesso a dados anteriores, voc fazia uma conexo ao servidor e a mantinha aberta enquanto acessava e manipulava os dados. Tudo ia bem enquanto o nmero de clientes era pequeno, mas no tendia a escalar muito bem. Em adio, voc abria uma conexo aos dados e podia s vezes navegar pelos dados, dependendo do cursor escolhido. Com algumas das opes de cursor do ADO, voc podia realmente ler os valores de cada registro das tabelas subjacentes medida que acessava os dados. Isto significava um bocado de idas e vindas ao banco de dados, e tambm significava que a nica forma de obter boa performance era manter uma conexo em aberto. Um truque que muitos usavam era criar um recordset desconectado no ADO. Isto podia ser alcanado pela leitura de todos os registros de uma vez e armazenando-os na memria do cliente naquilo que se chamava de um cursor esttico. Voc podia ento gravar todo o recordset para um disco para persistilo ao longo do tempo. Voc usava ento esta cpia local dos dados ao invs de voltar ao banco de dados para buscar os dados. Esta abordagem funcionava muito bem para dados que no mudavam constantemente. O ADO.NET armazena dados na memria em um modo inerentemente desconectado. Relembre-se de que o ADO.NET separa o acesso a dados do uso dos dados, o que significa que os conceitos de mover-se nos dados em um modo totalmente livre e realizar incluses, atualizaes e excluses nada tm a ver com o ato fsico de conectar-se ao banco de dados em si. Considere o ato de comprar e dirigir um automvel. Toda manh, quando voc necessita dirigir-se para o escritrio, voc pega o seu carro e o dirige.Voc no tem que ir ao revendedor antes de pegar seu carro. Pelo contrrio, voc pega seu carro uma s vez e o mantm em casa, e ento voc o dirige dali. Voc usa seu carro desconectado do revendedor de quem voc o comprou. Do mesmo modo, ADO.NET permite que voc conecte-se ao banco de dados e obtenha registros. Ento, voc se desconecta do banco de dados. Voc continua a trabalhar com os registros, realizando aes como navegao pelos registros, ordenao e filtragem de registros e incluses, alteraes e excluses. Voc pode estar dizendo, "Grande coisa. Eu posso fazer tudo isto com um recordset desconectado de ADO." Voc est parcialmente correto, mas como voc ver depois, ADO.NET fornece um novo objeto, chamado DataSet, que

permite um nvel inigualvel de suporte desconectado. Por exemplo, se voc estivesse usando um recordset desconectado de ADO e voc inserisse um registro que violasse alguma regra de relacionamento, voc no saberia desta violao at que voc tentasse re-sincronizar o seu recordset desconectado com o banco de dados subjacente. O DataSet do ADO.NET, pelo contrrio, pode garantir integridade referencial no modo desconectado, garantindo que voc est seguindo as regras e fazendo alteraes vlidas nos dados. ADO e outros modelos conectados podem tambm encontrar dificuldades na movimentao de dados de uma camada para outra. Se um componente na camada intermediria abrir uma conexo e iniciar a recuperao de dados, ele teria que alimentar registros para o cliente em uma string, em uma coleo, em uma matriz de variantes, passando um objeto recordset, ou por algum outro mtodo. Cada mtodo tende a ter seus prs e contras, e nenhum mtodo certo para todas as situaes. Recordsets desconectados no ADO.NET, por outro lado, podem ser muito fceis de passar de uma camada para outra (ou atravs de fronteiras de processos na mesma camada). No mantendo uma conexo aberta e tornando fcil e eficiente a passagem de dados atravs de fronteiras de processos, ADO.NET alcana um novo nvel de escalabilidade.