Sei sulla pagina 1di 152

Programa de Formao .

NET

Apostila
Treinamento C#

ndice
Captulo 1 Introduo Captulo 2 Viso Geral do .NET Estratgia .NET ...................................................................................................................... 9
Tecnologias ............................................................................................................................11 Vantagens do .NET ................................................................................................................12 Desvantagens do .NET ..........................................................................................................13 Verses do Framework ..........................................................................................................13

9 9

Framework .NET Verso 1.0 (1.0.3705) Framework .NET Verso 1.1 (1.1.4322) Framework .NET Verso 2.0 (2.0.50727.42) Funcionamento do Framework ......................................................................................15
A Mquina Virtual ...................................................................................................................15

14 14 14

Esquema de funcionamento do .NET.


Coleta de lixo (Garbage Collector) .........................................................................................17

16 19

Captulo 3 Visual Studio 2005 Objetivos..............................................................................................................................19 Conceitos de Soluo e Projeto ....................................................................................19 Breve Introduo aos Diferentes Tipos de Projeto .....................................................20 Explorando as Janelas......................................................................................................22
Solution Explorer ....................................................................................................................22 Toolbox ...................................................................................................................................23 Properties ...............................................................................................................................23 Server Explorer.......................................................................................................................24 Task List .................................................................................................................................24 Output .....................................................................................................................................25 Error List .................................................................................................................................25

Lab: Navegando na IDE ..................................................................................................25 Reviso.................................................................................................................................28 Captulo 4 Linguagem C# Declarao de Variveis.................................................................................................29 29

Apostila
Treinamento C#
Case Sensitive.....................................................................................................................29 Tipos de variveis...............................................................................................................29 Marcadores de bloco e finalizadores...........................................................................32 Smbolos e operadores lgico-aritmticos ..................................................................32 If...else...................................................................................................................................33 Laos While .........................................................................................................................33 Laos for ..............................................................................................................................33 Laos do...while .................................................................................................................34 Switch..Case .......................................................................................................................34 Loop foreach......................................................................................................................34 Vetores (arrays) ..................................................................................................................35 Funes................................................................................................................................35 Estrutura de um programa C# .......................................................................................36 Converso de tipos (cast) ...............................................................................................36 Strings....................................................................................................................................37 Reviso.................................................................................................................................37 Captulo 5 Orientao a Objetos com C# Objetivos..............................................................................................................................38 Viso Geral..........................................................................................................................38 Classes e Objetos...............................................................................................................39 Agora que criamos a classe porta, como fazemos para criar um objeto do tipo Porta? Atributos e Propriedades .................................................................................................40 Mtodos...............................................................................................................................41 New Keyword .....................................................................................................................42 Construtores e Destrutores...............................................................................................43 Lab: Trabalhando com Classes ......................................................................................44 Nveis de Acesso e Visibilidade.......................................................................................47
Public ......................................................................................................................................48 Private.....................................................................................................................................48 Protected ................................................................................................................................48 Internal....................................................................................................................................49 Protected Internal ...................................................................................................................49

38

40

Apostila
Treinamento C#
Resumo dos Nveis ................................................................................................................49

Encapsulamento................................................................................................................50 Notao UML .....................................................................................................................50 Herana...............................................................................................................................51


Classe Abstrata e Classe Selada...........................................................................................53

Sobrescrita de Mtodos ...................................................................................................54 Sobrecarga de Mtodos .................................................................................................55


Acessando a classe pai base e this ....................................................................................55

Polimorfismo ........................................................................................................................55 Lab: Trabalhando com Herana ...................................................................................57 Interface ..............................................................................................................................57 Mtodos, Atributos e Propriedades Estticas..............................................................58 Classes Parciais ..................................................................................................................59 Reviso.................................................................................................................................60 Captulo 6 Tpicos Avanados Objetivos..............................................................................................................................61 Namespaces ......................................................................................................................61
Outro uso para Using .............................................................................................................63

61

So idnticas! Referncias .........................................................................................................................64 Lab: Trabalhando com Namespace e Referncias ..................................................65 Bibliotecas do Framework .NET 2.0 ................................................................................67
O namespace System ............................................................................................................67

63

Nota
O namespace System.Text ....................................................................................................68 O namespace System.Collections .........................................................................................68

68

Trabalhando com HashTables


O namespace System.IO .......................................................................................................70

69 70 70

Escrevendo um arquivo Lendo um arquivo Tarefas recorrentes............................................................................................................70


Acessando o diretrio da aplicao .......................................................................................70 Verificando o nome do computador .......................................................................................70

Apostila
Treinamento C#
string NomeComp = System.Environment.MachineName; 70

string nDNS = System.Net.Dns.GetHostByName("LocalHost").HostName; 71


Verificando a verso do sistema operacional ........................................................................71 Verificando o usurio que est rodando o programa .............................................................71

string usr = System.Environment.UserName; Tratamento de Erros Uso de Try/Catch/Finally .........................................................71


Tratamento estruturado de erros try/catch ..........................................................................71 Excees personalizadas.......................................................................................................74 Disparando exceptions ...........................................................................................................74 Finally .....................................................................................................................................74

71

Reviso.................................................................................................................................75 Captulo 7 XML Objetivos..............................................................................................................................76 O que XML?.....................................................................................................................76 Elementos de um Documento XML...............................................................................77


Declarao .............................................................................................................................77 Tags........................................................................................................................................77 Atributos .................................................................................................................................79 Comentrios ...........................................................................................................................79 XML Bem Formado ................................................................................................................79

76

Definindo a Estrutura do Documento ...........................................................................79 Reviso.................................................................................................................................81 Captulo 8 ADO.NET Objetivos..............................................................................................................................82 O que o ADO.NET...........................................................................................................82 Providers do .NET................................................................................................................82 Modelo ADO.NET ...............................................................................................................83
Connection .............................................................................................................................83 Command ...............................................................................................................................83 DataReader ............................................................................................................................84 DataAdapter ...........................................................................................................................85 Criando comandos automaticamente: o CommandBuilder....................................................86

82

DataSet ................................................................................................................................87 Nota 87

Apostila
Treinamento C#
Populando e iterando por um DataSet ...................................................................................88 Filtrando dados em um DataSet.............................................................................................88 Procurando por uma informao em um DataSet..................................................................89 DataViews ..............................................................................................................................89

Nota
Atualizando o banco com informaes do DataSet ...............................................................90

89

Acessando arquivos XML .................................................................................................91


Gravando arquivos XML a partir de um DataSet ...................................................................91 Lendo arquivos XML em um Dataset .....................................................................................92

Trabalhando com nulos ...................................................................................................93 Reviso.................................................................................................................................93 Captulo 9 Trabalhando com Windows Forms Objetivos..............................................................................................................................94 Formulrios MDI ..................................................................................................................94
Herana de formulrios ..........................................................................................................95

94

Nota User Controls .......................................................................................................................96


Adicionando um controle programaticamente........................................................................96 Disparando eventos de um controle.......................................................................................96

95

Lab: Criando um User Control.........................................................................................97 Respondendo a eventos de teclado .........................................................................100 Data Binding .....................................................................................................................100
DataSource...........................................................................................................................100 DataBinding ..........................................................................................................................102 BindingNavigator ..................................................................................................................102

Lab: Data Binding ............................................................................................................103 DataGridView...................................................................................................................107


Populando um DataGridView ...............................................................................................108 Ativando a ordenao automtica........................................................................................108 Ativando o auto-ajuste de linhas e colunas..........................................................................108 Renomeando as colunas......................................................................................................109 Formatando colunas.............................................................................................................109 Mudando o estilo de acordo com uma condio..................................................................109 Fazendo um DataGridView zebrado..................................................................................110 Lendo eventos de seleo ...................................................................................................110

Apostila
Treinamento C#
Oferecendo uma lista de opes em um ListBox.................................................................111

Formulrios Master/Detail ..............................................................................................112


DataRelation.........................................................................................................................112 Estratgia do Master/Detail ..................................................................................................113

Lab: Relacionamentos e Master-Detail ......................................................................113 Reviso...............................................................................................................................117 Captulo 10 Web Services 118

Objetivos............................................................................................................................118 Conceito: O que um Web Service?.........................................................................118 Criando um Web Service...............................................................................................120 Consumindo um Web Service ......................................................................................125 Distribuindo um Web Service ........................................................................................127 Reviso...............................................................................................................................129 Captulo 11 Depurao, Debug e Trace 130

Objetivos............................................................................................................................130 Depurando uma aplicao..........................................................................................130


Breakpoints e condies ......................................................................................................132 Watch Window......................................................................................................................133 O QuickWatch ......................................................................................................................133 A janela Output.....................................................................................................................134 A janela Immediate...............................................................................................................134 As janelas Locals e Auto ......................................................................................................135

Debug e Trace .................................................................................................................135


Mtodos do Debug e do Trace.............................................................................................135 Listeners ...............................................................................................................................136

Reviso...............................................................................................................................137 Captulo 12 Distribuio 138

Objetivos............................................................................................................................138 Tipos de setup suportados .............................................................................................138 Criando um projeto de setup .......................................................................................138 Personalizando o setup ..................................................................................................141
Seo File System................................................................................................................143 Seo Registry .....................................................................................................................144 Seo File Types..................................................................................................................144

Apostila
Treinamento C#
Seo User Interface............................................................................................................145 Sees Custom Actions e Launch Conditions .....................................................................145

Criando um projeto de atualizao ...........................................................................146 Click-once deploy...........................................................................................................147 Reviso...............................................................................................................................149 Apndice A Referncias 150

Livros e Revistas ................................................................................................................150 Sites .....................................................................................................................................150


.NET e Visual C# ..................................................................................................................150

Microsoft ASP.NET Site oficial da Microsoft sobre ASP.NET MSDN Brasil Outro site official da Microsoft, trata das plataformas de desenvolvimento Microsoft Visual C# Walkthroughs Code Project C# Reference Introducing a New Data Grid Windows Forms Demos XML Tutorial XML Introduo DTD Tutorial XML Schema Tutorial System.Xml Namespace Acessando XML remoto e buscando informaes com o Namespace System.Xml.XPath Migrando arquivos Textos delimitados para XML

150 150 150 150 150 151 151 151 151 151 151 151 151 151

Windows Forms....................................................................................................................151

XML ......................................................................................................................................151

Distribuio ...........................................................................................................................152

Apostila
Treinamento C#

Captulo 1 Introduo
Com este intuito, esto sendo desenvolvidos treinamentos, para preparar os profissionais para este o novo conceito de desenvolvimento, que surge junto com o .NET. Para que os profissionais tenham condio de compreender esse novo universo introduzido pelo .NET, esse Adoption Lab ir discutir os principais conceitos que esto por trs deste. Faremos um tour pelo Visual Studio, e criaremos algumas aplicaes usando o C# como base. Terminaremos mostrando como distribuir as aplicaes desenvolvidas, e como planejar estratgias de migrao. Como a plataforma .NET extremamente rica, e o tempo do curso limitado, no ser possvel cobrir tudo o que o .NET tm a oferecer. Como essa migrao uma mudana de paradigmas, necessrio cobrir alguns dos aspectos mais importantes da linguagem e do framework como orientao a objetos, acesso a dados atravs do ADO.NET, XML, Web Services. Procuramos, no material terico, dar um embasamento maior do que o que ser visto em sala, para que o aluno possa por iniciativa prpria complementar o conhecimento adquirido em sala. Por fim, esperamos com esse treinamento plantar uma semente, que instigue os profissionais a buscar conhecer mais sobre esse assunto. Para auxili-los, indicamos algumas referncias aonde possvel iniciar a sua pesquisa.

Captulo 2 Viso Geral do .NET


Estratgia .NET
A Microsoft vem constantemente evoluindo as tecnologias de desenvolvimento, buscando integrar aplicaes e tornar o desenvolvedor mais produtivo. Com o aparecimento do DDE e OLE, a Microsoft permitiu a integrao fcil entre aplicaes Office e programas desenvolvidos dentro do ambiente Windows.

Apostila
Treinamento C#
O ActiveX veio no bojo da Internet, oferecendo para os programadores os conceitos de componentizao. A tecnologia COM trouxe maior liberdade de desenvolvimento, e a COM+ introduziu um framework que permite escalabilidade, transaes e segurana. Apesar dessas mudanas, ainda existia um grade vazio a ser preenchido. Era custoso para um programador Visual Basic desenvolver componentes que usassem todos os recursos da tecnologia COM, bem como fazer uso da API: a documentao disponvel era voltada a programadores C++, e a principal fonte de informao eram livros que traduziam as interfaces da API para que os programadores VB pudessem utilizar. Alm disso, ainda havia o problema de tipos de dados que as interfaces usavam e que no estavam disponveis no VB. Mesmo com os avanos trazidos pelas tecnologias citadas, os programadores Windows ainda enfrentavam outro problema: o famigerado DLL Hell sobreposio de verses de DLLs em cujas novas verses haviam chamadas de funes diferentes das anteriores, o que fazia com que programas que usavam a verso mais antiga da DLL deixassem de funcionar. Outra caracterstica que foi perdida foi a capacidade de instalar uma aplicao apenas com a cpia dos arquivos: tornou-se necessrio o uso de instaladores que, alm de copiar os arquivos, ainda precisavam registrar os componentes no Registro do Windows. O .NET no s resolve tais problemas, mas tambm unifica a plataforma de desenvolvimento e adiciona novas funcionalidades que so ou sero essenciais para o desenvolvimento corporativo, como XML, Web Services, threading, SmartClients e outros. Ele permite que diversas linguagens trabalhem juntas, de forma transparente, para criar aplicaes que so mais fceis de fazer, gerenciar, distribuir e integrar com outros sistemas. Entre suas caractersticas, temos: Interoperabilidade Como diversas bibliotecas COM j haviam sido criadas, o .NET Framework prov meios de permitir interoperabilidade entre o novo cdigo e bibliotecas existentes.

10

Apostila
Treinamento C#
Common Runtime Engine As linguagens de programao no .NET Framework compilam o cdigo em uma linguagem intermediria conhecida com Common Intermediate Language (CIL). Durante a execuo, essa o arquivo no formato CIL compilada pelo Just In Time Compiler (JIT) em cdigo nativo. A combinao desses conceitos chamada Common Language Runtime (CLR). Independncia de Linguagem O .NET Framework suporta o desenvolvimento em mltiplas linguagens de programao. Isso possvel porque todas as linguagens devem converter seu cdigo em um cdigo que atenda aos requisitos da MSIL. Base Class Library (BCL) A BCL (tambm conhecida como Framework Class Library - FCL), uma biblioteca de classes disponvel a todas as linguagens que utilizam o .NET Framework. Ele prove um conjunto de classes que encapsulam funes comuns, como: acesso a arquivo, interao com banco de dados, manipulap XML, etc. Distribuio Simplificada Instalao e distribuio de aplicaes Windows foi simplificada. Manipulao de Registry, distribuio de arquivos, registro de DLLs foram quase completamente eliminadas pelos novos mecanismos de distribuio do .NET. Segurana O Framework .NET permite ao cdigo rodar com diferentes nveis de confiabilidade.

Tecnologias O .NET engloba diversas tecnologias: Windows Forms Permite o desenvolvimento de aplicaes para Windows, incluindo elementos comuns de interface com o usurio; Windows Services Permite o desenvolvimento de servios para Windows.

11

Apostila
Treinamento C#
ASP.NET Foi a tecnologia escolhida pela Microsoft para substituir as antigas pginas ASP. Permite ao desenvolvedor desenvolver aplicaes web, usando todas facilidades do BCL, alm de diversos controles que reduzem drsticamente o tempo de desenvolvimento de qualquer aplicao Web. ADO.NET O ADO.NET a nova verso o ActiveX Data Objects (ADO) para .NET. Ele simplifica o acesso a dados, e permite o acesso desconectado. .NET Remoting Corresponde a uma nova abordagem de comunicao entre processos. Prov um rico e extensvel framework para comunicao entre diversas aplicaes, rodando em diferentes domnios de aplicao. Web Services Utilizando SOAP, XML, e os conceitos de Service Oriented Architecture (SOA), um web services permite conexo entre aplicaes atravs da internet. Mobille Applications Utilizando-se do Compact Framework, possvel desenvolver de forma transparente aplicaes para Pocket, SmartPhone, e outros dispositivos compactos. Visual Studio Tools for Office (VSTO) Com o VSTO, possvel desenvolver aplicaes que utilizem a riqueza da interface com o usurio do Office, e o poder e a robustez das aplicaes .NET.

Vantagens do .NET A plataforma .NET traz vantagens interessantes, tais como: Conjunto rico de bibliotecas com os mais variados usos; Controle de verso: fim do DLL Hell; Facilidade de desenvolvimento de aplicaes desde as simples at as mais complexas; Facilidade na instalao e na distribuio de aplicaes;

12

Apostila
Treinamento C#
Orientada a objetos; ADO.NET trabalha com dados desconectados; Alta escalabilidade para ambientes de misso crtica; Interoperabilidade entre plataformas e componentes desenvolvidos em outras linguagens .NET; Sintonizado com as ltimas tecnologias; Soluo sendo mundialmente adotada; Tecnologia baseada em mquina virtual; Rotina automtica de coleta de lixo que permite remoo de variveis e objetos que no so mais utilizados; Novo ambiente de desenvolvimento acelerado (RAD).

As vantagens no acabam por aqui, seriam necessrias pginas e pginas para conseguir chegar a uma lista mais completa. Mas a lista acima j um tanto agradvel.

Desvantagens do .NET As maiores desvantagens do .NET, que devem ser vistas para se ter uma idia do esforo de migrao: um novo paradigma, e requer aprendizado de novas tcnicas para fazer o melhor uso da ferramenta; Requer a distribuio do framework; Em alguns casos requer reengenharia ou reescrita completa do cdigo.

Verses do Framework Existem diferentes verses do Framework:

13

Apostila
Treinamento C#
Framework .NET Verso 1.0 (1.0.3705) Esta foi a primeira verso do Framework, liberado em 2002. Ele est disponvel como um pacote de distribuio, como um kit de desenvolvimento de software (SDK), ou junto com o Visual Studio 2002. Framework .NET Verso 1.1 (1.1.4322) Este foi o primeiro grande upgrade, liberado em 2003. Ele est disponvel como um pacote de distribuio, como um SDK ou junto com o Visual Studio 2003. Alm disso, ele acompanha o Windows Server 2003. Mudanas da verso 1.0 Suporte nativo a aplicaes mobile (na verso 1.0, era disponvel como um Add-On). Mudanas em Segurana permite a assemblies Windows Form executarem em um modo semi-confivel Suporte nativo a bancos ODBC e Oracle (na verso 1.0, era disponvel como um Add-On). .NET Compact Framework Uma verso de Framework para aparelhos como Pocket e SmartPhone. Suporte ao Internet Protocol v6 (IPv6). Numerosas mudanas em APIs.

Framework .NET Verso 2.0 (2.0.50727.42) Nesta verso, liberada em Outubro de 2005, houveram alteraes no s de tecnologia, como de estratgia. Ele est disponvel como um pacote de distribuio, como um SDK ou junto com o Visual Studio 2005 ou o SQL Server 2005. Mudanas da Verso 1.1 Numerosas mudanas em APIs.

14

Apostila
Treinamento C#
Novos controles ASP.NET. Verso interna de IIS, permitindo desenvolver aplicaes ASP.NET ou Webservices sem a necessidade de ter o IIS instalado na mquina de desenvolvimento. Suporte completo a 64-bits para as plataformas x64 e IA64. Suporte de linguagem para Generics diretamente na CLR.

Funcionamento do Framework
A Mquina Virtual O .NET baseia-se no conceito de mquina virtual, que serve como uma camada que fica entre o cdigo e o sistema operacional. No conceito de mquina virtual, um programa pode ser portado entre vrias plataformas, desde que exista para elas uma mquina virtual capaz de compilar o cdigo. Alm do pacote de instalao comum para Windows, a Microsoft prov o Shared Source Common Language Infraestructure, que roda em Windows, FreeBSD e Mac OS X; e como o CLI um padro aberto, existem diversos projetos open source que surgiram para prover suporte para plataformas adicionais, sendo o mais conhecido o Mono. Todo cdigo escrito em .NET (usando Visual Basic, C#, J# ou qualquer outra linguagem disponvel) compilado para uma linguagem intermediria, chamada CIL (ou MSIL). O cdigo CIL ento distribudo e executado pelos clientes e usurios da aplicao. Os leitores mais atentos podem estar pensando: - Mas idntico ao que o VB 6 j fazia: o cdigo traduzido em tokens que so interpretados. A que reside a grande diferena: o cdigo .NET compilado just-in-time pela mquina virtual, ou seja, gerado de fato cdigo de mquina que executado com extrema rapidez. No VB 6, o cdigo era interpretado pelo VBRun: a cada instruo o interpretador comandava instrues para o processador mas se, por exemplo, uma funo for chamada repetidas vezes, ela sero reinterpretada a cada chamada que for feita.

15

Apostila
Treinamento C#
As grandes vantagens de se fazer a compilao just-in-time so a compilao especfica para o hardware em que a Mquina Virtual roda, e a portabilidade, j mencionada. Como todo o cdigo traduzido para a linguagem intermediria, tornou-se fcil padronizar tipos de dados, bibliotecas, classes, componentes, que passam agora a ser especificamente .NET e facilmente utilizveis em qualquer linguagem .NET, seja ela C++, Visual Basic ou C#. esse conjunto de bibliotecas, deu-se o nome de Base Class Library (BCL) tambm conhecida como Framework Class Library (FCL). A BCL prove um conjunto de classes que encapsulam funes comuns, como acesso a arquivo, interao com banco de dados, manipulap XML, etc. O esquema abaixo detalha as camadas da Mquina Virtual:

Esquema de funcionamento do .NET.

As caixas superiores (C# e VB.NET) representam o cdigo que escrito por programadores, como por exemplo MeuPrograma.cs (em C#) ou MeuPrograma.vb (em Visual Basic . NET).

16

Apostila
Treinamento C#
Para cada linguagem h um compilador especfico, que traduz o cdigo escrito para a linguagem intermediria (CIL). O compilador especfico do Visual Basic o vbc.exe (de Visual Basic Compiler). O cdigo CIL gerado ento armazenado, junto com outras informaes, em um arquivo .exe ou .dll, dependendo do que for parametrizado na chamada do vbc.exe. O Visual Studio j faz essa tarefa de chamar o vbc.exe com os parmetros corretos ao se usar qualquer uma das opes de Build e Run. A caixa CLR representa a Mquina Virtual (CLR de Common Language Runtime), que responsvel pelo gerenciamento dos objetos .NET e pela chamada do compilator just-in-time (JIT), que compilar o cdigo em linguagem de mquina. O cdigo compilado ficar ento em cache at que o Windows seja desligado ou reiniciado, ou ainda quando a Mquina Virtual necessitar de recursos.

Coleta de lixo (Garbage Collector) O .NET possui um mecanismo interno de coleta de lixo, capaz de desalocar a memria ocupada por objetos que j no esto mais sendo usados. Alm de retirar do programador a preocupao de limpeza de recursos, a coleta de lixo tambm resolve os problemas de desalocao de referncias circulares e de dependncia de objetos que esporadicamente aconteciam no COM. A limpeza era feita atribuindo-se Nothing uma varivel de referncia mas, se essa varivel apontasse para um objeto que, internamente, tambm tivesse referncia a outros objetos, estes ltimos no seriam liberados se o programador no tomasse os cuidados necessrios. A coleta de lixo feita sem que o usurio tenha que intervir, e o framework decide qual o melhor momento em que ela ocorrer, usando parmetros como escasseamento de recursos (caso o sistema passe por situaes de falta de memria) ou ociosidade de CPU (quando o .NET usa ciclos ociosos para alocar suas threads de limpeza). A coleta de lixo baseada em um contador de referncias que uma caracterstica de cada objeto. Quando o .NET detecta um objeto cujo marcador de referncias

17

Apostila
Treinamento C#
contm zero, isto , no existe nenhum outro objeto que o referencia, ele colocado em uma fila e ser posteriormente eliminado. H meios de se lidar com o mecanismo de coleta de lixo, como o mtodo GC.Collect(), mas usada em casos especficos aonde se termina de usar objetos muito grandes que, no entender do programador, devem ser liberados rapidamente. No geral, deve se deixar o mecanismo de coleta de lixo realizar a sua tarefa automaticamente.

18

Apostila
Treinamento C#

Captulo 3 Visual Studio 2005


Objetivos
O objetivo deste captulo familiarizar o leitor com o ambiente de desenvolvimento integrado (IDE) do Visual Studio 2005.

Conceitos de Soluo e Projeto


O projeto o ponto de partida para o desenvolvimento de aplicaes, componentes e servios no Visual Studio .NET. Ele age como um container, que gerencia seu cdigo fonte, conexes de dados, arquivos e referncias. Um projeto organizado como parte de uma soluo, a qual pode conter mltiplos projetos, que so interdependentes entre si. O Visual Studio usa um modelo baseado em pastas todos os itens do projeto so colocados na hierarquia da pasta do projeto. Quando voc adiciona um arquivo

19

Apostila
Treinamento C#
texto, uma cpia do arquivo adicionada pasta do projeto. Alm disso, quando voc remove um arquivo, voc exclui o arquivo fisicamente. Os projetos so agrupados em solues, que podem conter at projetos de linguagens diferentes. No Visual Studio .NET, os arquivos de projeto (.vbproj, .csproj, etc) e os arquivos de soluo (.sln) esto no formato XML.

Breve Introduo aos Diferentes Tipos de Projeto


Na tela inicial do Visual Studio, quando voc seleciona File > New, voc j possui alguns tipos diferentes de opes a seguir: Project Web Site

Ambos referem-se a projetos. Entretanto, o primeiro grupo corresponde aos projetos aplicados a solues desktop, e o segundo grupo aos projetos desenvolvidos para Internet. Essa separao foi introduzida apenas na verso 2005. Ao selecionarmos uma das opes (Project ou Web Site), ser exibida uma tela na qual poderemos visualizar os outros tipos de projetos disponveis.

20

Apostila
Treinamento C#

Ao selecionarmos File > New > Project, visualizamos a tela acima. Em Project types, podemos ver os tipos de projeto disponveis agrupados por categoria (por exemplo, Linguagem, ou se aplicao Windows ou para Smart Devices). Se quisermos criar uma soluo em branco, devemos selecionar Other Project Types > Visual Studio Solutions > Blank Solution. Isso ir criar uma soluo em branco. A partir desta, poderemos adicionar novos projetos no futuro. Entretanto, quando criamos um novo projeto, uma soluo automaticamente criada, com o mesmo nome da soluo que voc criou. Alguns tipos de projeto disponveis: Blank Solution Como o nome diz, cria uma soluo em branco. Windows Application Cria uma aplicao executvel, que usa como interface formulrios Windows (Windows Forms). Console Application Cria uma aplicao executvel, que usa como interface a linha de comando. Class Library Cria um projeto que ser compilado em uma biblioteca (DLL) de classes.

21

Apostila
Treinamento C#
Windows Control Library Cria um projeto que abriga uma biblioteca (DLL) de controles que podem ser adicionados aos formulrios Windows. Windows Service Cria uma aplicao executvel que roda como um servio no Windows. Device Application Cria uma aplicao executvel, desenvolvida para dispositivos compactos. Setup Project Cria um instalador para outras aplicaes. Setup Wizard Cria um instalador para outras aplicaes, utilizando um Wizard de aplicaes. Visual Studio Add-In Permite desenvolver aplicativos que iro customizar o ambiente do Visual Studio. Test Project Cria um projeto que executa testes na sua aplicao.

Alm disso, em File > New > Web Site, temos os seguintes projetos: ASP.NET Web Site Cria um projeto de um web site, utilizando ASP.NET. ASP.NET Web Service Cria um projeto de um web service, utilizando ASP.NET. Estes so apenas alguns exemplos de projetos disponveis. Alm disso, alguns plug-ins para o Visual Studio instalam outros templates de projeto.

Explorando as Janelas
Solution Explorer A janela Solution Explorer permite visualizar a estrutura de arquivos de nossa soluo, os projetos contidos nesta, e os arquivos contidos em cada projeto. Para facilitar a programao, ela agrupa arquivos similares (como, por exemplo, o arquivo que representa a planilha e os arquivos de cdigo por trs desta) e oculta os que no fazem parte da soluo.

22

Apostila
Treinamento C#

Toolbox Esta janela utilizada em modo de design, e agrupa todos os controles que podem ser adicionados ao seu projeto. Basta arrastar um controle para o design, para que o cdigo produzido pela insero desse controle seja automaticamente gerado.

Properties Nesta janela, voc pode alterar as propriedades de controles, formulrios, pginas etc, em modo de Design. Alm disso, voc pode verificar os eventos acionados por cada controle.

23

Apostila
Treinamento C#
Server Explorer Esta janela permite gerenciar diversos recursos, como conexes de dados, o event log do Windows, filas de mensagem, lista de servios, etc. Como a ToolBox possui uma abordagem Drag-and-Drop, permite voc inserir objetos em modo de design, inserindo em seu projeto objetos que permitem se comunicar com os recursos do sistema.

Task List Permite ao desenvolvedor visualizar comentrios e tarefas, deixados por ele mesmo ou por outro desenvolvedor. Para criar um comentrio, basta usar a seguinte sintaxe:
// TODO: Implementar acesso de usurio.

Todos os desenvolvedores que abrirem a Task List, vero que na linha x do arquivo y, existe este comentrio.

24

Apostila
Treinamento C#
Output Na janela Output mostrada a sada do console. Ali possvel ver no s o progresso da compilao, mas tambm todas as mensagens que so enviadas ao console como, por exemplo, System.Console.Write().

Error List Nesta janela, possvel verificar erros, warnings e mensagens geradas pelo compilador durante a compilao de nosso cdigo.

Lab: Navegando na IDE


Vamos comear a explorar a IDE do Visual Studio, criando um novo projeto e uma soluo. Abra o Visual Studio 2005. Em File > New, selecione a opo Project. Em Project Types, selecione Visual C# > Office. Em Project Templates, selecione Windows Application.

25

Apostila
Treinamento C#

Devemos dar um nome para a nossa aplicao. Na caixa Name, escreva WindowsApplicationCS, em Location, digite C:\LabVS, e em Solution Name deixe o nome proposto. Como no estaremos trabalhando com controle de verso, deixe a caixa Add to Source Control desativada. Entretanto, deixe a caixa Create directory for Solution ativada (ele ir criar uma pasta para a Soluo, separada da pasta do projeto). Clique em OK. A estrutura criada pelo projeto no disco ficou da seguinte forma:

Voltando agora ao Visual Studio, abra a janela ToolBox, expanda All Windows Forms, e arraste um controle do tipo Button da ToolBox para a planilha.

26

Apostila
Treinamento C#
Clique com o boto direito no boto, e selecione Propriedades. Na janela de propriedades, busque e altere os seguintes campos: Campo (Name) Text Valor btnHelloWorld Hello World!

Feito isso, clique 2 vezes no boto. No evento que trata o click do boto, escreva o seguinte trecho de cdigo:
MessageBox.Show("Hello World!");

Agora, voc deve ter o seguinte trecho de cdigo:


namespace WindowsApplicationCS { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnHelloWorld_Click(object sender, EventArgs e) { MessageBox.Show("Hello World"); } } }

Rode sua aplicao, clicando no cone ver o formulrio. Clique no boto.

. A sua aplicao ser executada, e voc

Grave as alteraes efetuadas, e feche o Visual Studio.

27

Apostila
Treinamento C#

Reviso
Esperamos, neste ponto, que o leitor tenha se familiarizado com a interface do Visual Studio 2005, e seja capaz de criar um novo projeto. O projeto criado nessa sesso ser utilizado como base nas sesses seguintes.

28

Apostila
Treinamento C#

Captulo 4 Linguagem C#
Declarao de Variveis
No C# as variveis so declaradas ao longo do cdigo e o tipo vem antes do nome da varivel. Dessa forma, temos: C#:
int a; string b;

Case Sensitive
O C# case sensitive. O que isso significa? Vejamos um exemplo:
int teste = 0; int Teste = 0;

...neste caso, as variveis teste e Teste so duas variveis diferentes! Alm disso, supondo que temos uma varivel carro...
string carro;

...no podemos acess-la como Carro, CARRO, etc. O nico modo de acessla atravs de:
carro = 2;

Tipos de variveis
O Common Type System (CTS) define como os tipos so declarados, utilizados e gerenciados em tempo de execuo, e tambm uma parte importante do suporte do runtime de intregrao entre linguagens. O CTS realiza as seguintes funes: Estabelece um framework que auxilia a integrao entre linguagens, segurana de tipos, e alta performance de execuo de dados;

29

Apostila
Treinamento C#
Prov um modelo de orientao de objetos que suporta a implementao completa de muitas linguagens de programao. Define as regras que as linguagens devem seguir, o que ajuda a garantir que objetos escritos em diferentes linguagens possam interagir entre si. Os principais tipos existentes no C# esto contidos na tabela abaixo. Na tabela, os valores entre parnteses representam as classes bases do tipo. Quando no houver um valor entre parnteses, indica que o nome da classe o mesmo do nome do tipo do C#. Categoria Booleano Inteiro Tipo do C# Bool byte sbyte short (Int16) int (Int32) long (Int64) Alocao Memria Depende plataforma 1 byte 1 byte 2 bytes 4 bytes 8 bytes Range valores True ou False. 0 a 255 (sem sinal). -128 a 127 (com sinal). No compatvel com a CLS. -32.768 a 32.767 (com sinal). -2.147.483.648 a 2.147.483.647 (com sinal). -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 (com sinal). 0 a 65.535 (sem sinal). 0 a 4.294.967.295 (sem sinal). 0a 18.446.744.073.709.551.615 (sem sinal). -3.4028235x1038 a 1.401298x10-45 para valores negativos; 1.401298x10-45 a

ushort (UInt16) uint (UInt32) ulong (UInt64)

2 bytes 4 bytes 8 bytes

Ponto Flutuante

float

4 bytes

30

Apostila
Treinamento C#
3.4028235x1038 para valores positivos. decimal 16 bytes Um decimal de 128-bits, representando valores variando de 1.0x10-28 a 7.9x1028, com 28-29 dgitos significantes. 1.79769313486231570x10308 a 4.94065645841246544x10324 para valores negativos; 4.94065645841246544x10324 a 1.79769313486231570 x10308 para valores positivos. Outros char DateTime 2 bytes 8 bytes Um caracter unicode de 16bits. Um tipo que representa um valor de data e hora. Ele armazena os valores em incrementos de 100 nanosegundos de tempo passado desde 12:00 AM de 1/1/1 do calendrio Gregoriano. Um inteiro com sinal cujo tamanho varia de acordo com o sistema (32-bits em um plataforma 32-bits, e 64bits, em uma plataforma de 64-bits). Um inteiro sem sinal cujo tamanho varia de acordo com o sistema (32-bits em um plataforma 32-bits, e 64bits, em uma plataforma de 64-bits). No compatvel com CLS. 4-bytes em plataforma 32bits; 8-bytes em A raiz da hierarquia de objetos, qualquer tipo pode ser adicionado em um tipo objeto.

double

8 bytes

IntPtr

UIntPtr

Objetos

Object

31

Apostila
Treinamento C#
plataforma 64bits. string Varia Uma string de tamanho fixo de caracteres unicode.

Os tipos bsicos esto contidos na biblioteca System (veremos bibliotecas nos captulos seguintes).

Marcadores de bloco e finalizadores


No C#, o marcador de bloco so as chaves ( { e } ) e as sentenas so terminadas com ponto-e-vrgula. C#:
{ a = 10; b = 11; c = a + b; }

Smbolos e operadores lgico-aritmticos


Como pode ser observado no exemplo acima, o operador de atribuio do C# o sinal de igual. A tabela abaixo lista smbolos e operadores: Smbolo/operador Atribuio Igual (Comparao) Diferente (Comparao) And lgico Or lgico Not lgico Incremento C# = == != && || ! x++

32

Apostila
Treinamento C#
Decremento x--

If...else
No C#, a condio comparada sempre deve vir dentro de parnteses e, por isso, existe um delimitador que informa aonde comea uma condio e aonde ela termina. Assim sendo: C#:
if (x > 7) y = x 6; else { y = x; }

Laos While
O while, seguindo a mesma idia de colocar a condio dentro de parnteses: C#:
while (x > 7) x++;

Laos for
Os laos for nada mais so um lao while aonde possvel: declarar/inicializar uma varivel contadora; verificar uma condio de sada; incrementar/decrementar a varivel contadora.

Como exemplo de cada uma dessas funcionalidades, temos:


for (int i =0 ; i <= 10 ; i++)

Temos a uma inicializao (int i =0) e uma condio de parada (i <= 10), ao final de cada interao executado incremento (i++).

33

Apostila
Treinamento C#

Laos do...while
O lao do..while, vale para a mesma regra para a condio de loop do while: a condio deve estar entre parnteses. C#:
exit = false; do { a = a + 1; if (a > 99) exit = true; } while (! exit);

Switch..Case
A instruo Switch..Case do C#, agrega vrias comparaes simples, poupando o desenvolvedor de usar vrios if encadeados: C#:
switch (i) { case 1: Opcao = "1 prestao"; break; case 2: Opcao = "2 prestaes";break; case 3: Opcao = "3 prestaes";break; default Opcao = "Pagamento no ato";break; }

Algumas observaes importantes sobre o switch: todas as opes devem terminar com break ou goto; no possvel trabalhar com intervalos; o switch aceita usar strings no case.

Loop foreach
uma alternativa interessante e muito usada para iterar por listas, colees ou vetores: com o foreach no necessrio buscar dados de tamanho e ndice inicial para que possa ser feito um lao for trivial. O foreach se encarrega de controlar

34

Apostila
Treinamento C#
esses dados, deixando o desenvolvedor livre para implementar outras funcionalidade sem se preocupar com o controle desse loop. O exemplo abaixo ilustra o seu uso:

static void Main(string[] args) { foreach (string str in args) Console.WriteLine(str); }

A declarao static void Main usada em C# para indicar que aquela a funo a ser chamada quando o programa for iniciado. string[] args o vetor dos argumentos de linha de comando. A funo acima itera por cada argumento de string[] args. A cada iterao, o valor correspondente do vetor armazenado na varivel str e impressa na sada do console.

Vetores (arrays)
Os vetores no C# so declarados junto com a varivel e tm sempre ndice inicial zero. As diferentes formas de declarar so: C#:
int[] pontos; int[10] outrosPontos; int[,] plano;

Funes
No C# tanto procedures como functions so funes, e so diferenciadas pelo tipo do retorno: se forem void, as funes so tratadas como procedures, se tiverem qualquer outro tipo, so tratadas como functions. Por exemplo: C#:
void Executa(int codigo); double Calcula(int Codigo, double passo);

35

Apostila
Treinamento C#

Estrutura de um programa C#
No C# o desenvolvedor no fica restrito s reas de declarao: variveis e mtodos podem ser declarados ao longo do cdigo, e no em uma seo especfica. O desenvolvedor pode declarar no incio as variveis e se disciplinar para isso, mas a linguagem no o obriga a tal. A seo using do C#, deve vir sempre no incio do cdigo.
using System; public class MinhaClasse { public int MinhaFuncao(int Entrada); // s a assinatura, implementada abaixo public void MinhaProcedure() { // implementao } public int MinhaFuncao(int Entrada) { // implementao } }

Converso de tipos (cast)


No C# deve ser usada a notao abaixo para a conveso:
(<tipo de destino>) varivel

Sendo assim:
public int SomaInteiros(Double par1, par2) { return (int)par1 + (int)par2; }

Para converter para strings, pode ser usado o mtodo ToString:


public string SomaInteiros(Double par1, par2) { int soma soma; soma = (int)par1 + (int)par2 return soma.ToString(); }

36

Apostila
Treinamento C#

Strings
As Strings do .NET merecem ateno especial. As novas strings so Unicode, e ocupam 2 bytes a cada caractere. Ao concatenar uma string com outra, obtemos uma nova string. Por conta disso, o .NET foi aparelhado com a classe StringBuilder, contida na biblioteca System.Text. (falaremos mais sobre classes e bibliotecas nos prximos captulos). A classe StringBuilder deve sempre ser usada em casos na qual existam mltiplas concatenaes. Por exemplo:
StringBuilder sb = new StringBuilder(); string strFrase; sb.Append("A "); sb.Append("ligeira "); sb.Append("raposa "); sb.Append("marrom "); sb.Append("ataca "); sb.Append("o co preguioso."); strFrase = sb.ToString();
Nota

No C#, como j foi falado na seo de converses, todos os tipos implementam um mtodo chamado ToString. Este mtodo, quando executado, retorna o dado no formato de string, de acordo com o tratamento dado pelo tipo.
int var1 = 2; string str = var1.ToString(); // O mesmo que str = 2

Reviso
Vimos nesse captulo, as principais caractersticas na sintaxe da programao do C#. Iremos, nos captulos seguintes, nos aprofundar nos conceitos de Orientao a objetos.

37

Apostila
Treinamento C#

Captulo 5 Orientao a Objetos com C#


Objetivos
A linguagem C# foi criada a partir do zero no surgimento do .NET. A Microsoft optou por basear a sua nova linguagem nos conceitos de programao orientada a objetos (OOP), disponveis nas mais modernas linguagens de programao. O objetivo deste captulo apresentar alguns desses conceitos para o leitor (aplicados ao C#), para que seja possvel aproveitar ao mximo o potencial dessa linguagem. Conhecer a Orientao a Objetos uma das tarefas que qualquer desenvolver que ainda no conhece deve fazer. Apesar do C# no obrigar o desenvolvedor a programar usando OOP, ele estar limitando o seu potencial. O assunto de Orientao a Objetos, por si s, j valeria um livro exclusivo e dedicado. No est no escopo desta Apostila explicar em mincias as tcnicas de orientao a objetos, mas sim mostrar em linhas gerais o que e como empregada. A seguir veremos como so implementados os conceitos de OOP no Visual C#.

Viso Geral
A Orientao a Objetos foi criada em meados da dcada de 70, mas s se popularizou ao final da dcada de 90. A Orientao a Objetos um paradigma que aproxima o modo como enxergamos o mundo real com o modo de programarmos. A programao procedural, realizada at ento, tinha como foco a codificao de problemas em uma forma de script, com comeo, meio e fim determinados, contendo em seu interior desvios, loops e verificaes condicionais. J a Orientao a Objetos foca na estrutura dos objetos envolvidos no problema e sua relao entre eles. O cdigo procedural fica confinado internamente e altamente fragmentado em relao outra tecnologia.

38

Apostila
Treinamento C#
As maiores vantagens da Orientao a Objetos so: Um sistema OO bem projetado reduz significativamente o custo de manuteno e permite distribuir melhor os trabalhos por uma equipe. Permite melhor compreenso do problema por parte do programador e do analista de negcios. Torna mais fcil a reutilizao e a componentizao do cdigo.

H tambm desvantagens que devem ser levadas em conta: um novo paradigma a ser descoberto. Requer prtica para arquitetar solues.

Classes e Objetos
Classes so esqueletos ou plantas que especificam objetos. Objetos so entidades que representam entidades do mundo real. Um exemplo rotineiramente estudado em livros a classe Carro. Um carro pode ter caractersticas (como cor, nmero de portas, tipo de pneus, potncia do motor, etc) que chamaremos de atributos - e aes (acelerar, frear, abrir porta, acionar o limpador de pra-brisas, etc) que chamaremos de mtodos. Note que, apesar de terem valores diferentes (como, por exemplo, cor diferente), o conjunto de atributos e mtodos citados comum maioria dos automveis. Ou seja, existe um conjunto de caractersticas que define o que um carro, uma planta. A esse conjunto de caractersticas, damos o nome de classe. Quando os mecnicos da fbrica de automveis montam um carro (ou seja, fazem uma implementao fsica do que est contido no papel), ele deixa de ser apenas um modelo, apesar de ainda compartilhar caractersticas com outros carros. Ele passa a ser um objeto, algo fsico, no qual podemos entrar e andar por a. Em programao, quando criamos uma instncia de uma classe em memria, como se estivssemos utilizando a classe como planta para criar um objeto fsico.

39

Apostila
Treinamento C#
Voltando ao exemplo da classe carro, quando instanciamos em memria a classe, dando-lhe atributos como cor = verde, numeroDePortas = 4, tipoDePneus = asfaltoComum, etc, ela se tornou um objeto, que a instncia de uma classe. Vamos comear o nosso exemplo criando uma classe que representa uma porta:
class Porta { ... }

Agora que criamos a classe porta, como fazemos para criar um objeto do tipo Porta?
Porta porta = new Porta();

Com isso, temos que a varivel porta contm uma referncia para um novo objeto do tipo Porta. Nas sees seguintes, veremos como criar atributos, propriedades e mtodos em uma classe.

Atributos e Propriedades
Atributos so definidos em uma classe, e guardam valores ou referncias. Normalmente, so expressas por substantivos que representam os atributos. No C#, os atributos correspondem s variveis. Vamos mostrar o seu funcionamento atravs de mais um exemplo.
class Casa { Porta porta = new Porta(); ... }

O que temos aqui? Criamos uma nova classe Casa, e dentro dela adicionamos um atributo uma porta! Ou seja, toda casa que gerarmos a partir de nossa classe Casa ter uma porta mesmo que sejam portas diferentes. No C#, uma propriedade nada mais do que um tipo especial de varivel que deve ser lida/escrita atravs de acessores. Isso feito da seguinte forma:
Porta PortaEsquerda { get { return portaEsquerda; } set { portaEsquerda = value; } }

40

Apostila
Treinamento C#

Mtodos
Mtodos so as aes que so definidas na classe. Normalmente so expressas por verbos que representam operaes que a classe permite executar. Como exemplo, vamos implementar alguns mtodos em nossa classe Porta:
class Porta { string cor; bool fechada; bool trancada; void Abrir() { if (! trancada) { fechada = false; } } void Fechar() { if (! fechada) { fechada = true; } } void Trancar() { if (fechada) { trancada = true; } } void Destrancar() { trancada = false; } bool VerifTrancada() { return trancada; } void MudarCor(string novaCor) { cor = novaCor; } }

41

Apostila
Treinamento C#
Como pode ser visto no exemplo, existe uma nica forma para se declarar um mtodo:
[<acesso>] [<retorno>] <nome mtodo> ([<lista de parmetros>]) { ... }

Falaremos sobre nveis de acesso ainda neste captulo. A lista de parmetros deve obeceder seguinte estrutura:
[ref|out] <tipo> <nome parmetro> [, <lista de parmetros>]

A palavra chave ref, indica que o parmetro ser passado por referncia. Um argumento passado por referncia precisa antes de tudo ser inicializado. J a palavra chave out, indica que esse parmetro um parmetro de sada o seu valor no ser utilizado no cdigo. Para facilitar a compreenso das diferenas entre passar um valor por parmetro ou por referncias, veremos o exemplo de um mtodo que recebe o comprimento e a largura, e retorna a rea do quadrado:
double CalculaArea( double comprimento, double largura ) { // Declarando variveis locais. double area; if( comprimento == 0 || largura == 0 ) { // Se um argumento = 0, no d para calcular a rea. area = 0; } else { // Calcula a rea do retangulo. area = comprimento * largura; } return area; }

New Keyword
No C# quando queremos declarar uma varivel que aponta para uma classe fazemos da seguinte forma:
Util util;

42

Apostila
Treinamento C#
...e quando queremos inicializar a nossa varivel com uma nova instncia, utilizamos palavra chave New:
util = new Util();

Por fim, todas as classes herdam de Object.

Construtores e Destrutores
E se voc precisar criar uma classe que, durante a inicializao de um novo objeto, precise executar algum cdigo? Ou precisar rodar comandos de limpeza, antes de o objeto ser destrudo? No C#, como no Delphi, existe o conceito de contrutores e destrutores. Um construtor acionado, caso exista, quando utilizamos palavra chave New:
util = new Util();

Vamos ver um exemplo. Imagine novamente o caso da porta:


class Porta { string cor; bool fechada; bool trancada; ... }

Vamos agora imaginar que gostaramos de ter uma classe Porta que permitisse que, em sua inicializao, fossem atribudos valores s propriedades fechada e trancada. Para isso, vamos utilizar um construtor. O formato da declarao do construtor semelhante declarao de um mtodo, com a diferena que no aceita tipo de retorno e que deve possuir o mesmo nome da classe. Assim sendo, em nosso caso teramos:
Porta( bool fechada, bool trancada ) { if( fechada ) { Fechar(); } else { Abrir(); }

43

Apostila
Treinamento C#
if (trancada) { Trancar(); } else { Destrancar(); } }

Quando um objeto no mais necessrio, o Garbage Collector chama o mtodo Finalize para aquele objeto antes de liberar a memria. O mtodo Finalize chamado destrutor, porque ele realiza tarefas de limpeza, tais como gravar informao de estado, fechar arquivos e conexes com bancos de dados, alm de outras tarefas que precisam ser feitas antes de liberar o objeto. No C#, os destrutores no podem ser chamados eles so disparados automaticamente pelo GC. Entretanto, devido caracterstica no-determinstica do GC, no possvel saber exatamente quando o destrutor ser acionado. Vamos agora utilizar um destrutor para mudar o valor das variveis fechada e trancada para false, antes de podermos destruir esse objeto da memria.
~Porta() { trancada = false; fechada = false; }

Lab: Trabalhando com Classes


Vamos trabalhar com classes. Abra o Visual Studio 2005. Abra o projeto WindowsApplicationCS que criamos anteriormente. Remova o boto Hello World, e adicione 6 botes: (Name) btnAbrePortaEsquerda Text Abre Esq.

btnFechaPortaEsquerda Fecha Esq. btnAbrePortaDireita btnFechaPortaDireita Abre Dir. Fecha Dir.

44

Apostila
Treinamento C#
btnAcelera btnFreia Acelera Freia

Agora, adicione 3 controles Label, com os seguintes textos: Porta Esquerda: Porta Direita: Velocidade:

Por fim, adicione mais 3 controles do tipo Label, com os seguintes IDs: lblPortaEsquerda lblPortaDireita lblVelocidade

Voc deve ter algo do gnero:

Agora que a parte grfica de nossa aplicao est pronta, vamos implementar o cdigo. Adicione ao seu projeto uma classe Porta (clique com o boto direito no seu projeto, e selecione Add>New Item, selecione Class, e d o nome Porta.cs). Em sua classe, implemente: Atributo fechada indica se a porta est fechada; Atributo trancada indica se a porta est trancada;

45

Apostila
Treinamento C#
Mtodo Abrir permite a abertura da porta; Mtodo Fechar permite o fechamento da porta; Mtodo Trancar permite trancar a porta, caso esta esteja fechada; Mtodo Destrancar destranca a porta, caso esteja trancada; Mtodo VerifFechada retorna indicador se a porta est ou no fechada; Mtodo VerifTrancada retorna indicador se a porta est ou no trancada; Construtor recebe como parmetro se a porta est fechada e trancada. At este momento, o cdigo utilizado idntico ao dos nossos exemplos. Vamos agora mudar um pouco. Crie uma nova classe, chamada Carro. Como todo carro tem pelo menos 2 portas, iremos adicionar ao nosso carro 2 atributos do tipo Porta (j criado no comeo desse lab), e cham-los de portaEsquerda e portaDireita. Adicione tambm um atributo chamado velocidade, que deve ser capaz de receber um valor inteiro. No construtor da classe, inicialize ambas as portas como abertas e destrancadas, e a velocidade em 0. Agora, crie 2 propriedades, PortaEsquerda e PortaDireita, que iro prover acesso aos atributos respectivos. Por fim, iremos adicionar os seguintes mtodos: Acelera(valor) Aumenta velocidade do carro, em incrementos de 10, at 180 Km/hora. Se passar de 180, atribui 180 e retorna um indicador, indicando que a velocidade mxima foi atingida. Freia(valor) Diminui a velocidade do carro em valor, em decrementos de 10, chegando ao mnimo de 0. Se for menor que 0, retorna um indicador que o carro j est parado.

46

Apostila
Treinamento C#
VelocidadeAtual() Retorna um inteiro, indicando a velocidade atual do carro. Grave as alteraes. Nesse ponto, o nosso cdigo est pronto. Vamos agora ligar o formulrio com o cdigo. Clique 2 vezes sobre o formulrio, em uma regio aonde no haja nenhum boto ou label. O Visual Studio ir abrir o modo de cdigo, e criar automaticamente um evento Form1_Load. Esse evento ser executado antes do Form ser mostrado para o usurio. Entretanto, como queremos definir o carro como global, precisamos declar-lo fora do mtodo. Ento, logo acima da declarao do Form1_Load, declare e inicialize uma varivel do tipo Carro. Agora, crie um mtodo chamado ShowResults, que ir atualizar as labels lblPortaEsquerda, lblPortaDireita e lblVelocidade com os valores corretos. No evento Form1_Load, execute o mtodo ShowResults. Volte agora para o modo de exibio. Clique em cada um dos botes, e implemente a lgica correspondente. No se esquea de chamar o mtodo ShowResults, para atualizar os dados na tela para o usurio. Por fim, caso a velocidade caia abaixo de 0, ou passe do limite, mostre uma mensagem na tela para o usurio. A soluo para este laboratrio est contida no CD.

Nveis de Acesso e Visibilidade


Existem propriedades e mtodos que, de alguma forma, devem ficar restritos classe. Por exemplo, flags que mostram se a porta est trancada ou destrancada podem ficar ocultos ao exterior, e um usurio usaria uma funo VerifTrancada() para saber se a porta est trancada (se a funo retornar True) ou se ela est destrancada (se a funo retornar False). Para isso, encapsula-se partes do contedo de forma a permitir que outras classes enxerguem propriedades e mtodos. Fazemos isso atravs do controle dos nveis de acesso.

47

Apostila
Treinamento C#
O nvel de acesso de um elemento determina que cdigo possui permisso para ler e executar o elemento. Cdigo que no pode acessar um elemento, no pode acessar qualquer elemento contido dentro dele, mesmo que os elementos internos tenham um nvel de permisso maior do que o elemento externo. Public O nvel de acesso Public especifica que o elemento acessvel a partir de qualquer lugar dentro do mesmo projeto, de outros projetos que referenciam o projeto que o contm, ou de qualquer assembly construdo a partir do projeto. Exemplo:
public class Porta

Private O nvel de acesso Private especifica que os elementos somente so acessveis dentro do mesmo contexto (mdulo, classe ou estrutura) no qual foram declarados. Exemplo:
private string cor;

Protected Voc s pode utilizar Protected em nvel de Classe (dentro de uma). Protected especifica que o elemento acessvel apenas dentro da prpria classe, ou por classes derivadas desta.
public class Ambiente { protected class Animal { ... } protected class Leo : Animal { ... } }

A classe derivada de uma outra classe deve possuir um nvel de acesso menor ou igual classe pai.

48

Apostila
Treinamento C#
Internal O nvel de acesso Internal especifica que os elementos sero acessveis de dentro do mesmo Assembly, mas no fora dele. Um exemplo de declarao:
internal string mensagem;

Protected Internal possvel utilizar ambos os nveis de acesso Protected e Internal juntos em uma declarao para especificar que um elemento acessvel ou de classes derivadas, ou de dentro do mesmo assembly.
protected internal string mensagem;

Resumo dos Nveis Acesso Nvel de acesso Public

Elementos a que se aplica

Contexto Arquivo; Namespace; Interface; Mdulo; Classe; Estrutura.

Qualquer cdigo que pode Interfaces; Mdulos; Classes; visualizar um elemento Estruturas; Propriedades; Atributos pblico pode acess-lo. (internos); Constantes; Enums; Eventos; Declaraes Externas; Delegates. Cdigo dentro do mesmo contexto pode acessar.

Private

Interfaces; Mdulos; Classes; Mdulo; Classe; Estruturas; Propriedades; Atributos Estrutura. (internos); Constantes; Enums; Eventos; Declaraes Externas; Delegates. Interfaces; Classes; Estruturas; Propriedades; Atributos (internos); Constantes; Enums; Eventos; Declaraes Externas; Delegates. Interfaces; Mdulos; Classes; Estruturas; Propriedades; Atributos (internos); Constantes; Enums; Eventos; Declaraes Externas; Delegates. Interfaces; Classes; Estruturas; Propriedades; Atributos (internos); Constantes; Enums; Eventos; Declaraes Externas; Delegates. Classe.

Protected Cdigo dentro da classe, ou de uma classe que herda desta podem acessar. Internal Cdigo dentro do mesmo assembly.

Arquivo; Namespace; Interface; Mdulo; Classe; Estrutura. Classe.

Protected Cdigo dentro da mesma Internal classe ou mesmo assembly, ou qualquer classe derivada da classe aonde o elemento est contido.

49

Apostila
Treinamento C#

Encapsulamento
Existem atributos e mtodos que, de alguma forma, devem ficar restritos classe. Por exemplo, flags que mostram se a porta est trancada ou destrancada podem ficar ocultos ao exterior, e um usurio usaria uma funo VerifTrancada() para saber se a porta est trancada (se a funo retornar True) ou se ela est destrancada (se a funo retornar False). Para isso, encapsula-se partes do contedo de forma a permitir que outras classes enxerguem propriedades e mtodos. Fazemos isso, controlando os nveis de acesso.

Notao UML
A notao UML (de Unified Modeling Language) um conjunto de diagramas que permitem que um analista especifique um sistema usando modelos-padro adotados pelo mercado. No escopo deste curso explicar cada um dos diagramas e seus componentes (isso tarefa para um curso de pelo menos 40 horas !), mas convm aqui mostrar como uma classe mostrada em um diagrama de classes, que comumente visto na literatura:
Porta +cor : Integer -tipoTrinco : String #fechada : Boolean #trancada : Boolean +Abrir() +Fechar() +Trancar() +Destrancar() +VerifTrancada() : Boolean

Esse desenho corresponde representao UML da classe abaixo:


public class Porta { public int cor; private string tipoTrinco; protected bool fechada; protected bool trancada; public void Abrir() { if (! trancada) { fechada = false; }

50

Apostila
Treinamento C#
} public void Fechar() { if (! fechada) { fechada = true; } } public void Trancar() { if (fechada) { trancada = true; } } public void Destrancar() { trancada = false; } public bool VerifTrancada() { return trancada; } }

Na notao UML, uma classe representada por um retngulo dividido em trs partes. Na parte superior, ficam o nome da classe. Na parte central, as propriedades, na parte inferior, as aes. Propriedades e mtodos pblicos so indicados com um sinal de (+) na frente do nome. Propriedades e mtodos privados so representados com um sinal de (-) na frente do nome. Por fim, propriedades e mtodos protected so representados com um sinal de (#).

Herana
O conceito de herana largamente utilizado na orientao a objetos. Atravs desse conceito, uma classe pode herdar o que j especificado em outra classe. Diz-se ento que uma classe-filha est herdando de uma classe-pai ou uma superclasse. Vamos supor que estamos desenvolvendo um sistema para uma empresa que comercializa portas de todos os tipos e formas. Existem atributos e aes que so especficas de qualquer porta: - atributos: material, cor, tipo de fechadura, tipo de trinco, altura, largura, profundidade, peso, etc;

51

Apostila
Treinamento C#
- aes: abrir, fechar, trancar, destrancar, etc. Essa classe atende boa parte das portar que a empresa comercializa. Mas existem tipos de portas especiais que, alm de terem as mesmas caractersticas da classe Porta, adicionam outras caractersticas novas. Mais ainda, existem portas que precisam de procedimentos modificados. Um exemplo a porta de cofre. A porta de cofre, alm de ter as caractersticas de uma porta tradicional, ainda precisa de um segredo para ser aberta junto com a chave e o trinco. Ao invs de reescrever uma classe PortaDeCofre inteira, o mais fcil fazer com que essa classe herde todas as caractersticas de Porta, mas adicione algumas propriedades e que sobrescreva a implementao de Destrancar(), uma vez que essa porta em especial precisa tratar tambm do segredo do cofre. O diagrama UML ficaria assim:

P o rta + c o r : In te g e r - t ip o T r in c o : S t r in g # fe c h a d a : B o o le a n # tr a n c a d a : B o o le a n + A b r ir ( ) + F e c h a r() + T ra n c a r() + D e s tr a n c a r () + V e r ifT r a n c a d a ( ) : B o o le a n

P o rta D e C o fre -S e g re d o + D e s tr a n c a r ()

Dessa forma, ao criarmos uma instncia de PortaDeCofre, se chamssemos PortaDeCofre.Abrir() ou PortaDeCofre.cor, no seria gerado erro: uma vez que PordaDeCofre herda de Porta, ao ser instanciado criada uma rea na memria com todo o contedo de porta e mais o contedo de PortaDeCrofre.

52

Apostila
Treinamento C#
A implementao de herana no VB.NET feita atravs da palavra-chave Inherits. O cdigo que representaria uma porta de cofre ficaria ento:
public class PortaDeCofre : Porta

importante notar que, no .NET, uma classe s pode herdar de 1 nica classe (existem algumas linguagens de programao que permitem o que chamado herana mltipla). Entretanto quando uma classe herda de outra, como se ela herdasse tambm de todas as classes pai da classe pai dela. Ou seja, quando temos algo como:
public class Animal {} public class Mamifero : Animal { } public class Leao : Mamfero { }

A classe Leao acaba herdando da classe Animal indiretamente, na medida em que todo Leo um Mamfero, e todo Mamfero um Animal. Todas as classes, em algum nvel, herdam do tipo Object, o tipo mais bsico do CTS. Quando no declaramos uma classe pai para a nossa classe, o compilador automaticamente faz com que a nossa classe herde de Object. Classe Abstrata e Classe Selada Uma classe abstrata uma classe que no pode ser instanciada ela criada com o nico propsito de servir de pai para outras classes. Ou seja, voc no pode criar uma declarao usando New com uma classe do tipo abstrata. No C#, o modificador abstract implementa uma classe abstrata:
public abstract class MinhaClasse { }

Uma classe abstrata pode conter mtodos abstratos ou no. Entretanto, uma classe no abstrata no pode conter mtodos abstratos. Alm do conceito de classe abstrata, existe tambm o conceito de classe selada. Uma classe selada uma classe que no pode ser herdada ou seja, nenhuma classe pode derivar dela. O C# implementa classes seladas atravs do modificador NotInheritable:

53

Apostila
Treinamento C#
public sealed class MinhaClasse { }

Sobrescrita de Mtodos
Sobrescrevermos um mtodo quando queremos substituir o mtodo original por uma outra implementao, especfica de uma classe filha. No C#, temos duas opes para sobrescrever um mtodo: usando a palavra chave new, ou usando a palavra chave override. A diferena entre os dois mtodos que no primeiro caso, estamos criando um novo mtodo com o mesmo nome e escondendo o membro original. Esse o comportamento padro, ou seja, no necessrio usar a palavra chave new, mas o compilador ir disparar um aviso, indicando a necessidade do new. J no segundo caso, estamos estendendo a implementao para um membro herdado. Para que isso seja possvel, na declarao original do mtodo precisamos definir o mtodo com um dos seguintes modificadores: abstract, virtual ou override (o modificador virtual define apenas que uma classe pode ser sobrescrita). No nosso exemplo da classe Porta, podemos sobrescrever o mtodo Destrancar(), uma vez que PortaDeCofre s pode ser aberta se o segredo que o usurio inseriu for o correto. Nosso mtodo, na classe PortaDeCofre, ficaria ento:
public override void Destrancar() { if (segredo == "cges") { base.Destrancar(); } }

Enquanto na classe Porta temos:


public virtual void Destrancar() { trancada = false; }

Note que usamos a instruo override para declarar que Destrancar() sobrescreve a implementao desse mtodo.

54

Apostila
Treinamento C#

Sobrecarga de Mtodos
Fazemos uma sobrecarga quando precisamos implementar um mtodo que deve receber um conjunto diferente de parmetros. No nosso exemplo, podemos escrever um mtodo para abrir a porta, mas passando como parmetro o segredo da porta. O usurio ento teria outra opo para poder abrir a porta: ou ele atribui um valor propriedade Segredo e chama Destrancar(), ou ento ele chama Destrancar passando o segredo:
public void Destrancar(string segredo) { this.segredo = segredo; Destrancar(); }

Como possvel visualizar abaixo, quando voc acessa um mtodo que possui sobrecarga, mostrado ao desenvolvedor uma lista, com todos as possveis chamadas deste mtodo.

Acessando a classe pai base e this H situaes em que sobrescrevemos ou ocultamos membros da classe-pai. Como podemos indicar em nosso cdigo se mtodo que queremos usar o membro original (da classe-pai) ou a especializao (da classe filha)? Quando estamos dentro de uma classe, o comando this permite indicar que usaremos o membro da classe em que estamos, e o comando base permite usar o membro a partir da classe-pai da qual estamos herdando.

Polimorfismo
Vamos agora voltar a falar um pouco mais sobre classes.

55

Apostila
Treinamento C#
Quando falamos sobre sobrecarga de mtodos, definimos uma classe filha da classe Porta a classe PortaDeCofre. Alm disso, mostramos como era possvel classe filha sobrescrever um mtodo da classe pai: Classe PortaDeCofre:
public override void Destrancar() { if (segredo == "cges") { base.Destrancar(); } }

Classe Porta:
public virtual void Destrancar() { trancada = false; }

O que tudo isso de herana implica? Implica que a classe PortaDeCofre corresponde a um subgrupo do tipo Porta, e como tal possui caractersticas em comum com outras classes de porta (como PortaDeVidro). Quando estamos falando genericamente sobre Portas, uma PortaDeCofre pode ser usada como Porta. A esse conceito, d-se o nome de Polimorfismo a capacidade de uma classe filha se passar por uma classe pai mesmo que, internamente, tenha mecanismos diferentes de funcionamento. Por exemplo, podemos declarar uma varivel da seguinte forma:

No exemplo acima, vemos como uma varivel do tipo Porta pode receber uma varivel do tipo PortaDeCofre. Entretanto, nesse momento todas as caractersticas

56

Apostila
Treinamento C#
externas que diferenciam um PortaDeCofre de uma Porta ficam ocultas afinal, no estamos trabalhando com uma PortaDeCofre, mas com uma Porta! Entretanto, quando sobrescrevemos um mtodo, a classe filha passa a ter um funcionamento diferente da classe pai. O que ir ocorrer nesse caso? Se pensarmos novamente na Porta e na PortaDeCofre, vemos que ambas funcionam de forma diferente. Como o funcionamento de uma Porta diferente do funcionamento de uma PortaDeCofre, quando chamarmos o mtodo Destrancar() estaremos chamando o mtodo da classe especializada (PortaDeCofre), ao invs do mtodo da classe pai. Apenas se a classe filha no tiver alterado a implementao, que ser chamado o mtodo da classe pai.

Lab: Trabalhando com Herana


Vamos agora criar uma classe que represente um carro esportivo. Um carro esportivo corre muito mais rpido que um carro normal, mas ainda tem 2 portas. Abra a soluo WindowsApplicationCS, desenvolvida anteriormente. Adicione uma nova classe CarroEsportivo. Essa nova classe deve herdar da classe Carro. Na classe Carro, transforme a propriedade velocidade de private para protected, de forma que seja possvel alterar o seu valor a partir da classe filha. Sobrescreva o mtodo Acelera, para permitir ao condutor acelerar at 250 Km/hora, e substitua a chamada para a classe Carro, por uma chamada classe CarroEsportivo. Rode a sua aplicao e verifique o que acontece quando voc acelera seu carro acima de 180 km/hora. Para ver a resposta do exerccio, abra o Lab Trabalhando com Herana, do CD.

Interface
Interfaces, como classes, definem um pacote de propriedades e mtodos. Entretanto, diferentemente de classes, interfaces no provm implementao. Uma interface funciona como um contrato, no qual a classe que a implementa precisa implementar todos os aspectos definidos pela interface exatamente como definida.

57

Apostila
Treinamento C#
A grande vantagem de interfaces, que apesar de uma classe s poder herdar de uma nica classe, ela pode implementar inmeras interfaces diferentes.
public interface IPessoa { public string GetNome(); }

public class PessoaFisica : IPessoa { private string nome; public string GetNome() { return nome; } ... }

Mtodos, Atributos e Propriedades Estticas


Uma propriedade, um atributo ou um mtodo esttico podem ser vistos como uma caracterstica da classe e no do objeto. O que isso significa? Lembra-se de quando falamos que, quando declaramos um objeto usando a palavra-chave New, estamos alocando um espao na memria onde os dados do objeto ficaro alocados? Um atributo esttico no fica armazenado nesse espao, mas sim fica armazenado junto com a definio da classe. Isso significa que, todos os objetos criados a partir da classe iro acessar o mesmo dado. Vamos considerar, como exemplo, a classe ContadorAcessos abaixo:
public class ContadorAcessos { public int conta = 0; public void SomaUm() { conta++; } public int Total() { return conta; } }

Vamos agora utiliza a nossa classe:

58

Apostila
Treinamento C#
ContadorAcessos contador1 = New ContadorAcessos(); ContadorAcessos contador2 = New ContadorAcessos(); contador1.SomaUm(); contador1.SomaUm(); contador2.SomaUm(); MessageBox.Show( contador2.Total().ToString() );

Qual ser o resultado? 1. Agora, se modificarmos um pouco a nossa classe:


public class ContadorAcessos { public static int conta = 0; public void SomaUm() { conta++; } public int Total() { return conta; } }

O que teremos como resultado? 3. Alm disso, outra propriedade de atributos, mtodos e propriedades estticas que no necessrio declarar uma instncia da classe para podermos acess-los. Podemos acess-los diretamente a partir do nome da classe, como em:

Como exemplo de um mtodo esttico no .NET, podemos citar o j mostrado mtodo Show(), da classe MessageBox.

Classes Parciais
O C# permite que uma classe seja declarada ao longo de vrios arquivos. Isso vantajoso em trabalho em equipe, j que programadores podem trabalhar em fragmentos da classe em arquivos separados. Quando o compilador for chamado, ele mesmo se encarregar de juntar as partes de uma classe e produzir uma classe apenas.

59

Apostila
Treinamento C#
A classe original deve ser implementada normalmente. Entretando, durante a declarao da classe parcial, basta declar-la adicionando a palavra chave Partial:
public partial class ....

Reviso
Vimos neste captulo um pouco sobre os conceitos de programao orientada a objetos, e como esses conceitos so implementados na prtica no C#. Nos captulos seguintes, trataremos de conceitos mais avanados de programao.

60

Apostila
Treinamento C#

Captulo 6 Tpicos Avanados


Objetivos
O objetivo deste captulo introduzir ao leitor tpicos mais avanados de programao no Visual C# 2.0. Falaremos sobre como classes so agrupadas em namespaces e sobre como fazemos quando precisamos acessar classes contidas em outros projetos. Ainda neste captulo, falaremos sobre as bibliotecas que j vem junto com o framework, e encapsulam funes rotineiras. Por fim, completamos falando sobre tratamento de erros no .NET.

Namespaces
Para melhor organizar o contedo, as classes podem ser agrupadas em namespaces. Namespaces so unidades lgicas de cdigos que agregam classes que possuem um assunto em comum (que podem ser agrupadas juntas). Os namespaces podem ser mais bem entendidos, se o compararmos a caminhos de diretrios. Quando queremos, em uma mquina Windows, acessar o Notepad.exe, o caminho que usamos : c:\windows\notepad.exe. Analogamente, se precisamos acessar uma classe que copia um arquivo, usamos: System.IO.File.Copy(). O caminho aqui demonstrado lido da seguinte forma: a classe Copy(), que est dentro do namespace System, dentro de IO e dentro de File. bom diferenciarmos aqui um namespace de um assembly. Quando compilamos um projeto, todo o cdigo fonte daquele projeto compilado e transformado em 1 nico arquivo (que pode ser um .EXE ou um .DLL, dependendo do tipo do projeto), ou assembly. Em geral, um projeto possui um namespace nico e distinto. Entretanto, um namespace no obrigatoriamente deve estar restrito a um nico assembly. Podemos ter mais duas classes diferentes, em dois projetos diferentes, que pertenam a um nico namespace. Alm disso, em um mesmo projeto podemos ter a definio de classes de namespaces distintos.

61

Apostila
Treinamento C#
As produtoras de software costumam usar essa notao para criar seus prprios namespaces. So exemplos: empresa.utils, empresa.sistema1.calculo, e assim por diante. Aqui surgem algumas dvidas. A primeira delas se refere a como fazemos com que a nossa classe pertena a um namespace? Por default, todas as classes que pertencem a um projeto pertencem a um mesmo namespace, que voc pode definir clicando em My Project, na tab Application. O namespace raiz do seu projeto fica definido em Root Namespace (alguns tipos de projetos no possuem essa opo como projetos do Office). Por default, esse namespace possui o mesmo nome do projeto.

Existem 2 modos de alterar o namespace de uma classe. A primeira, delas alterar o contedo do Root Namespace. Isso far com que todas as classes de seu projeto que forem criadas a partir de agora passem a usar este como namespace. Entretanto, podemos querer especificar o namespace no nvel da classe. Alm disso, quando alteramos o valor aqui no estamos alterando o valor das classes j criadas. Como fazer isso? Atravs do comando Namespace.

62

Apostila
Treinamento C#
namespace WindowsApplicationCS.Carros { public class Carro { ... } }

No exemplo acima, definimos que a classe Carro pertence ao namespace WindowsApplicationCS.Carros. Essa classe agora s estar automaticamente visvel para as classes que pertenam ao mesmo projeto e ao mesmo namespace. E agora, como fazemos para que as outras classes enxerguem essa classe? Fazemos isso adicionando o namespace lista de namespaces referenciados, usando o comando using:

Com isso, a partir de agora essa classe possui acesso aos elementos desse namespace. Outro uso para Using Alm da forma indicada acima, existe outro modo de utilizar o comando Using. Poderamos utilizar o comando:
using Car = WindowsApplicationCS.Carros;

Para declarar que, a partir de agora, quando nos referirmos a Car, estamos apontando para o namespace WindowsApplicationCS.Carros. O impacto disso que, a partir deste momento, as referncias:
Car.Carro carro = new Car.Carro(); WindowsApplicationCS.Carros.Carro carro = new WindowsApplicationCS.Carros.Carro();

So idnticas!

63

Apostila
Treinamento C#

Referncias
Vimos, na sesso anterior, como fazemos para referenciar uma classe que est em um outro namespace. E se a classe no estiver apenas em um outro namespace, mas sim em outro projeto, ou em uma biblioteca externa (como as bibliotecas do .NET)? Para fazer com que o seu projeto tenha uma referncia para outro, clique com o boto direito em cima do objeto References contido no projeto e selecione Add Reference....

Nessa tela, voc ver a lista de referncias guardadas pelo seu projeto. Quando voc clica no boto Add..., aberta a janela Add Reference.

Aonde voc tem as seguintes tabs: .NET Aqui voc tem acesso a todas as bibliotecas do .NET, alm de bibliotecas de componentes registradas por terceiros no respositrio de bibliotecas do .NET (tambm chamado Global Assembly Cache ou GAC);

64

Apostila
Treinamento C#
COM Nesta tab, voc tem acesso aos componentes registrados no COM+. Quando voc adiciona uma referncia a uma biblioteca do COM+, o Visual Studio automaticamente gera cdigo que encapsula o acesso ao componente, para que seja transparente para o desenvolvedor esse acesso; Projects Aqui, voc pode dizer que um projeto aponta para outro contido na mesma soluo. Isso significa que o projeto que referencia outro sempre compilado depois, e quando o projeto referenciado compilado, o Visual Studio faz uma cpia do assembly gerado para a pasta de recursos do projeto; Browse Nesta janela voc pode procurar uma biblioteca. utilizada quando voc vai referenciar componentes que no foram registrados nem no GAC, nem no COM+, e tambm no fazem parte da sua soluo; Recent Contm uma lista dos projetos mais recentemente adicionados a qualquer projeto. Todas as opes mostram listas de componentes. Basta selecionar um componente da lista desejada, e clicar em OK. A partir de agora, o projeto j referencia a biblioteca.

Lab: Trabalhando com Namespace e Referncias


Vamos agora verificar como trabalhar com namespaces e referncias. Para ilustrar o desenvolvimento, vamos extrair as classes Porta, Carro e CarroEsportivo do projeto WindowsApplicationCS, criar um projeto do tipo biblioteca de classes, colar as classes nessa biblioteca, e fazer o nosso projeto apontar para essa biblioteca. Abra a soluo WindowsApplicationCS. Clique com o boto direito em cima do nome da soluo, e selecione Add > New Project.

65

Apostila
Treinamento C#

Selecione o projeto Class Library, e d o nome de ClassesDeNegocio. Deixe que o projeto fique na mesma estrutura da soluo, e clique em OK. Verifique que um novo projeto foi adicionado sua soluo:

Agora, clique com o boto direito na Class1.cs e remova a mesma da aplicao. Arraste as suas 3 classes (Carro, CarroEsportivo e Porta) para o novo projeto, e remova-os da classe original. Abra cada uma das classes e altere o Namespace para ClassesDeNegocio. Tente compilar novamente a sua soluo. Voc receber a seguinte mensagem de erro:

66

Apostila
Treinamento C#
Esse erro ocorre porque o seu projeto WindowsApplicationCS no sabe aonde encontrar a classe CarroEsportivo. Vamos agora resolver o problemas, adicionando a referncia correta. Clique com o boto direito em References do projeto WindowsApplicationCS, e selecione Add Reference. Na janela que se abre, selecione a tab Projects, e o projeto ClassesDeNegocio. Compile sua aplicao e veja o resultado. Engraado, agora que eu apontei para a biblioteca correta deveria ter funcionado, no ? A resposta no. Eu disse apenas para o .NET incluir a biblioteca quando for compilar o projeto, mas eu no disse para a minha classe para buscar dentro do namespace dessa classe as bibliotecas que forem necessrias. No seu form, adicione o seguinte Namespace:
using ClassesDeNegocio;

Rode agora o seu projeto e voc ver que a compilao funcionou. Teste a aplicao, para garantir que ela faa tudo exatamente como fazia antes. O resultado desse lab est contido no CD em anexo.

Bibliotecas do Framework .NET 2.0


Quando falamos sobre o Framework .NET, dissemos que existe uma Base Class Library (BCL) que j vem com diversas classes prontas para serem utilizadas no .NET, que desempenham rotinas comumente utilizadas, e que podem ser utilizadas independentemente da linguagem que estivermos utilizando, desde que esta se baseie sobre o Framework. Nesta seo falaremos um pouco sobre as bibliotecas mais utilizadas. O namespace System O namespace System ande reside a maior parte do Framework .NET. Ele est contido em System.dll no GAC. Entretanto, o Visual Studio j adiciona a referncia a esta biblioteca automaticamente, independente do projeto. Na raiz de System esto os tipos bsicos do .NET, como System.String, System.Integer, System.Double.

67

Apostila
Treinamento C#
Nota

Embora String, Integer, Double, Single e outros tipos numricos sejam primordialmente vistos como simples variveis, o .NET pode enxerg-los tambm como objetos. Para que uma simples soma de dois inteiros no seja uma tarefa de uso intensivo de recursos, o .NET se vale de uma tcnica chamada boxing e unboxing. Sempre que criamos uma varivel, a ela atribudo um valor e suas operaes so feitas em pilha. Dizemos ento que usamos um tipo valor. Se desejarmos usar algum recurso o objeto System.Int32, o .NET ento realiza o boxing e passa a tratar a varivel como um tipo referncia. Caso voltemos a fazer operaes simples, o .NET realiza o unboxing, e a varivel passa a ser um tipo valor.

Em System tambm esto classes que agregam mtodos de uma funcionalidade especfica. A classe System.Math, por exemplo, contm mtodos matemticos, como Sin, Cos, Round. A classe System.Console contm mtodos para entrada/sada na console como WriteLine e ReadLine. O namespace System.Text No namespace System.Text esto agrupadas as classes especficas para tratamento de textos. Esse namespace tambm est contido dentro da bibliote System.dll. A classe mais usada a StringBuilder, que fornece uma maneira muito mais eficiente de fazer concatenao de vrias strings. Dentro de System.Text h um outro namespace, de grande importncia para programadores: o System.Text.RegularExpressions, que permite pesquisa, troca e quebra de strings segundo critrios de expresses regulares. O namespace System.Collections O namespace System.Collections contm classes prontas para tratamento de estruturas de dados. Esse namespace tambm est contido dentro da bibliote System.dll. Essas estruturas contm mtodos prontos para adio, remoo e busca interna e so ferramentas essenciais para programadores. So elas: Stack (pilha), com funcionalidade LIFO (ltimo a entrar, primeiro a sair);

68

Apostila
Treinamento C#
Queue (file), com funcionalidade FIFO (primeiro a entrar, primeiro a sair); ArrayList, um array com mtodos de inserir/apagar itens em operaes simples. Seus itens so acessados com ndices, de modo similar a um array. A sua grande vantagem a flexibilidade quando no se sabe a quantidade de elementos ou quando essa quantidade varia muito, tornando o ReDim usual, o que custoso em termos de desempenho da aplicao; HashTable, que permite o uso de dados do tipo chave=valor, de modo similar ao que encontramos em arquivos INI. Seus itens so acessados atravs de chave. Esta estrutura de dados comum e necessria em muitas aplicaes e a sua funcionalidade vai adiantar muitas horas de programao e correo de bugs; SortedList, que rene as caractersticas de um ArrayList e um HashTable. Seus itens so ordenados de acordo com a chave e podem ser acessados atravs do ndice ou de sua chave. Trabalhando com HashTables Conforme falado, a HashTable uma estrutura para tratar dados do tipo chave=valor, assim como podia ser visto em arquivos INI. O exemplo abaixo demonstra uma classe com um mtodo que preenche uma HashTable (Preenche) e outra que realiza uma busca por uma chave (ObtemValor), retornando uma string vazia se no for encontrada ou ento o valor relacionado se a chave no existir.
public class DemoHashTable { Hashtable hs = new Hashtable(); public DemoHashTable() { Preenche(); } private void Preenche(){ hs.Add("Nome", "Jos"); hs.Add("Sobrenome", "da Silva"); hs.Add("Endereo", "Rua das rvores, 14"); hs.Add("Cidade", "Fernandpolis"); } public string ObtemValor(string chave){

69

Apostila
Treinamento C#
string str = ""; if (hs.Contains(chave)) str = hs[chave].ToString(); return str; } }

O namespace System.IO O namespace System.IO aonde residem as funes de entrada/sada usadas em arquivos, em impressoras, em streaming e em aplicaes derivadas. Posteriormente teremos uma seo dedicada ao I/O de arquivos em que usaremos parte das classes desse namespace. Esse namespace tambm est contido dentro da bibliote System.dll. Escrevendo um arquivo
FileStream fs = new FileStream(@"c:\texto.txt", FileMode.Create); StreamWriter sw = new StreamWriter(fs); sw.WriteLine("A raposa "); sw.WriteLine("correu do caador"); sw.Close();

Lendo um arquivo
StreamReader sr = new StreamReader(@"c:\texto.txt"); StringBuilder sb = new StringBuilder(); while (!sr.EndOfStream) sb.AppendLine(sr.ReadLine()); System.Console.WriteLine(sb);

Tarefas recorrentes
Usualmente temos que fazer algumas tarefas que so praxe do dia-a-dia de um desenvolvedor. Aqui esto algumas: Acessando o diretrio da aplicao string AppDir = System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly().Location); Verificando o nome do computador Nome NetBIOS: string NomeComp = System.Environment.MachineName;

70

Apostila
Treinamento C#
Nome DNS: string nDNS =

System.Net.Dns.GetHostByName("LocalHost").HostName; Verificando a verso do sistema operacional string osVer = System.Environment.OSVersion; Verificando o usurio que est rodando o programa string usr = System.Environment.UserName;

Tratamento de Erros Uso de Try/Catch/Finally


O uso de Try/Catch ferramenta j conhecida de programadores Delphi. O Try/Catch uma ferramenta til e de uso recorrente. Tratamento estruturado de erros try/catch Objetos que encontram algum problema durante a sua execuo geram excees que notificam ao objeto que os chamou algo sobre o problema de funcionamento. Excees so objetos da classe System.Exception ou derivadas dela. Um exemplo para melhor ilustrar: quando temos um vetor com 10 elementos e tentamos acessar o 11, gerado um exception do tipo IndexOutOfRangeException, que herda de System.SystemException. Normalmente cada tipo de erro tem uma exception correspondente. Caso um erro no tenha uma exception correspondente, pode ser usada a classe System.Exception genrica. Os tipos mais comuns de exceo so: System.Exception Corresponde a uma exceo genrica; System.ApplicationException Uma exceo que ocorreu na aplicao; System.ArgumentException Quando um dos parmetros que passamos para um mtodo de um tipo invlido;

71

Apostila
Treinamento C#
Disparada quando um dos System.ArgumentNullException mtodo no suporta esse valor; System.ArgumentOutOfRangeException Disparada quando um dos valores passados a um mtodo estoura a capacidade do mtodo; System.ArithmeticException aritmticos e de converso; System.InvalidCastException Disparada quando ocorre um erro de converso; System.Data.SqlClient.SqlException Disparada quando ocorre uma exceo em uma conexo a um banco SQL, utilizando o SqlClient; System.Data.OleDb.OleDbException Similar verso do Disparada quando ocorrem erros parmetros que voc passou para um mtodo continha null, e esse

SqlClient, disparado quando ocorre uma exceo em uma conexo via OleDb; System.IO.IOException Exceo genrica de I/O para disco, disparada sempre que ocorre um erro de IO. System.IO.FileNotFoundException Disparada quando um arquivo que voc est tentando acessar no existe (herda da IOException); O tratamento de erros com exception feito isolando-se partes do cdigo com try/catch. A instruo try marca o comeo do bloco aonde, se for recebida uma exceo, ela ser tratada pelo bloco catch. Dessa forma, aproveitando o exemplo do IndexOutOfRangeException, definiremos um mtodo aonde o exception aparece e, quando disparado, escreve ndice fora do limite no console:
public void TesteDeException() { int[] vetor = new int[3]; try { for (int i = 0; i <= 4; i++) vetor[i] = i; } catch (exception e)

72

Apostila
Treinamento C#
{ System.Console.WriteLine("ndice fora do limite"); } }

Exceptions so verificadas na ordem em que foram declaradas, assim como o seria em uma instruo Switch..Case. Se dentro de um try puderem ocorrer vrios exceptions, eles podem ser tratados independentemente:
public void TesteDeException() { int[] vetor = new int[3]; try { for (int i = 0; i <= 4; i++) vetor[i] = i; } catch (ArgumentException e) { System.Console.WriteLine("problemas no argumento"); } catch (IndexOutOfRangeException e) { System.Console.WriteLine("ndice fora do limite"); } catch (Exception e) { System.Console.WriteLine(ex.Message); } }

No nosso exemplo, h tratamento para trs tipos de excees: duas so especficas (ArgumentException e IndexOutOfRangeException) e outra genrica (Exception). A primeira exceo a ser testada ArgumentException, que disparada quando os argumentos de uma chamada de mtodo esto com alguma incompatibilidade com a declarao. A segunda exceo a ser testada IndexOutOfRangeException. Como essa a exceo que ns sabemos que ser disparada, a linha que escreve ndice fora do limite executada e o fluxo segue para o final do try. A terceira exceo testada apenas quando as outras no coincidiram com a exceo que foi disparada. Note que, ao usar a classe Exception, estamos fazendo algo como um switch default de um switch...case. Note tambm que temos acesso mensagem do Exception, atravs da propriedade Message.

73

Apostila
Treinamento C#
Excees personalizadas Caso voc esteja desenvolvendo cdigo e deseje criar exceptions prprias, basta criar uma classe que herda de Exception, como no exemplo abaixo:
public class MinhaException :Exception { public override string Message { get { return "Ocorreu uma MinhaException"; } } }

Note que neste cdigo, a propriedade Message foi sobrescrita, de forma a retornar uma string por ns definida. Disparando exceptions Para disparar exceptions, usamos o comando throw. Nunca se esquecendo que um Exception nada mais que um objeto, usamos o comando abaixo para disparar uma Exception genrica:
public void Abre() { if (trancada) throw new Exception("A porta est trancada"); }

Finally Ao blocos try...catch, possvel usar finally , que executado sempre, tenha havido uma exception ou no. Uma utilidade importante dessa instruo , por exemplo, fechar um arquivo se houver uma exception de I/O ou fechar uma conexo com o banco de dados.

public void TesteDeException() { int[] vetor = new int[3]; try { for (int i = 0; i <= 4; i++) vetor[i] = i; } catch (Exception e) { System.Console.WriteLine(ex.Message); }

74

Apostila
Treinamento C#
finally { Console.WriteLine("Ocorrendo ou no uma exception, voc ver essa mensagem"); } }

Reviso
Neste captulo, vimos o que um namespace, aprendemos a acessar classes contidas em outros projetos ou bibliotecas, falamos um pouco sobre algumas das bibliotecas contidas no Base Class Library do framework.NET, falamos sobre tarefas recorrentes e, por fim, falamos sobre o conceito de tratamento de erros do .NET. Nos prximos captulos, iremos nos aprofundar mais no .NET.

75

Apostila
Treinamento C#

Captulo 7 XML
Objetivos
No mundo conectado de hoje, ser capaz de falar um protocolo comum com clientes, parceiros e fornecedores torna-se cada vez mais importante. O protocolo escolhido hoje em dia para isso o XML. Esse captulo servir como uma introduo ao formato XML. O objetivo deste captulo explicar rapidamente o que o XML, quais so as diferenas entre XML e HTML, e mostrar como utilizar o XML em suas aplicaes.

O que XML?
A sigla XML vem de Extensible Markup Language, e uma recomendao do W3C, como linguagem padro para a descrio de dados na Web. A sua funo definir um formato comum para a troca de informaes entre diferentes sistemas. O XML nada mais que um arquivo texto (com extenso .XML), baseado em tags, de forma semelhante ao HTML. Entretanto, diferente do HTML, a sua funo estruturar, armazenar e transportar dados no como exibi-los. E, para tanto, as suas tags no so previamente definidas as tags so definidas pelo autor. Vejamos um exemplo:

Vemos, nesse exemplo, como seria um XML que representa um pedido de um cliente. Enteremos o funcionamento desse exemplo nas sesses seguintes.

76

Apostila
Treinamento C#

Elementos de um Documento XML


Um documento XML, como o mostrado no exemplo, composto dos seguintes elementos: Declarao A primeira linha que compe um documento XML a declarao:
<?xml version=1.0 encoding=utf-8 ?>

O atributo version define a verso do XML que estaremos trabalhando. O atributo encoding define a codificao dos caracteres que utilizamos quando da criao do documento. Assim, em nossa declarao definimos que o documento foi feito utilizando-se da codificao UTF-8. Tags No XML, uma tag (ou elemento) corresponde a um campo. Assim, quando definimos:
<Pedido> <IdUsuario>153</IdUsuario> <DataFaturamento>2006-01-10</DataFaturamento> <Itens> <Item id=1> <IdItem>5</IdItem> <Quantidade>1</Quantidade> </Item> <Item id=2> <IdItem>2</IdItem> <Quantidade>5</Quantidade> </Item> </Itens> </Pedido>

Definimos que um Pedido possui um IdUsuario, DataFaturamento, e uma coleo de Itens, onde cada Item dessa coleo definido como tendo um IdItem e uma Quantidade. Um documento XML deve possuir a seguinte estrutura:
<root> <child> <subchild>...</subchild> </child> </root>

77

Apostila
Treinamento C#
Uma tag (ou elemento) pode ter diversos tipos de contedos diferentes, e inclui tudo entre o inicio de uma tag, at o final da tag de fechamento. Assim, ela pode conter texto, outras tags e atributos. Deve-se notar que no XML: Todas as tags precisam ter uma tag de fechamento; As tags so case-sentitive ou seja, <Pedido> diferente de <pedido>; As tags XML devem vir na ordem correta No vlido algo do gnero: <Item><IdItem>5</Item></IdItem>; Todos os documentos XML devem ter uma tag inicial (que define o objeto que descrito pelo documento), e essa tag deve ser nica a chamada root. A nomenclatura das tags no XML deve seguir as seguintes regras: Podem conter letras, nmeros e outros caracteres; No devem comear com nmeros ou caracteres de pontuao; No podem comear com xml (ou Xml, XML, etc); No podem conter espaos.

Entretanto, como os dados de um arquivo XML geralmente mapeiam dados de um banco, ou outra fonte de dados, como boas prticas adotam-se em geral algumas outras restries recomendadas: Use nomes descritivos, mas no exagere no tamanho; Evite usar smbolos matemticos (=, -, +, /, :); Caracteres especficos de lngua so vlidos entretanto, isso pode causar problemas quando outra empresa for consumir os seus dados. Desta forma, evite-os;

78

Apostila
Treinamento C#
Atributos No XML, uma tag pode possuir um ou mais atributos. Atributos, em geral, carregam informao que no parte do dado, mas que importante para o programa que est manipulando os dados entender do que se trata.
<Item id=1>

No exemplo acima, dissemos ao programa que ir tratar o XML que esse o primeiro item da lista de itens do usurio. Atributos precisam sempre ser definidos entre ou . Se internamente ao elemento j houver ou , necessrio utilizar a outra opo na definio. Apesar dos atributos poderem conter dados, assim como as tags, elas possuem diversas desvantagens quanto a estas: Atributos no podem conter mltiplos filhos (como uma tag pode); mais complexo adicionar um novo atributo do que uma nova tag; A validao dos dados do documento mais complexa contra atributos; Eles tornam mais difcil a leitura e manuteno de um documento.

Comentrios Como no HTML, no XML os comentrios so feitos utilizando-se <!-- ... -->:
<!-- Este um comentrio! -->

XML Bem Formado Diz-se que um XML bem formado, quando ele atende as regras de sintax do XML, que foram descritas anteriormente.

Definindo a Estrutura do Documento


Dissemos que o XML foi desenvolvido para que fosse possvel a intercomunicao entre diferentes sistemas pela internet. Tambm dissemos que o formato do documento XML definido pelo usurio. Assim sendo, como fazemos com que um sistema reconhea o formato do documento que estamos enviando? Alm disso, como verificamos que um documento atende aos requisitos corretos (por exemplo, o campo DataFaturamento contm uma data vlida)?

79

Apostila
Treinamento C#
Fazemos isso atravs da criao de um documento que define a estrutura do nosso XML. Existem duas formas de fazer essa definio: atravs de DTD, ou usando Schemas. O DTD foi a primeira definio de um formato de documento; entretanto, os XML Schemas esto substituindo esse formato, e vem se tornando o padro. No o objetivo deste curso entrar em detalhes na criao de um DTD ou de um XML Schema, mas mais informaes podem ser encontradas na bibliografia indicada no final da apostila. Imaginando um XML do tipo:
<Pedido> <IdUsuario>12</IdUsuario> <DataFaturamento>2006-03-02</DataFaturamento> <Itens> <Item id=1> <IdProduto>5</IdProduto> <QtdProduto>1</QtdProduto> </Item> <Item id=2> <IdProduto>123</IdProduto> <QtdProduto>10</QtdProduto> </Item> </Itens> </Pedido>

Um exemplo de DTD:
<?xml version="1.0"?> <!DOCTYPE Pedido [ <!ELEMENT Pedido (IdUsuario,DataFaturamento,Itens)> <!ELEMENT IdUsuario (#PCDATA)> <!ELEMENT DataFaturamento (#PCDATA)> <!ELEMENT Itens (Item*)> <!ELEMENT Item (IdProduto,QtdProduto)> <!ELEMENT IdProduto (#PCDATA)> <!ELEMENT QtdProduto (#PCDATA)> <!ATTLIST Item id CDATA 0> ]>

Um exemplo de Schema:
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.cges.com.br/XMLSchema" targetNamespace="http:// www.cges.com.br " xmlns="http:// www.cges.com.br " elementFormDefault="qualified"> <xs:element name="Pedido"> <xs:complexType> <xs:sequence>

80

Apostila
Treinamento C#
<xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>

Alm da definio da estrutura, voc precisa de um parser, ou seja, um programa que seja capaz de validadar a estrutura do XML e confirmar a sua validade. Os browsers mais modernos j possuem parsers embutidos, e o .NET, atravs da biblioteca System.Xml, possui classes e mtodos que permitem trabalhar com os documentos XML, e realizar a sua validao.

Reviso
Nesse captulo, vimos o que um documento XML, como este formado e como fazemos a validao da estrutura do documento e dos dados contidos nele.

81

Apostila
Treinamento C#

Captulo 8 ADO.NET
Objetivos
Neste captulo, vamos estudar o funcionamento do ADO.NET, o novo pacote de classes que expe servios de acesso a dados para a programao .NET. Iremos ver quais so os classes do ADO.NET que permitem abrir uma conexo, executar comandos, e recuperar dados do banco incluindo o estudo do importante objeto DataSet, que permite trabalhar de forma desconectada com uma cpia dos dados na memria, e como fazer para utiliz-lo para recuperar dados de um arquivo XML.

O que o ADO.NET
O ADO.NET um pacote de classes que expe servios de acesso a dados para a programao .NET. Ele veio para substituir o RDO, o DAO, e por fim o ADO. Alm de ser totalmente aderente ao .NET, ele traz vantagens considerveis, tais como: Acesso desconectado a dados; Provedores de acesso dedicados a fornecedores de bancos de dados; Dataset que permite agregar vrias tabelas e apontar relacionamentos; Manipulao direta de XML; Possibilidade de popular dados a partir de arquivos XML, objetos, etc.

Providers do .NET
O .NET possui provedores especializados para bases de dados de diferentes fornecedores. A maior vantagem de se usar provedores especializados que eles so escritos de forma a aproveitar o melhor que o sistema gerenciador de banco de dados oferece. Os provedores que esto disponveis por default so: Data Provider for SQL Server (System.Data.SqlClient);

82

Apostila
Treinamento C#
Data Provider for OLEDB (System.Data.OleDb); Data Provider for ODBC (System.Data.Odbc); Data Provider for Oracle (System.Data.OracleClient).

possvel acessar bancos de dados usando os provedores ODBC e OLEDB, mas os provedores especializados oferecem acesso otimizado e mais rpido, alm de acesso caractersticas especficas de cada banco.

Modelo ADO.NET

DataAdapte r

DataSet

WindowsFor m WebForm

Connection

Command

Classes WebServices

DataReader Provider ADO.NET Consumidores

Connection O objeto Connection encontrado dentro do provider. Os objetos default do .NET so SqlConnection, OracleConnection, OleDbConnection, OdbcConnection . Alm da especificidade da base de dados a ser acessada, a classe Connection prov mtodos e propriedades similares aos encontrados no objeto Connection antigo. As strings de conexo antigas tambm so similares s usadas no .NET. Command O objeto Command, j velho conhecido do ADO, recebeu novas funcionalidades no ADO.NET. Do Command a responsabilidade de receber instrues SQL (e chamadas de Stored Procedures).

83

Apostila
Treinamento C#
O Command faz parte do conjunto de componentes que um Provider oferece, e existe um Command para cada provedor: SqlCommand, OracleCommand, OleDbCommand, OdbcCommand. Assim como no ADO, o Command do ADO.NET tem uma coleo de parmetros (Parameters) que so passados para instrues SQL. O Command possui quatro mtodos que so usados com freqncia: ExecuteReader: retorna um DataReader, objeto usado para leitura rpida da base de dados. O DataReader ser assunto do prximo tpico; ExecuteNonQuery: usado quando o comando SQL no retornar nenhum tipo de dado (como instrues INSERT, por exemplo); ExecuteScalar: quando o comando SQL retorna um nico valor (como um select count(*), por exemplo); ExecuteXMLReader: idem ao ExecuteReader, retorna um XMLReader.

DataReader O DataReader um objeto de leitura de dados, rpido e eficente, que funciona como um antigo Recordset marcado com a opo adOpenForwardOnly: ele promove escrita somente adiante, sem possibilidade de navegar registros para trs, e tembm read-only. A grande vantagem do DataReader a sua velocidade: ele deve ser usado quando for necessrio ler grandes quantidades de dados que no sero modificados como, por exemplo, em relatrios ou listagens. O DataReader especfico de cada provedor: SqlDataReader, OracleDataReader, OleDbDataReader, OdbcDataReader. O DataReader uma classe esttica e nunca deve ser instanciado. Ele deve sempre receber a referncia de um outro objeto que retorne um DataReader, como por exemplo um objeto Command, como veremos no exemplo abaixo. Para usar o DataReader, criaremos um objeto Connection que acessa a base NorthWind, inseriremos o comando de consulta (instruo SQL) e chamaremos o

84

Apostila
Treinamento C#
mtodo ExcecuteReader. A leitura feita em um loop que chama o mtodo Read(), como demonstrado abaixo:
StringBuilder sb = new StringBuilder(); SqlConnection cn = new SqlConnection(); cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=c:\\somepath\\mydb.mdb; " + "User Id=admin; Password=MyPass;"; SqlCommand cmd = new SqlCommand(); cmd.Connection = cn; cmd.CommandText = "select * from customers"; cn.Open(); SqlDataReader dr; dr = cmd.ExecuteReader(); while (dr.Read()) { sb.Append(dr["CompanyName"]); sb.Append(";"); } dr.Close(); cn.Close();

Note que no fazemos mais a verificao de EOF e nem precisamos nos preocupar com MoveNext. Ao chamarmos Read() ele j move o cursor um registro frente e retorna True, ou retorna False se no houver mais registros a serem lidos. DataAdapter O DataAdapter um objeto especializado em intermediar as requisies de acesso a dados da aplicao e o banco de dados. A idia do DataAdapter prover a parte funcional do acesso aos dados, agreagando dentro de si objetos do tipo Command (um para select, um para update, um para insert e outro para delete). Do DataAdapter a responsabilidade de preencher (ou popular) um Dataset, e tambm receber do DataSet modificaes e execut-las no banco de dados. Cada provedor tem um DataReader especfico. So eles: SqlDataAdapter, OracleDataAdapter, OleDbDataAdapter e OdbcDataAdapter. Atravs do mtodo Fill do DataAdapter, preenchemos DataTables de DataSets, conforme ser mostrado e exemplificado no prximo tpico.

85

Apostila
Treinamento C#
Criando comandos automaticamente: o CommandBuilder A classe CommandBuilder permite que sejam criados objetos Command para atualizar (update), inserir (insert) ou apagar (delete) registros de um dataset. A grande vantagem de usar o CommandBuilder que no necessrio especificar a lista de campos a serem alterados nem especificar um objeto Parameter para cada um deles. O CommandBuilder pode ser usado apenas quando usamos um SelectCommand simples, que usa um comando SELECT em uma tabela (e no uma stored procedure ou select em uma view) e que no use clusulas mais complexas, como JOIN. Ao ser chamado, o CommandBuilder: 1. conecta na base de dados e obtm o esquema da tabela; 2. prepara os comandos correspondentes, usando a lista de campos obtida; 3. instancia objetos Parameter, de acordo com o tipo de cada campo. O CommandBuilder faz parte das classes especificas de cada provider, por isso h um command builder para cada provider. O exemplo abaixo ilustra como criar um objeto CommandBuilder e fazer com que ele crie automaticamente os comandos de update, insert e delete. A classe recebe como parmetro um DataSet que sofreu atualizaes, replicando-as para o banco de dados. O procedimento abaixo tambm espera que o DataSet contenha uma tabela Clientes que foi populada com o comando SQL select * from Customers:
public void Atualiza(DataSet ds) { SqlConnection cn = new SqlConnection("Data Source=TOMAC;Initial" + "Catalog=Northwind;Integrated Security=True"); SqlCommand cmd = new SqlCommand("select * from Customers", cn); SqlDataAdapter da = new SqlDataAdapter(cmd); SqlCommandBuilder cb = new SqlCommandBuilder(da); da.UpdateCommand = cb.GetUpdateCommand(); da.InsertCommand = cb.GetInsertCommand();

86

Apostila
Treinamento C#
da.DeleteCommand = cb.GetDeleteCommand(); da.Update(ds.Tables["Clientes"]); cn.Close(); }

DataSet
O DataSet um objeto genrico do ADO.NET, independente de qual provedor est sendo usado para acesso aos dados. Sua funo gerenciar dados previamente adquiridos por acesso a bancos de dados, acesso a arquivos texto ou XML e tambm por mapeamento de objetos. O DataSet visto pelos programadores ADO como um recordset vitaminado, mas ele muito mais do que isso. O Recordset capaz de armazenar apenas um conjunto de dados. O DataSet pode armazenar vrios conjuntos, organizados em DataTables. DataTables so estruturas em memria que reproduzem as funcionalidades de uma tabela de um banco de dados. DataTables podem ter restries (como chaves primrias, por exemplo), atravs da coleo Constraints e podem ser relacionadas entre si, atravs de relaes, que so adicionadas coleo Relations. Aps obtidos, os dados permanecem no DataSet e feita a desconexo com a base de dados, conexo que s voltar a ser estabelecida quando for necessria alguma operao de escrita na base ou quando se desejar obter novamente os dados.

Nota

Tenha sempre em mente que o DataSet preenchido com todos os registros retornados pelo comando SQL que foi colocado no DataAdapter. Se esse comando retornar um milho de registros, sero trafegados um milho de registros pela rede de uma s vez, e um milho de registros que sero alocados em uma estrutura de memria.

87

Apostila
Treinamento C#
Se a sua aplicao trabalhava com resultsets grandes, que tambm eram custosos em termos dde processamento e alocao de cursor do lado do servidor, pode ser esta a hora de rever o seu modelo de acesso a dados.

No ADO.NET 2.0 h novidades, como a possibilidade de usar um DataReader em um DataTable, updates em batch, entre outros. Populando e iterando por um DataSet O exemplo abaixo ilustra um exemplo tpico de um DataSet e um DataAdapter:
OleDbConnection cn = new OleDbConnection(); cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=c:\\nwind.mdb;User Id=admin;Password=;"; OleDbDataAdapter da = new OleDbDataAdapter("select * from Customers", cn); DataSet ds = new DataSet("Clientes"); da.Fill(ds, "Clientes"); foreach( DataRow dr in ds.Tables["Clientes"].Rows) { Console.WriteLine("" + dr["CompanyName"] + ":" + dr["ContactName"]); }

Primeiro criada a conexo com a base de dados de teste note que a base de dados de exemplo NWind.mdb deve estar no diretrio-raiz; caso ela esteja em outro diretrio basta alterar a string de conexo). Depois, criado um DataAdapter, que recebe o comando SQL e a conexo. O comando da.Fill instrui o DataAdapter a conectar-se ao banco executar o SQL e preencher o DataTable Clientes do DataSet ds com os dados obtidos como resultado. Note tambm que usamos um loop foreach para iterar ao longo de uma DataTable do DataSet. Esse tipo de construo robusto e evita erros com ndices, o que por vezes acontecia quando usvamos construes de loops For que iteravam usando, por exemplo, propriedades como Count. Filtrando dados em um DataSet Embora os dados devam ser filtrados preferencialmente na origem dos dados (usando clusulas where) e deva ser repassado ao DataSet apenas os registros que correspondam a uma regra, muitas vezes se deseja filtrar dados que j esto em um DataSet.

88

Apostila
Treinamento C#
Para filtrar os dados em um DataSet existe o mtodo Select, que recebe como parmetro um String contendo clusulas como as que usaramos em um where de uma instruo SQL. O exemplo abaixo mostra como filtrar os registros cuja coluna CustomerID comea com A:
DataRow[] rows; rows = ds.Tables["Clientes"].Select("CustomerID LIKE 'A%'");

A maioria das regras de sintaxe do SQL se aplica ao mtodo Select de um DataSet, bem como os comandos: And, Or, Not, >, <, <>, =, CONVERT, LEN, ISNULL, IIF so exemplos. Consulte a documentao do DataSet para ver todas as opes. Existem tambm mtodos Select sobrecarregados que permitem ordenar os campos como em uma instruo ORDER BY do SQL ou ainda filtrar de acordo com o RowState. O exemplo abaixo filtra os clientes brasileiros os e ordena em ordem alfabtica descrescente:
DataRow[] rows; rows = ds.Tables["Clientes"].Select("County = 'Brazil'", "CustomerName DESC");

Procurando por uma informao em um DataSet Existe uma outra forma de procurar por um determinado registro que usada apenas para buscas no campo de chave primria. O exemplo abaixo demonstra o seu uso:
DataRow[] rows; rows = ds.Tables["Clientes"].Rows.Find("KOENE");

DataViews Assim como as Views de um banco de dados permitem criar uma estrutura de dados filtrados e ordenados a partir de um DataTable.
Nota

H diferenas entre o uso do mtodo Select do DataTable e um DataView. O Select retorna um conjunto de linhas copiadas de um DataTable, enquanto o DataView continua ligado ao DataTable, e todas as alteraes que forem feitas em um sero refletidas no outro.

89

Apostila
Treinamento C#
Alm disso, o DataView pode ser usado como DataSource de controles visuais, como um DataGrid ou um TextBox, entre outros. O exemplo abaixo filtra os registros cujo CustomerID comea com A e ordena pelo campo CustomerName usando um DataView. DataSource para um DataGridView. OleDbConnection cn = new OleDbConnection(); cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=c:\\nwind.mdb;User Id=admin;Password=;"; OleDbDataAdapter da = new OleDbDataAdapter("select * from Customers", cn); DataSet ds = new DataSet("Clientes"); da.Fill(ds, "Clientes"); DataView dv = new DataView(); dv.Table = ds.Tables["Clientes"]; dv.RowFilter = "CustomerID LIKE 'A%'"; dv.Sort = "CutomerName ASC"; DataGridView1.DataSource = dv; Note que o DataView tambm serve como

Atualizando o banco com informaes do DataSet Para atualizar um banco de dados, devemos usar um DataAdapter para que ele faa a conexo com o banco de dados e faa as operaes necessrias. Para tanto, devemos configurar as instrues de INSERT, UPDATE e DELETE apropriadamente, parmetros. A cada linha de um DataSet atribuda uma propriedade RowState, que reflete o estado dos dados daquela determinada linha. Os valores possveis so: Added Deleted Detached A linha foi adicionada e AcceptChanges no foi chamado A linha foi marcada para ser apagada Acontece imediatamente depois de a linha ter sido criada mas ainda no foi adicionada coleo de linhas do DataTable Modified A linha foi modificada desde o ltimo AcceptChanges usando as respectivas propriedades InsertCommand, UpdateCommand e DeleteCommand do DataAdapter, bem como os seus

90

Apostila
Treinamento C#
Unchanged A linha permanece a mesma desde o ltimo AcceptChanges

O exemplo abaixo ilustra esse processo, supondo que j exista um objeto Connection instanciado e que os nicos campos do DataSet que sofrem atualizao so CompanyName e ContactID:
StringBuilder sb = new StringBuilder(); sb.Append("UPDATE Customers "); sb.Append("SET CompanyName = @CompanyName, "); sb.Append(" ContactName = @ContactName "); sb.Append("WHERE (CustomerID = @CustomerID)"); da.UpdateCommand = new SqlCommand(sb.ToString(), cn); da.UpdateCommand.Parameters.Add("@CompanyName", SqlDbType.VarChar, 255, "CompanyName"); da.UpdateCommand.Parameters.Add("@ContactName", SqlDbType.VarChar, 255, "ContactName"); da.UpdateCommand.Parameters.Add("@CustomerID", SqlDbType.VarChar, 255, "CustomerId"); da.Update(ds.Tables("Clientes"));

Note a sintaxe que foi usada: foram criados parmetros, que comeam com @, para cada varivel que usaremos na atualizao. Logo aps, para cada um desses parmetros, informamos um tipo e tamanho de campo (no caso, usamos em todos o tipo SqlDbType.VarChar com tamanho 255) e, por fim, indicamos a que coluna do DataSet o parmetro corresponde. Por ltimo, a instruo Update atualiza a base de dados. Todos os registros com RowState Modified sero atualizados na base.

Acessando arquivos XML


Esta seo tem por fim apenas ilustrar como usar um DataSet simples que l ou que grava em arquivos XML. Gravando arquivos XML a partir de um DataSet A classe DataSet contm dois mtodos para serem usados na escrita de arquivos XML: WriteXML e WriteXMLSchema.

91

Apostila
Treinamento C#
O mtodo WriteXMLSchema permite que um DataTable populado possa ter o seu esquema (definies de campos) salvos em um arquivo. O mtodo WriteXML permite que os dados de um DataTable sejam gravados em um arquivo XML. O exemplo abaixo ilustra os dois mtodos, rode-o e veja os resultados nos dois arquivos de sada:
OleDbConnection cn = new OleDbConnection(); cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=c:\\nwind.mdb;User Id=admin;Password=;"; OleDbDataAdapter da = new OleDbDataAdapter("select * from Customers", cn); DataSet ds = new DataSet("Clientes"); da.Fill(ds, "Clientes"); DataView dv = new DataView(); dv.Table = ds.Tables["Clientes"]; dv.RowFilter = "CustomerID LIKE 'A%'"; dv.Sort = "CutomerName ASC"; ds.WriteXml("c:\\saida.xml"); ds.WriteXmlSchema("c:\\saida.xsd"); cn.Close();

Lendo arquivos XML em um Dataset A leitura de um arquivo XML requer que seja informado no s o arquivo de dados, mas tambm um arquivo contendo as definies de cada campo. Caso no exista, o objeto DataSet tenta inferir o esquema, ou seja, tenta criar sozinho o esquema, o que funciona na maioria dos casos. Para ler o esquema, usa-se o mtodo ReadXmlSchema, e para ler o arquivo XML, ReadXml. O cdigo abaixo l um arquivo XML e popula um DataGridView com os dados obtidos.
DataSet ds = new DataSet(); ds.ReadXmlSchema("c:\\saida.xsd"); ds.ReadXml("c:\\saida.xml"); DataGridView1.DataSource = ds.Tables(0);

92

Apostila
Treinamento C#
Experimente tirar a segunda linha (que chama ReadXmlSchema) do cdigo e veja que o objeto DataSet foi capaz de inferir sozinho o esquema do XML.

Trabalhando com nulos


Os campos de um banco de dados tm que ter uma forma de indicar se esto ou no vazios. Um campo do tipo VarChar poderia conter uma string para indicar isso, mas o que conteria um campo Int? 0? E quando precisarmos representar o valor zero? Para isso, foi desenvolvido o tipo Null para representar que o contedo de um campo nulo. Entretanto, o significado de nulo em um banco de dados e no .NET so diferentes. No .NET, um nulo significa apenas que a varivel no aponta para lugar nenhum da memria. E como fazemos essa converso? Ao fazer converso de um dado nulo para uma varivel .NET, h trs formas de fazer o tratamento: 1. IsDbNull: a funo IsDbNull retorna True se o valor a ser verificado contiver nulo; 2. DbNull.Value: deve ser usado em uma comparao, como no exemplo:
If (a == DbNull.Value) { ... }

3. Fazendo converso com ToString(): nesse caso, o mtodo retornar uma string vazia se exisitir um valor nulo.

Reviso
Neste captulo, estudamos o funcionamento do ADO.NET, o novo pacote de classes que expe servios de acesso a dados para a programao .NET. Vimos um pouco sobre os diferentes DataProviders que acompanham o .NET 2.0 e qual o novo modelo de objetos do ADO.NET. Alm disso, estudamos o importante objeto DataSet, que permite trabalhar de forma desconectada com uma cpia dos dados na memria. Para completar, vimos como usar o DataSet para buscar dados de um arquivo XML, e como lidar com dados nulos.

93

Apostila
Treinamento C#

Captulo 9 Trabalhando com Windows Forms


Objetivos
Neste captulo, iremos estudar um pouco sobre programao para Windows no C# 2.0, com o objetivo de desenvolver no leitor a curiosidade de experimentar e aprender como funciona. Vamos mostrar como possvel trabalhar com janelas, usando formulrio MDI, como adicionar controles aos seus formulrios, como definir uma janela Master, da qual outros formulrios herdam e como tratar eventos disparados pelo usurio. Alm disso, como algumas vezes necessrio desenvolver controles personalizados, falaremos como criar um User Control, e utilizar o mesmo nos seus formulrios. Por fim, trataremos um pouco sobre acesso a dados em um Windows Form.

Formulrios MDI
Um formulrio MDI (Multiple Document Interface) permite que sejam abertos e confinados outros formulrios dentro dele, como ilustrado:

Para criar o formulrio-pai, pode ser feito de duas formas:

94

Apostila
Treinamento C#
1. Usando o assistente, que est acessvel ao se clicar no projeto, escolhendo a opo Add e depois New Item. Na janela que se abrir, uma das opes o MDI Parent Form. Dessa forma criado um formulrio com vrios componentes j configurados, como menu e status bar entre outros; 2. Criando um novo formulrio e marcando a propriedade IsMDIParent com True. Para chamar formulrios-filho, basta criar formulrios comuns e, quando eles forem abertos pelo formurio MDI principal, a partir de um menu, boto, eventos ou outra forma, deve ser usado cdigo similar ao apresentado abaixo:
' o formulrio-filho foi chamado de Form1 Form1 f1 = new Form1(); ' determina que o formulrio-pai o formulrio ' em que est sendo feita a chamada f1.MdiParent = this; ' opcional, faz com que o formulrio inicie maximizado f1.WindowState = FormWindowState.Maximized; ' abre o formulrio f1.Show();

Herana de formulrios Formulrios podem tambm ser herdados, permitindo que se desenhe um formulrio master e que qualquer mudana seja replicada para todos os seus descendentes. Para criar um novo formulrio e herdar as caractersticas de outro formulrio, basta acrescentar o comando Inherits declarao do formulrio, como no exemplo abaixo:
public class Form2 : Project1.Form1

Nota

Perceba que, conforme ilustrado, o deve ser informado o nome do projeto e o nome do formulrio a ser herdado. Caso seja informado apenas o nome do formulrio, o prprio Visual Studio gerar um erro e mostrar a sugesto para fazer com que o cdigo funcione.

95

Apostila
Treinamento C#
No exemplo acima, todos os controles e propriedades de Form1 sero herdados por Form2, e as propriedades dos controles que foram herdados no podero ser alteradas. Podemos, entretanto, sobrescrever mtodos e propriedades declarados em Form1 que foram declarados com Overridable.

User Controls
User Controls so controles ou grupos de controles criados pelo desenvolvedor. Em relao aos controles ActiveX usados anteriormente, os User Controls so mais completos e so mais fceis de distribuir, de usar e serem extendidos, alm de serem aderentes plataforma .NET. Com os user controls podem ser criados modelos de controles que podem ser repetidos e aplicados em outros formulrios, a partir da Toolbox do Visual Studio ou instanciados via cdigo na aplicao. User controls trazem grandes vantagens e facilidades: eles podem encapsular controles ou grupos de controles que so usados recorrentemente em nossa aplicao. Se tivermos um mesmo user control espalhado ao longo de vrios formulrios, se fizermos uma alterao no user control, essa mudana ser replicada para todos os formulrios que o usarem. Embora isso possa parecer uma grande vantagem, tambm traz um inconveniente: caso voc, por exemplo, precise deixar o seu user control maior em tamanho de tela, isso pode afetar o lay-out de formulrios que j o usavam. Projete o user control com cuidado para isso no acontecer. Adicionando um controle programaticamente Adicionamos um controle programaticamente, adicionando o mesmo coleo de controles do Formulrio:
this.Controls.Add(f1);

Disparando eventos de um controle Em controles (ou user controls) criados por ns ou herdados podemos criar novos eventos para adicionar maior interao entre o formulrio ou os containers e o nosso controle (ou user control).

96

Apostila
Treinamento C#
Para criar um evento, precisamos primeiro criar um Delegate. Um delegate funciona como uma referncia para um mtodo. Ele deve ser declarado fora da classe que ir dispar-lo, e deve ter visibilidade pblica.
public delegate void MyEventHandler(object sender, EventArgs e);

Em seguida, dentro da classe declare um evento do tipo do delegate criado:


public event MyEventHandler MyEvent;

Para que a sua classe dispare esse evento, voc precisa agora chamar o evento criado, como no exemplo:
private void btnHelloWorld_Click(object sender, EventArgs e) { MyEvent(this, new EventArgs()); }

Por fim, quando voc for consumir o controle, voc precisa indicar qual mtodo ser disparado quando o evento ocorrer:
myControl1.MyEvent += new MyEventHandler(myControl1_MyEvent);

A prxima seo exemplifica com cdigo o uso de user controls e de eventos.

Lab: Criando um User Control


O exemplo que ser seguido aqui um controle simples de formulrio de login, contendo uma caixa de texto para que o usurio entre o seu login e outra para a sua senha, uma label para cada caixa de texto e um label que mostrar mensagens de erro e um boto Login. A lgica e os dados de autenticao sero, apenas para esse exemplo, embutidos no cdigo para fins didticos, mas saiba que essa uma prtica que nunca deve ser usada em aplicaes que sero usadas em produo. O controle avisar o usurio quando for feito o login ou quando houver um erro, e isso ser feito atravs de eventos. Para comear, adicione um novo Windows Form chamado FormLogin. Adicione, tambm, um User Control chamado UCLogin (Para criar um novo User Control,

97

Apostila
Treinamento C#
usando o Solution Explorer, clique no projeto com o boto direito do mouse e clique em Add e logo em seguida em User Control). Agora, adicione ao seu controle: Controle Label Label TextBox TextBox Button Propriedade Text Text (Name) (Name) PasswordChar (Name) Text Valor Usurio: Senha: txtUsuario txtSenha * btnLogar Logar

Fora da sua classe, crie agora 2 delegates: UsuarioLogadoEventHandler Evento que ser disparado quando o usurio se logar corretamente. LoginInvalidoEventHandler Evento que ser disparado quando o login e/ou a senha forem invlidos. Crie, agora dentro da classe do controle, 2 eventos: OnUsuarioLogado; OnLoginInvalido.

...que iro disparar os delegates respectivos. Por fim, crie uma lgica de negcios que aceite: Usurio: AdoptionLab; Senha: AdoptionLab

...como resposta correta a que dispara o evento OnUsuarioLogado e que qualquer outra resposta dispare o evento OnLoginInvalido. Depois de criado o user control, faa um Build na Solution que estamos usando. Verifique que o user control que criamos dever aparecer no ncio da Toolbox:

98

Apostila
Treinamento C#

O nosso user control um novo controle que pode ser arrastado para um formulrio e pode ter as propriedades verificadas e confguradas atravs da caixa de propriedades. Arraste o nosso controle para o FormLogin. Observe agora as propriedades do controle criado. Veja tambm que na lista de eventos aparecem os dois eventos por ns criados:

Atravs desses eventos, podemos criar mtodos que sero chamados quando um deles for disparado pelo user control que criamos. Clique duas vezes em cada um dos eventos criados, para gerar automaticamente o cdigo de tratamento do evento. Pode-se tambm gerar esses eventos de forma manual, conforme explicado no tpico Disparando eventos de um controle. Agora insira cdigo de validao para cada um dos eventos, que mostra uma mensagem na tela caso o usurio tenha logado corretamente, ou no. Agora, existe mais um pequeno passo necessrio antes que possamos prosseguir. Se executarmos a nossa aplicao, ele ir automaticamente chamar o Form1. No queremos isso. Como fazemos ento?

99

Apostila
Treinamento C#
Clique duas vezes na classe Program.cs. No mtodo Main, comente a linha aonde est escrito:
Application.Run(new Form1());

E insira uma nova linha, escrita:


Application.Run(new FormLogin());

Isso far com que a sua aplicao inicie agora pelo FormLogin. Rode a sua aplicao e veja o resultado.

Aps esse teste, volte a linha do Program.cs para o valor original. O cdigo fonte com o resultado esperado desse lab est contido no CD.

Respondendo a eventos de teclado


comum encontrar no mercado sistemas que precisem responder a eventos de teclado, quer para validar a entrada, quer para tornar mais fcil a navegabilidade. Eventos de teclado podem ser respondidos usando os j conhecidos eventos de KeyDown, KeyUp, KeyPressed, TextChanged.

Data Binding
Atravs do DataBinding, podemos vincular controles a objetos que manipulam dados, tornando fcil a navegao e a alterao de informaes nele contidas. DataSource Diversos controles que vm por padro com o .NET j possuem caractersticas que tornam possvel associ-los diretamente com as fontes de dados (atravs de um

100

Apostila
Treinamento C#
DataSet, um ArrayList, etc), facilitando o processo de manipulao e exibio desses dados. Para facilitar a manipulao dos dados a partir de fontes de dados, o .NET traz o controle DataGridView. Esse controle o controle mais poderoso contido no .NET para trabalhar com dados, e ser estudado nas prximas sees. Alguns controles (no caso, a ComboBox e a ListBox) possuem 3 propriedades muito importantes, que facilitam a vinculao: DataSource Define a fonte de dados. DisplayMember Define o campo que ser usado como valor a ser exibido. ValueMember Define o valor do campo (uso interno).

Vejamos um exemplo, de como popular um ListBox (o mesmo princpio se aplica a uma ComboBox):
// Esta parte voc j viu... string connectionString = "Data Source=CAIOWAA\\SQLEXPRESS;Initial " + "Catalog=Northwind;Integrated Security=True"; SqlConnection cn = new SqlConnection(connectionString); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = new SqlCommand("SELECT * FROM Customers", cn); DataSet ds = new DataSet(); da.Fill(ds); // Essa parte responsvel pela conexo. lstCustomers.DataSource = ds.Tables[0]; lstCustomers.DisplayMember = "ContactName"; lstCustomers.ValueMember = "CustomerID";

Esses controles possuem as seguintes propriedades: SelectedItem Essa propriedade retorna um objeto que representa o item da seleo. SelectedValue Esta propriedade representa o valor do item selecionado (a propriedade configurada por ValueMember).

101

Apostila
Treinamento C#
DataBinding Entretanto, esse no o nico modo de conectar um controle a uma fonte de dados. Como dito anteriormente, poucos controles expe a propriedade DataSource. Se for assim, ento como devo fazer? Os controles Windows Forms (assim como as classes que herdam de UserControl) implementam tambm uma propriedade chamada DataBindings. Essa propriedade retorna uma coleo de vnculos (bindings) entre o controle a alguma fonte de dados. Usando o mtodo Add da coleo, podemos adicionar vnculos de nosso controle com diversas fontes de dados. O mtodo DataBindings.Add aceita diversos parmetros, dentre os quais os mais importantes para ns so: propertyName Nome, no formato texto, da propriedade do controle que ser vinculada; dataSource Objeto da fonte de dados; dataMember Campo da fonte de dados que ser vinculada.

Vamos ver agora como fazer o binding:


textBox1.DataBindings.Add("Text", ds.Tables[0], "ContactName");

Nesse caso, vinculamos a propriedade Text de nosso textbox fonte ds.Tables[0], e ao campo ContactName. BindingNavigator Se voc implementou o exemplo da TextBox, deve ter verificado um problema: o vnculo foi formado, mas apenas o primeiro campo apareceu. Como eu fao para navegar nos registros? Com essa finalidade, o .NET traz para ns o controle BindingNavigator. A funo desse controle exatamente essa: permitir a navegao nos dados. Esse controle est contido na ToolBox do Visual Studio:

102

Apostila
Treinamento C#
Para implementar um BindingNavigator, precisamos primeiro implementar um BindingSource. O BindingSource define qual a fonte de dados qual iremos nos conectar. Ou seja, ele define: DataSource Fonte de dados. DataMember Subgrupo dentro da fonte de dados. Em geral, a tabela.

Enquanto isso, o BindingNavigator cria uma barra de ferramentas, que permite navegar nos registros da fonte de dados:

Vamos ver um exemplo de implementao:


string connectionString = "Data Source=CAIOWAA\\SQLEXPRESS;Initial " + "Catalog=Northwind;Integrated Security=True"; SqlConnection cn = new SqlConnection(connectionString); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = new SqlCommand("SELECT * FROM Customers", cn); DataSet ds = new DataSet(); da.Fill(ds); bindingSource1.DataSource = ds.Tables[0]; bindingNavigator1.BindingSource = bindingSource1; textBox1.DataBindings.Add("Text", bindingSource1, "ContactName");

Lab: Data Binding


Vamos usar um exemplo para demonstrar as funcionalidades do DataBind. Abra o projeto WindowsApplicationCS, e adicione um novo Form chamado FormDataBinding.cs. Agora, abra o Project.cs, e no Application.Run, altere para:
Application.Run(new FormDataBinding());

103

Apostila
Treinamento C#
Nosso objetivo ser obter os dados da base NorthWind, e gerar um formulrio que permita visualizar ou alterar os dados de um cliente. Para isso, abra a janela DataSources (menu Data > Show Data Sources). Clique em Add New Data Source.... Na janela que se abre, selecione Database e clique em Next >. Na tela Choose Your Data Connection, clique em New Connection... para gerar uma nova conexo com uma base de dados. Escolha conexo a um servidor SQL. Na tela Add Connection...

...em Server Name, aponte o nome do banco de dados configurado no seu sistema. Na caixa Select or enter a database name:, selecione o banco Northwind, e clique em OK. De volta tela Choose Your Data Connection, clique em Next>. Na tela Save the Connection String to the Application Configuration File, clique Next>.

104

Apostila
Treinamento C#
Agora, voc ver uma tela chamada Choose Your Database Objects, aonde voc poder escolher quais os objetos do banco voc pretende utilizar.

Expanda a opo Tables, e marque a opo Customers. Isso ir, automaticamente, fazer com que todos os objetos dessa tabela sejam adicionados ao DataSet tipado que ser criado. Clique em Finish.

Voc deve ter agora algo parecido com isso na sua janela Data Sources. Em Customers, selecione a seta para baixo, e altere o tipo para Details. Agora, arraste o objeto Customers para o seu formulrio. Repare que todos os campos do DataSet criado so automaticamente copiados para dentro do formulrio. Alm disso, note tambm que j foram gerados, automaticamente, uma instncia do DataSet (northwindDataSet), uma binding source (customersDataSource) e um data adapter (customersDataAdapter).

105

Apostila
Treinamento C#

Todos os controles TextBox j esto automaticamente vinculados sua BindingSource. Agora, arraste um controle Binding Navigator: Propriedade (Name) BindingSource Valor customersBindingNavigator customersBindingSource

Agora, arraste um boto para o seu Form: Propriedade (Name) Text Valor btnGravar Gravar

Clique agora 2 vezes no boto btnGravar, e no evento Click do boto, insira o seguinte cdigo:

106

Apostila
Treinamento C#
DialogResult result = MessageBox.Show("Salvar Alteraes?", "DataBinding", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { customersBindingSource.MoveLast(); int rows = customersTableAdapter.Update(northwindDataSet); if (rows > 0) { MessageBox.Show("Alteraes feitas com sucesso!", "DataBinding"); } }

Execute agora a sua aplicao, e verifique o resultado:

O resultado desse lab se encontra disponvel no CD do treinamento.

DataGridView
O DataGrid inclui no s a facilidade de, a partir de um recordset, popular a sua interface grfica, mas tambm incluir e permitir a alterao de dados ali mostrados. Quando o desenvolvedor necessitava de maiores funcionalidades, como ordenao, formatao, era necessrio escrever cdigo, muitas vezes extenso, ou depender de componentes de terceiros. O DataGridView apareceu na verso 2.0 do framework .NET e traz consigo caractersticas que facilitam muito a vida do desenvolvedor .NET: auto-ajuste de linhas e colunas, estilos de clula, auto-organizao de colunas, formatao, entre outras.

107

Apostila
Treinamento C#

Populando um DataGridView Popular um DataGridView a partir de um DataSet uma tarefa simples. Basta adicionar o DataSet propriedade DataSource do DataGridView. O cdigo abaixo, implementado de forma similar ao anterior, ilustra melhor esse processo:
// Busco a string de conexo do arquivo de configurao. Properties.Settings setting = new Properties.Settings(); SqlConnection cn = new SqlConnection(setting.NorthwindConnectionString); SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Employees", cn); DataSet ds = new DataSet(); da.Fill(ds, "Empregados"); dataGridView1.DataSource = ds; dataGridView1.DataMember = "Empregados";

Ativando a ordenao automtica Para ativar a ordenao automtica, que permite que o usurio possa alternar a odenao ascendente/descendente ao clicar em cima de uma coluna, basta marcar a propriedade AllowUserToOrderColumns (o que pode tambm ser feito em tempo de design usando a aba Propertires do DataGridView):
dataGridView1.AllowUserToOrderColumns = true;

Ativando o auto-ajuste de linhas e colunas Para que todas as colunas sejam auto-ajustadas, use:
dataGridView1.AutoResizeColumns;

Para que uma coluna seja auto-ajustada, use:


dataGridView1.AutoResizeColumn(<ndice>);

.. onde <ndice> o nmero da coluna que ser auto-ajustada. Para que todas as linhas sejam auto-ajustadas, use:
dataGridView1.AutoResizeRows();

108

Apostila
Treinamento C#

Para que apenas uma linha seja auto-ajustada, use:


dataGridView1.AutoResizeRow(<ndice>);

Renomeando as colunas A chamada abaixo mostra como renomear uma coluna a partir do seu nome:
dataGridView.Columns["EmployeeID"].HeaderText = "ID";

Formatando colunas Para formatar colunas, podemos usar os mesmos cdigos de formatao que foram vistos no captulo 3. No exemplo abaixo, a coluna UnitPrice ter a formatao de valores monetrios que foi escolhida nas Configuraes Regionais do Windows. A segunda linha, que formata a coluna UnitsInStock, usa uma formatao customizada, preenchendo com zeros as duas casas esquerda e direita do ponto:
dataGridView1.Columns["UnitPrice"].DefaultCellStyle.Format = "C"; dataGridView1.Columns["UnitsInStock"].DefaultCellStyle.Format = "##00.00;

Mudando o estilo de acordo com uma condio O exemplo abaixo mostra como deixar com fundo amarelo a clula HiredDate de todos os funcionrios que foram contratados de 1993 para a frente. Para que possamos fazer a alterao, basta escrever um mtodo que manipule o evento DataGridView.CellFormatting e usar os DataGridViewCellFormattingEventArgs para termos acesso aos dados da clula:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (dataGridView1.Columns[e.ColumnIndex].Name.Equals("HireDate")) { object blah = e.Value;

109

Apostila
Treinamento C#
if (e.Value != null) { if (e.Value != DBNull.Value) { if (((DateTime)e.Value).Year > 1992) { e.CellStyle.BackColor = Color.Yellow; } } } } }

Fazendo um DataGridView zebrado Para fazer um DataGridView zebrado, basta usar definir um estilo e configur-lo na propriedade AlternatingRowsDefaultCellStyle. Quando o DataGridView for renderizado, o prprio componente se encarrega de alternar entre o DefaultStyle e o AlternatingStyle. O exemplo abaixo, adicionado ao DataGridView que viemos trabalhando, faz com que as linhas alternadas sejam preenchidas com fundo cinza claro:
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray;

Lendo eventos de seleo O exemplo abaixo mostra um mtodo que manipula o evento Click do DataGridView, e mostra a mensagem com o nome de todos os funcionrios selecionados:
private void dataGridView1_Click(object sender, EventArgs e) { foreach (DataGridViewCell cell in dataGridView1.SelectedCells) { DataGridViewRow row = dataGridView1.Rows[cell.RowIndex]; string firstName = row.Cells["FirstName"].Value.ToString(); string lastName = row.Cells["LastName"].Value.ToString(); string title = row.Cells["TitleOfCourtesy"].Value.ToString(); MessageBox.Show( title + " " + firstName + " " + lastName ); } }

110

Apostila
Treinamento C#
Oferecendo uma lista de opes em um ListBox Agora, e se um dos campos que estamos trabalhando contm um cdigo para um valor em uma outra tabela (uma chave estrangeira) e precisamos que, ao invs de exibir o cdigo, precisemos exibir o valor? No exemplo abaixo, utilizamos uma tabela chamada EmployeeTerritories, que contm o relacionamento entre os territrios atendidos e os funcionrios que o atendem. Criamos colunas customizadas, para fazer o relacionamento.
private void FormDataGridView_Load(object sender, EventArgs e) { // Busco a string de conexo do arquivo de configurao. Properties.Settings setting = new Properties.Settings(); SqlConnection cn = new SqlConnection(setting.NorthwindConnectionString); // Um adapter para cada query. SqlDataAdapter daEmployees = new SqlDataAdapter("SELECT * FROM " + "Employees", cn); SqlDataAdapter daTerritories = new SqlDataAdapter("SELECT * FROM " + "Territories", cn); SqlDataAdapter daEmployeeTerritories = new SqlDataAdapter("SELECT *"+ " FROM EmployeeTerritories", cn); DataSet ds = new DataSet(); daEmployees.Fill(ds, "Empregados"); daTerritories.Fill(ds, "Territorios"); daEmployeeTerritories.Fill(ds, "TerritoriosEmpregados"); // Vinculo o DGV tabela de relacionamento. dataGridView1.DataSource = ds; dataGridView1.DataMember = "TerritoriosEmpregados"; // Apago as colunas de ndice, que no sero usadas. dataGridView1.Columns.Clear(); // Crio uma coluna contendo uma DropDown com os territrios. DataGridViewComboBoxColumn colTerritories = new DataGridViewComboBoxColumn(); colTerritories.DisplayIndex = 0; colTerritories.HeaderText = "Territorio"; colTerritories.DataPropertyName = "TerritoryID";

111

Apostila
Treinamento C#
colTerritories.DataSource = ds.Tables["Territorios"]; colTerritories.DisplayMember = "TerritoryDescription"; colTerritories.ValueMember = "TerritoryID"; dataGridView1.Columns.Add(colTerritories); // Crio uma coluna contendo uma DropDown com os funcionrios. DataGridViewComboBoxColumn colEmployees = new DataGridViewComboBoxColumn(); colEmployees.DisplayIndex = 1; colEmployees.HeaderText = "Empregado"; colEmployees.DataPropertyName = "EmployeeID"; colEmployees.DataSource = ds.Tables["Empregados"]; colEmployees.DisplayMember = "LastName"; colEmployees.ValueMember = "EmployeeID"; dataGridView1.Columns.Add(colEmployees); // Recalcula o tamanho das colunas. dataGridView1.AutoResizeColumns(); }

Formulrios Master/Detail
Formulrios Master/Details so aqueles que mostram os dados separados em dois grupos: o principal (Master) e o de detalhes (Detail). Quando escolhemos um registro no principal, o de detalhes se atualiza de acordo com a relao que existe entre os dois. DataRelation importante, nesse ponto, falar um pouco sobre o objeto DataRelation. O DataRelation um objeto do namespace System.Data, que define uma relao entre duas colunas de duas tabelas diferentes contidas em um DataSet. Ele aceita diversos parmetros, mas os principais so: relationName Uma string, contendo um nome para a relao. parentColumn Recebe uma DataColumn (coluna do DataSet), que representa a coluna pai. childColumn Recebe uma DataColumn (coluna do DataSet), que representa a coluna filha. Como exemplo:

112

Apostila
Treinamento C#
DataColumn colPai = ds.Tables["Empregados"].Columns["EmployeeID"]; DataColumn colFilho = ds.Tables["TEmpregados"].Columns["EmployeeID"]; DataRelation rel = new DataRelation("RelTEmpregados", colPai, colFilho);

Estratgia do Master/Detail Com o componentes BindingSource, ficou muito fcil fazer relaes Master/Detail. O que deve ser feito : 1. criar um objeto Connection e conectar base; 2. criar dois DataAdapters, um para cada tabela; 3. criar um DataSet que abrigar as duas tabelas e sua relao; 4. preencher dois DataTables do DataSet usando os dois DataAdapters; 5. criar um DataRelation, que far a relao pai/filho das tabelas; 6. criar dois BindingSources; 7. um dos BindingSources receber como DataSource o DataSet, e como DataMember o DataTable com a tabela-pai; 8. o outro BindingSource receber como DataSource o BindingSource anterior, que contm os dados da tabela-pai, e o DataMember ser o DataRelation que foi criado.

Lab: Relacionamentos e Master-Detail


Vamos ver como utilizar os relacionamentos, e como trabalhar com dados no formato Master-Detail. Para isso, vamos utilizar o banco Northwind, e criar a nossa aplicao. Abra a soluo WindowsApplicationCS, criada anteriormente. Adicione um formulrio, chamado FormDataGridView.cs. Como nas outras vezes, edite o arquivo Program.cs, e altere a linha do Application.Run para que ele execute o seu cdigo:
Application.Run(new FormDataGridView());

113

Apostila
Treinamento C#
Lembre-se de, no comeo da classe, importar o namespace

System.Data.SqlClient. Nesse formulrio, adicione os seguintes controles: Controle Label Label ComboBox DataGridView Propriedade Text Text (Name) DropDownStyle (Name) EditMode Valor Funcionrio: Territrios Atendidos: cmbFuncionario DropDownList dgvTerritorios EditProgrammatically (No temos interesse em permitir a edio nesse momento).

Agora, voc deve ter um visual mais ou menos como o seguinte:

Crie uma conexo e os adapters necessrios para executar as seguintes buscas no banco e gravar os dados em um DataSet:
SELECT FROM ORDER BY SELECT FROM EmployeeID, LastName + ', ' + FirstName AS [Name] dbo.Employees Name ASC TerritoryID, TerritoryDescription dbo.Territories

SELECT * FROM EmployeeTerritories

Crie um DataRelation, relacionando as tabelas Employees e EmployeeTerritories, atravs do campo EmployeeID, como segue:

114

Apostila
Treinamento C#
DataColumn colPai = ds.Tables["Empregados"].Columns["EmployeeID"]; DataColumn colFilho = ds.Tables["TEmpregados"].Columns["EmployeeID"]; DataRelation rel = new DataRelation("RelTEmpregados", colPai, colFilho); ds.Relations.Add(rel);

Agora, adicione via cdigo 2 objetos BindingSource, um que ir apontar para a tabela Employees e outro que ir apontar para EmployeeTerritories:
BindingSource bsEmpregados = new BindingSource(); bsEmpregados.DataSource = ds; bsEmpregados.DataMember = "Empregados"; BindingSource bsTerritorios = new BindingSource(); bsTerritorios.DataSource = bsEmpregados; bsTerritorios.DataMember = "RelTEmpregados";

Note que, no caso do bsTerritorios, ele est apontando o DataSource para o bsEmpregados, e o DataMember para o nome que foi dado para o relacionamento (RelTEmpregados). Com isso, vinculamos uma fonte outra. Vincule agora a sua ComboBox fonte bsEmpregados, e o DataGridView fonte bsTerritorios. Com isso agora eles esto corretamente relacionados.

Entretanto, note que ele no ficou visualmente agradvel. O que quer dizer cada TerritoryID? Alm disso, o EmployeeID desnecessrio no significa nada para o usurio. Vamos melhorar o nosso programa, trabalhando os dados do Grid. A primeira coisa a fazer limpar o nosso Grid. Para isso, utilizamos o mtodo Clear, da coleo Columns do DataGridView.

115

Apostila
Treinamento C#
Nosso prximo passo adicionar programaticamente uma coluna, que receba o TerritoryID do grid e exiba o texto. Fazemos isso com uma coluna do tipo DataGridViewComboBoxColumn:
DataGridViewComboBoxColumn colTerritories = new DataGridViewComboBoxColumn(); colTerritories.DisplayIndex = 0; colTerritories.HeaderText = "Territorio"; colTerritories.DataPropertyName = "TerritoryID"; colTerritories.DataSource = ds.Tables["Territorios"]; colTerritories.DisplayMember = "TerritoryDescription"; colTerritories.ValueMember = "TerritoryID";

No exemplo, dissmos que a coluna ir receber a propriedade TerritoryID (DataPropertyName), e ir se conectar fonte ds.Tables["Territorios"] (DataSource), e exibir a coluna TerritoryDescription (DisplayMember). Entretanto, como no temos interesse que o usurio possa alterar os valores, seria bom forarmos para que ele no possa selecionar outro valor na lista. Isso feito com o comando:
colTerritories.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;

Agora vamos adicionar a nossa coluna coleo de colunas do grid, e mandar a coluna se auto-redimensionar automaticamente. Rode a sua aplicao e veja o resultado:

O resultado est contido no CD.

116

Apostila
Treinamento C#

Reviso
Neste captulo, foi mostrado como funciona um formulrio MDI no C#, como funciona o DataBinding e falamos um pouco sobre o DataGridView e formulrios Master/Detail. Esperamos que este captulo tenha despertado no leitor a vontade de se aprofundar mais na programao Windows Forms.

117

Apostila
Treinamento C#

Captulo 10 Web Services


Objetivos
O termo Web Service vem se tornando um termo cada vez mais comum, quando se fala de aplicaes distribudas. Mas o que vem a ser um Web Service, e porque tanto se fala sobre isso? O objetivo desse captulo explicar ao leitor o que um Web Service, qual o uso prtico disso, como criar um Web Service simples, como consumir os seus dados e como fazer para distribu-lo.

Conceito: O que um Web Service?


De acordo com o W3C (World Wide Web Consortium), um Web Service um sistema de software desenhado para suportar a interoperabilidade mquinamquina atravs de uma rede. Se sua aplicao precisa se comunicar com outra aplicao (como Pocket PC, SmartPhone, SAP, etc) atravs da Internet e de forma transparente, voc precisa de um Web Service.

Web Services so os blocos de construo fundamentais na migrao da computao local para a computao distribuda pela Internet. Para que seja possvel a interoperabilidade entre sistemas distribudos, ele se baseia em 3 padres:

118

Apostila
Treinamento C#
Ele expe suas funcionalidades atravs de um protocolo padro de rede, usualmente o SOAP (Simple Objet Access Protocol); Ele prov um meio de descrever suas interfaces, com detalhes suficientes para que seja possvel a uma aplicao cliente conversar com eles. Esta descrio feita por um documento XML chamado WSDL (Web Services Description Language). Um Web Services deve ser registrado, de forma que possveis usurios possam localiz-lo facilmente. Isso feito por um servio chamado UDDI (Universal Discovery Description and Integration). Padres abertos e o foco na comunicao e colaborao entre pessoas e aplicaes esto criando um ambiente onde os Web Services XML esto se tornando a plataforma para integrao de aplicaes. Ou seja, os Web Services utilizam os protocolos padro da internet, para que se torne possvel uma comunicao transparente aplicao-aplicao. Mas quais so as vantagens de um Web Services? Web Services prov interoperabilidade entre vrias aplicaes, rodando em plataformas diferentes; Eles utilizam padres e protocolos abertos; Os dados e formatos dos protocolos so baseados em texto, sempre que possvel; Ele utiliza o protocolo HTTP como meio de troca de informaes, o que permite que os dados sejam transferidos mesmo atravs de firewalls o que no seria possvel atravs de chamadas RPC; Ele facilita a reutilizao de cdigo, concentrando o fornecimento de dados em uma nica fonte; O acoplamento fraco provido permite uma abordagem distribuda.

E quais so as desvantagens?

119

Apostila
Treinamento C#
Ainda no existem protocolos que reforam transaes; Eles possuem uma performance fraca comparada com as chamadas RPC.

Entre as plataformas que permitem a utilizao de Web Services, temos: Axi e Jacarta Tomcat Server, parte do Apache project; ColdFusion, da Macromedia; Java Web Services Development Pack (JWSDP) da Sun; Servidores Microsoft .NET, da Microsoft; Websphere Application Server, da IBM; Web Application Server, da SAP; Oracle Application Server, da Oracle.

Criando um Web Service


O C# j possui um tipo de projeto especfico para o desenvolvimento de Web Services, que encapsula a maior parte da complexidade do desenvolvimento dele. Nada melhor que um exemplo para verificarmos como isso funciona. Abra o Visual Studio 2005, selecione File > New > Web Site....

120

Apostila
Treinamento C#
Selecione ASP.NET Web Services, em Language selecione Visual C# e em Location digite http://localhost/NorthwindWS. Clique em OK. O Visual Studio ir abrir um novo projeto, que estar localizado por default na raiz do seu IIS (que, por default, c:\inetpub\wwwroot).

Voc pode verificar que ele criou automaticamente um WebService chamado Service.asmx, que possui um mtodo chamado HelloWorld(). Mande rodar sua aplicao (pressionando F5 ou clicando em janela ser mostrada: ), e veja o resultado. A seguinte

Mas o que isso significa? Na primeira vez que voc rodar a sua aplicao, ela ainda no vai estar configurada para permitir a depurao do cdigo. Na primeira vez em que mandamos a aplicao rodar, o sistema ir nos avisar disso, e perguntar se desejamos alterar o modo para permitir depurao. Deixe que ele altere o Web.config, clicando em ok.

121

Apostila
Treinamento C#

Veja que, aps termos clicado em OK, o Visual Studio abre uma janela do browser (Internet Explorer) aonde ele mostra o contedo do nosso Web Service. Aqui, podemos ver uma lista dos servios disponveis. No caso, apenas o mtodo Hello World est disponvel. Clique nele. Uma nova janela ser aberta:

122

Apostila
Treinamento C#
Aqui, temos a opo de preencher todos os parmetros necessrios para a invocao do mtodo, e podemos cham-lo clicando em Invoke. Como o Hello World no tem nenhum parmetro, clique em Invoke.

Podemos ver ento qual foi a resposta que retornou quando executamos uma chamada ao nosso mtodo, Hello World. Isso o que o cliente de nosso web service vai receber como resposta um arquivo XML (por isso estudamos XML em um outro captulo). S que este um exemplo muito simples um Web Service que faz pouca coisa ainda. Vamos criar um outro Web Method (nome dos mtodos fornecidos por um Web Service), que consome os dados de um banco de dados e retorna para o usurio. Clique no arquivo Service.asmx com o boto direito, e escolha Delete e confirme. Exclua tambm o seu arquivo de cdigo, clicando em Service.vb e escolhendo Delete. Agora, clique com o boto direito no projeto, e selecione Add New Item. Selecione Web Service, e d a ele o nome de NorthwindDataProvider.asmx. Preste agora ateno ao Web Method HelloWorld().
[WebMethod] public string HelloWorld() { return "Hello World"; }

Existe algo diferente nele? Se voc reparar, vai ver que, antes do mtodo existe um atributo chamado WebMethod(). Esse atributo o que faz com que o C# saiba que voc quer que aquele mtodo esteja disponvel.

123

Apostila
Treinamento C#
Vamos alterar a classe NorthwindDataProvider para conter o seguinte cdigo:
using using using using using System; System.Web; System.Collections; System.Web.Services; System.Web.Services.Protocols;

using System.Data; using System.Data.SqlClient; /// <summary> /// Summary description for NorthwindDataProvider /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class NorthwindDataProvider : System.Web.Services.WebService { public NorthwindDataProvider () { //Uncomment the following line if using designed components //InitializeComponent(); }

[WebMethod] public DataSet ObterCliente(string customerId) { string connectionString = "Data Source=(local)\\SQLEXPRESS; " + "Initial Catalog=Northwind;Integrated Security=True"; string sqlQuery = "SELECT * FROM Customers "; sqlQuery += "WHERE CustomerId='" + customerId + "'"; SqlConnection connection = null; SqlDataAdapter adapter = null; DataSet dsCliente = new DataSet(); try { connection = new SqlConnection(connectionString); connection.Open(); adapter = new SqlDataAdapter(sqlQuery, connection); adapter.Fill(dsCliente); } finally { adapter = null; if( (connection != null) && (connection.State != ConnectionState.Closed) ) { connection.Close();

124

Apostila
Treinamento C#
} connection = null; } return dsCliente; } }

Essa funo retorna todos os dados de um cliente, utilizando como filtro o id do usurio. Clique com o boto direito em NorthwindDataProvider.asmx, e selecione Set As Start Page. Agora vamos rodar a nossa aplicao, e verificar o seu funcionamento. Use o id ALFKI para verificar o que acontece.

Consumindo um Web Service


Vimos, na sesso anterior, como criar um Web Service que faz uma consulta a um banco de dados e disponibiliza essa informao. Mas como consumimos os dados de um Web Service? Vamos ver isso com um exemplo. Abra a soluo WindowsApplicationCS. Adicione um novo Form

FormWSConsumer.cs. Como nas outras vezes, edite o arquivo Program.cs, e altere a linha do Application.Run para que ele execute o seu cdigo:
Application.Run(new FormWSConsumer());

Agora, adicione os seguintes controles: 1 Label Altere a propriedade Text para Customer Id:; 1 Textbox Altere a propriedade (Name) para txtCustomerId; 1 Button Altere a propriedade (Name) para btnSearch, e a propriedade Text para Buscar; 1 DataGridView Altere a propriedade (Name) para dgvCustomer.

125

Apostila
Treinamento C#

Agora, clique com o boto direito no projeto, e selecione Add Web Reference.... Uma nova janela ir surgir.

Em URL, digite http://localhost/NorthwindWS/NorthwindDataProvider.asmx e clique em Go. Ele ir buscar para verificar se o Web Service realmente existe. Em Web Reference name:, escreva NorthwindWS, e selecione Add Reference. Agora, clique com o boto direito no projeto, e selecione Build. Isso ir compilar o projeto, o que ir facilitar a incluso do Web Service no cdigo. Agora, clique 2 vezes no boto buscar. Voc abrir o mtodo btnSearch_Click, que ir tratar o evento clique do boto. Adicione o seguinte cdigo:

126

Apostila
Treinamento C#
DataSet dsClientes = new DataSet(); NorthwindWS.NorthwindDataProvider ndp = new NorthwindWS.NorthwindDataProvider(); dsClientes = ndp.ObterCliente(txtCustomerId.Text); dgvCustomer.DataSource = dsClientes.Tables[0];

Rode o seu programa, em CustomerId preencha ALFKI, clique no boto Buscar e verifique o resultado.

Vimos assim como consumir os dados de um Web Service. Esse exemplo se encontra no CD do treinamento.

Distribuindo um Web Service


Para distribuir o seu Web Service para outra mquina, clique com o boto esquerdo sobre o projeto. Verifique que a barra de configuraes de projeto passa a ser:

Onde o boto Clique nele.

efetua a funo de copiar um site web de um local para outro.

A janela que se abrir permite copiar o projeto para outra localizao.

127

Apostila
Treinamento C#

Vamos criar uma duplicata do nosso WS, no diretrio virtual NorthwindWS2. Na barra superior, clique em Connect.

Voc pode ver, no lado esquerdo, que os arquivos podem ser copiados para diversos locais. Selecione Remote Site, clique em New Web Site....

128

Apostila
Treinamento C#
Na janela Create New Frontpage e clique Web, OK. em O Web Visual URL, Studio digite criou, http://localhost/NorthwindWS2

automaticamente, um novo site web vazio, com o nome dado. Agora, volte tela anterior. Veja que agora, voc j est conectado ao site:

Selecione todos os arquivos e clique em

para enviar os arquivos. Os arquivos

selecionados sero enviados automaticamente. Agora, verifique que o novo site Northwind2 tambm funciona, abrindo o navegador e digitando http://localhost/NorthwindWS2/NorthwindDataProvider.asmx.

Reviso
Esperamos que, nesse ponto, voc j tenha compreendido o que um Web Service, e porque tanto se fala sobre isso. Alm disso, voc j deve ser capaz de criar um novo Web Service e como consumir os dados providos por um.

129

Apostila
Treinamento C#

Captulo 11 Depurao, Debug e Trace


Objetivos
Veremos nesse captulo quais so os principais recursos disponveis no Visual Studio 2005 para verificarmos o funcionamento de nossas aplicaes desde a depurao de cdigo, quanto log de passagem do sistema.

Depurando uma aplicao


A depurao de aplicaes uma ferramenta poderosa que o desenvolvedor dispe e que usa com freqncia. Um bom desenvolvedor deve conhecer bem as funes de depurao (debug), elas so importantes para que possamos testar a lgica da aplicao, a sequncia do fluxo, os valores de variveis e objetos que vo sendo usados ao longo da execuo, entre outros. Alm disso, a depurao nos permite rastrear e identificar bugs reportados pela equipe de testes ou que apareceram ao longo do ciclo de vida de aplicao. O Visual Studio 2005 tem uma interface de depurao poderosa e amigvel, que nos permite rastrear com rapidez o estado de variveis e objetos, acompanhar o fluxo de execuo, inspecionar a lista de chamadas, entre outros. A seguir sero descritas as funcionalidades e as telas respectivas. A maioria das telas abaixo so acessveis apenas em modo de debug mas, se voc j estiver nesse modo e mesmo assim no tiver aceso a elas, procure ativlas na opao View no menu superior do Visual Studio. Para o exemplo, usaremos uma rotina simples que preeenche duas matrizes usando o seguinte critrio: se o elemento estiver na diagonal principal (os seus ndices so iguais) , ento ele deve conter o valor 1;

130

Apostila
Treinamento C#
se o elemento no estiver na diagonal principal (os seus ndices so iguais), o elemento deve conter a soma 0. O cdigo est logo a seguir:
public static class CalculaMatrizDiagonal { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Matriz m = new Matriz(); int[,] diagonal = new int[3, 3]; diagonal = m.ObterMatrizDiagonal(diagonal); for (int linha = 0; linha <= diagonal.GetUpperBound(0); linha++) { for (int coluna = 0; coluna <= diagonal.GetUpperBound(1); coluna++) { Console.Write(diagonal[linha, coluna].ToString()); } Console.Write("\n"); } Console.ReadLine(); } } public class Matriz { public int[,] ObterMatrizDiagonal(int[,] matriz) { for (int linha = 0; linha <= matriz.GetUpperBound(0); linha++) { for (int coluna = 0; coluna <= matriz.GetUpperBound(1); coluna++) { if (linha == coluna) { matriz[linha, coluna] = 1; } else { matriz[linha, coluna] = 0;

131

Apostila
Treinamento C#
} } } return matriz; } }

Breakpoints e condies Para criar um breakpoint, basta clicar na barra cinza, esquerda do cdigo, e criado um breakpoint. Esse procedimento corriqueiro e bem conhecido pelos desenvolvedores. O que pouco usado o recurso de se depurar usando condies, como pode ser visto na janela Breakpoints, como pode ser visto abaixo:

No exemplo mostrado, a interrupo s acontecer quando a condio (linha == 1) && (coluna == 2) for verdadeira. Para criarmos condies para breakpoints, podemos usar tanto a janela acima quanto o menu pull-down que aparece ao clicar com o boto direito sobre o breakpoint:

132

Apostila
Treinamento C#

Watch Window A Watch Window permite adicionar expresses e variveis, para que possamos verificar o resultado enquanto estamos debugando o nosso cdigo.

O QuickWatch A janela Quickwatch permite que inspecionemos variveis e objetos. A grande novidade do Quickwatch na verso 2005 do Visual Studio o Intellisense, que permite que tenhamos acesso a uma lista de propriedades e mtodos quando digitamos o nome de uma classe ou objeto. Quando o elemento sendo verificado um objeto, o Quickwatch mostra os detalhes internos em forma de rvore, o que torna muito fcil entender o funcionamento interno desse elemento. Para acessar o Quickwatch, basta apertar Ctrl+Alt+Q ou ento em modo de debug clicar sobre uma varivel e selecionar Quickwatch.

133

Apostila
Treinamento C#
No exemplo a seguir, vemos uma tela do Quickwatch mostrando o objeto Me (no caso, o Form1), e abrimos a estrutura do objeto Font, aonde somos capazers de ver as propriedades internas desse objeto:

A janela Output Na janela Output mostrada a sada do console. Ali possvel ver no s o progresso da compilao, mas tambm todas as mensagens que so enviadas ao console como, por exemplo, System.Console.Write().

A janela Immediate A janela Immediate permite usar expresses para verificar o contedo das variveis contidas no escopo.

134

Apostila
Treinamento C#
As janelas Locals e Auto As janelas Locals e Auto tem como funo mostrar as variveis que esto dentro de um escopo. A diferena que o escopo da janela Autos a classe em questo, e a janela Locals mostra as variveis que esto ou sero usadas nas trs linhas anteriores e nas trs linhas posteriores.

Debug e Trace
As classes Debug e Trace permitem escrever informaes de depurao de cdigo, para diversos tipos de sadas diferentes. No caso do Debug, as sadas sero geradas apenas quando compilamos a nossa aplicao em modo debug. J a classe Trace envia os dados para a sada tanto no modo debug, quanto no modo release. A maior vantagem do Debug e do Trace a possibilidade de ligar e desligar atravs de um ajuste no arquivo de configurao da aplicao. Ambas as classes esto contidas no namespace System.Diagnostics. Mtodos do Debug e do Trace Os mtodos da classe Debug e da classe Trace so estticos, isso , os mtodos so chamados sem instanciar as classes.

135

Apostila
Treinamento C#
So esses mtodos: Write: escreve um texto e o envia para os listeners; WriteLine: o mesmo que o anterior, adicionando um smbolo de retorno (\n) ao final; WriteIf: escreve um texto e o envia para os listeners se a condio entrada for avaliada como True; WriteLineIf: idem, adicionando um smbolo de retorno (\n) ao final; Assert: escreve um texto e o envia para os listeners se a condio entrada for avaliada como False. Alm disso, o Assert tambm faz com que esse texto seja mostrado em um MessageBox; Fail: o mesmo que Assert, mas no verifica nenhuma condio; Flush: faz com que as mensagens acumuladas no buffer sejam descarregadas na sada; AutoFlush (propriedade): faz com que, ao receber uma mensagem, o Trace ou o Debug escrevam imediatamente para a sada; Indent e Unindent: aumentam ou diminuem o nvel de identao da sada, trazendo melhor legibilidade para o texto. Listeners Ambas as classes (Debug e Trace) escrevem para uma mesma coleo de sadas (chamada coleo de Listeners). Por padro, essa coleo j vem com um listener, que aponta para a janela de Console da aplicao. Entretanto, possvel adicionar novas sadas (listeners). Vamos ver como adicionar um listener que grava as mensagens em um arquivo texto. Para isso, vamos alterar o exemplo, para ao invs dele escrever no Command prompt com o Console.Write, ele escrever no Trace:
Matriz m = new Matriz(); int[,] diagonal = new int[3, 3]; diagonal = m.ObterMatrizDiagonal(diagonal);

136

Apostila
Treinamento C#
System.IO.FileStream fs = new System.IO.FileStream("c:\\teste.txt", System.IO.FileMode.OpenOrCreate); TextWriterTraceListener fileListener = new TextWriterTraceListener(fs); Trace.Listeners.Add(fileListener); Trace.AutoFlush = true; for (int linha = 0; linha <= diagonal.GetUpperBound(0); linha++) { for (int coluna = 0; coluna <= diagonal.GetUpperBound(1); coluna++) { Trace.Write(diagonal[linha, coluna].ToString()); } Trace.Write("\r\n"); }

Reviso
Vimos as principais janelas utilizadas na depurao de nosso cdigo, como inserir breakpoint e breakpoints condicionais, e como gerar um log do funcionamento de nossa aplicao atravs das classes Debug e Trace.

137

Apostila
Treinamento C#

Captulo 12 Distribuio
Objetivos
Agora que a nossa aplicao est funcionando corretamente, precisamos distribuir nossa aplicao para a mquina dos clientes. Veremos nesse captulo como distribuir nossas aplicaes: como criar um projeto de setup, como personaliz-lo e como configur-lo para distribuir corretamente a sua soluo, como usar a distribuio no formato Click-Once; e como gerar pacotes de atualizao.

Tipos de setup suportados


O Visual Studio permite que sejam criados os seguintes tipos de projeto: Setup Project, usado para construir instaladores de aplicativos Windows, gera arquivos .msi e .exe, sendo o arquivo .msi o instalador, e o .exe ; Merge Module Project, usado para construir pacotes de componentes, gerando arquivos com extenso.msm Cab Project, usado para construir arquivos .cab para distribuir componentes ActiveX que rodam em browser; Web Setup Project: usado para construir instaladores de aplicaes Web; Setup Wizard: assistente para criar os projetos de setup acima; Smart Device CAB Project: usado para criar instaladores para dispositivos mveis.

Criando um projeto de setup


Para criar um projeto de setup, possvel faz-lo dentro da mesma Solution ou criar uma Solution nova. Nesse exemplo, mostraremos como criar um projeto de setup na mesma Solution, embora criar uma nova Solution tenham passos similares.

138

Apostila
Treinamento C#
Para comearmos, crie um novo projeto, escolha Other Project Types, Setup and Deployment, e escolha Setup Wizard. Voc pode tambm mudar o nome e o diretrio do projeto:

Na tela seguinte, escolhemos o tipo de setup:

Na prxima tela escolhemos o que deve ser incluso no instalador:

139

Apostila
Treinamento C#

Uma das grandes vantagens de se criar um projeto de setup na mesma Solution em que se encontra a aplicao que a lista acima aparece, permitindo selecionarmos para cada projeto os grupos de arquivos que queremos incluir no setup (note que, no exemplo, temos os arquivos do projeto AdoptionLab1 e, logo abaixo, do projeto ConsumidorWS, repetindo as opces para todos os projetos da mesma Solution). As opes so: Localized resources: dlls e recursos de localizao do aplicativo; XML serialization Assemblies: caso existam assemblies serializados; Content Files: arquivos internos do projeto; Primary output: os assemblies que so compilados quando se faz Build do projeto. Essa a opo mais usada; Source files: caso se deseje incluir o cdigo-fonte do aplicativo no instalador; Debug symbols: para incluir os debug symbols, que auxiliam programadores avanados e o prrpio Visial Studio a debugarem a aplicao sem necessariamente ter o cdigo-fonte;

140

Apostila
Treinamento C#
Documentation files: arquivos de documentao gerados pelo Visual Studio.

A tela seguinte permite incluir outros arquivos, como por exemplo arquivos de Help, arquivos readme.txt e outros que no so diretamente gerenciados pelo Visual Studio:

A prxima tela confirma as opes escolhidas e encerra o assistente, criando mais um projeto no Solution.

Personalizando o setup

141

Apostila
Treinamento C#
Nas propriedades do projeto de Setup esto os primeiros itens configurveis. Os que mais so usados so:

Manufacturer: nome da empresa, pode ser usada para montar o caminho (path) de instalao;

ProductCode, UpgradeCode, Version: vistos mais frente; Localization: configuraes regionais do instalador, incluindo no s a formatao de nmeros, mas tambm a lngua em que sero mostradas as mensagens. Para as telas padro (veja ainda nesse captulo detalhes das telas de setup), as mensagens esto disponveis em vrios idiomas, inclusive o Portugus.

O projeto de setup tem diversas opes que pode ser customizadas. A maioria acessvel ao se clicar no projeto com o boto direito e escolher View:

142

Apostila
Treinamento C#

Seo File System Na seo File System podemos incluir, excluir e alterar os arquivos que sero inclusos no nosso instalador. Tembm nessa seo que podemos alterar o caminho (path) padro em que o programa ser instalado, como veremos a seguir.

Note que a maioria dos itens possui pginas de propriedades, como a mostrada na figura. Nas propriedades de Application Folder, temos uma configurao importante: o caminho default de instalao da aplicao, na propriedade DefaultLocation. Em Application Folder, colocamos todos os arquivos e pastas que sero criados no diretrio da aplicao. Para adicionar arquivos, clique com o boto direito em Application Folder e clique em Add.

143

Apostila
Treinamento C#
Em Users Desktop ficam os cones e as pastas que queremos que o instalador adicione rea de Trabalho do usurio. Em Users Program Menu ficam os cones que sero colocados na pasta Programas no menu Iniciar. A cada opo, podemos ver a pgina de propriedades e notar configuraes importantes, como o bitmap de um cone ou a opo de resgitro de um componente COM.

Seo Registry Na seo Registry, possvel configurar para que o instalador crie chaves de registro na instalao.

Seo File Types Na seo File Types fazemos o mapeamento de extenses para as aplicaes. Essa opo pode fazer com que, por exemplo, arquivos de um certo tipo sejam abertas com uma de suas aplicaes. O instalador do Office, por exemplo, cria mapeamentos de arquivos .xls para serem abertos com o Excel.exe e arquivos .doc sejam abertos com o Winword.exe.

144

Apostila
Treinamento C#
Seo User Interface Nessa seo possvel configurar, editar e adicionar as telas do instalador:

Note no detalhe que, nas propriedades, podemos alterar o contedo da mensagem. Sempre que houver mudana de mensagem, o instalador aceitar como vlida a mensagem inserida nessa tela de propriedades, e desprezar a mensagem do arquivo de linguagem respectivo, conforme selecionado nas propriedades do projeto. H tambm a possibilidade de incluir novas telas a partir de templates prontos (no possvel customiz-las alm do que o Visual Studio oferece) e, inclusive, capturar nessas telas variveis que sero usadas como condies do instalador. Consulte a documentao para ver mais detalhes. Sees Custom Actions e Launch Conditions A seo Custom Actions permite que sejam chamados scripts, classes ou mtodos estticos dentro de assemblies. Isso usado para, por exemplo, fazer o registro de uma verso full do aplicativo atravs do setup.

145

Apostila
Treinamento C#
Na ltima opo, Launch Conditions, possvel condicionar a instalao presena de certos arquivos, chaves de registro ou instalador (opo Search Target Machine) e tambm condies do instalador, como a presena do framework 2.0 (opo default do instalador) e outras condies, como a verificao de um arquivo ou uma chave criada em uma das telas customizadas do projeto de setup.

Criando um projeto de atualizao


Uma dvida recorrente e que mereceu tpico separado o projeto de atualizao. A sua configurao simples e feita nas propriedades do projeto:

Para fazer com que o projeto de instalao reconhea que uma nova verso, basta atualizar a propriedade Version. Uma janela perguntar se voc deseja atualizar o cdigo da verso, basta clicar em Yes e o seu GUID ser atualizado. Note tambm a opo RemovePreviousVersions, que poder ser alterada caso voc deseje que o instalador, na atualizao, remova as verses anteriores.

146

Apostila
Treinamento C#

Click-once deploy
Note que ao clicar com o boto direito em qualquer um dos projetos do tipo WindowsApplication, h a opo Publish. Essa opo nos permite publicar um instalador simples que pode ser rapidamente publicado em um servidor Web para download ou atualizao.

Para acessar o ClickOnce o click-once, basta selecionar Publish... e o assistente do ClickOnce entrar em ao. Primeiro precisaremos escolher aonde sero disponibilizados os arquivos de deistribuio:

Depois escolhemos o tipo da aplicao:

147

Apostila
Treinamento C#

A primeira opo nos permite criar um instalador que criar atalhos no menu Iniciar e permitir que a aplicao seja desinstalada atravs na opo Adicionar/Remover Programas, que pode ser acessada pelo painel de controle. A segunda opo nos permite criar um instalador mais simples, que apenas faz com que a aplicao execute. Entretanto, o usurio tem sempre que acess-la atravs de rede, fazendo o seu download sempre que dela precisar. Na ltima tela, confirmamos as opes escolhidas e, ao clicar em Finish, o ClickOnce comea a trabalhar. Ao final, o Visual Studio chama um novo browser e j mostra uma pgina-modelo para fazer download da aplicao:

148

Apostila
Treinamento C#

Reviso
Vimos nesse captulo como distribuir nossas aplicaes. Passamos por uma parte mais genrica, com a criao do projeto de setup, criao de pacotes de atualizao, e o Click-Once. Terminamos falando especificamente do deploy das aplicaes que desenvolvemos com o VSTO.

149

Apostila
Treinamento C#

Apndice A Referncias
Livros e Revistas
Developing Windows-based applications with Microsoft Visual Basic.NET and Visual C#.Net. Microsoft Press. Essential .NET, Volume I: The Common Language Runtime, por Don Box e Chris Sells. Building Web Solutions with ASP.NET and ADO.NET, por Dino Esposito, da Microsoft Press. .NET Programming: A Practical Guide Using C#, Pradeep Tapadiya, da Ed. Prentice Hall. Test-Driven Development in Microsoft .NET, por James W Newkirk e Alexei A. Vorontsov Revista MSDN Magazine Ela possui uma verso em portugus e uma em ingls. A verso em Ingls pode ser vista gratuitamente em http://msdn.microsoft.com/msdnmag/default.aspx. J a verso em portugus, voc pode assinar em http://www.neoficio.com.br/msdn.

Sites
.NET e Visual C#
Microsoft ASP.NET Site oficial da Microsoft sobre ASP.NET http://www.asp.net MSDN Brasil Outro site official da Microsoft, trata das plataformas de desenvolvimento Microsoft http://www.microsoft.com/brasil/msdn/Default.aspx Visual C# Walkthroughs http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsintro7/html/vxoriVCSharpWalkthroughs.asp Code Project http://www.codeproject.com C# Reference

150

Apostila
Treinamento C#
http://msdn2.microsoft.com/en-us/library/618ayhy6(VS.80).aspx C# Programming Guide http://msdn2.microsoft.com/en-us/library/67ef8sbd(VS.80).aspx C# Keywords http://msdn2.microsoft.com/en-us/library/x53a06bb(VS.80).aspx

Windows Forms
Introducing a New Data Grid http://msdn.microsoft.com/vstudio/default.aspx?pull=/library/en-us/dnvsdev05/html/vs05a9.asp Windows Forms Demos http://www.windowsforms.net/Default.aspx?tabindex=4&tabid=49

XML
XML Tutorial http://www.w3schools.com/xml XML Introduo http://www.macoratti.net/xml.htm DTD Tutorial http://www.w3schools.com/dtd XML Schema Tutorial http://www.w3schools.com/schema System.Xml Namespace http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemxml.asp .NET System.Xml Class Reference http://www.topxml.com/system_xml/default.asp Acessando XML remoto e buscando informaes com o Namespace System.Xml.XPath http://www.linhadecodigo.com.br/artigos.asp?id_ac=563&pag=1 Migrando arquivos Textos delimitados para XML http://www.macoratti.net/vbn_xml.htm

151

Apostila
Treinamento C#
Distribuio
Deploying .NET Framework-based Applications http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/DALGRoadmap.asp

152

Potrebbero piacerti anche