Você está na página 1de 118

Framewoks de

Desenvolvimento

Frameworks de Desenvolvimento

Contedo
Unidade 1 Definio de Framework

Classificao dos Frameworks

Profissionais Envolvidos

Benefcios e Desafios Decorrentes da Adoo de um Framework

Unidade 2 Plataforma de Desenvolvimento Java

10

11

Ambiente Eclipse

Unidade 3 Introduo ao Framework .NET

18

Viso Geral

19

O que o Framework .NET

19

Common Language Runtime

19

Biblioteca de Classes do Framework .NET

20

Dificuldades encontradas no desenvolvimento de sistemas para Windows antes do .NET

21

A abordagem .NET

24

Unidade 4 A Arquitetura .NET

25

CLR (Commom Language Runtime)

25

CTS (Common Type System)

25

CLS (Common Language Specification)

26

BCL (Base Classe Library)

26

Unidade 5 Criando Aplicaes com o Visual Studio

28

Verses do Framework .NET e Visual Studio

28

Conhecendo a IDE

29

Criando um Novo Projeto

29

Componentes da IDE

31

Menu

13

31

Frameworks de Desenvolvimento

Toolbar (Barra de Ferramentas)

32

Toolbox

32

Solution Explorer

35

Properties

36

Janela de Design

38

Janela de Cdigo Code View

38

Criando um Hello World

38

Criando uma Calculadora

40

Passo 1 Ajustando o Formulrio

41

Passo 2 Posicionando os Controles

41

Passo 3 Adicionando Funcionalidades

43

Unidade 6 Programao Orientada a Objetos


Introduo

47

Por que OOP existe?

47

Conceitos de encapsulamento, herana e polimorfismo

50

Implementao prtica dos conceitos

52

Herana e Agregao

56

Interfaces

63

Tratamento de excees

69

Converso de tipos (Typecasting)

75

Unidade 7 Segurana em Aplicaes .NET

81

Utilizao de Strong Names

81

A importncia do StrongName

82

SQL Injection

86

Unidade 8 Acessando Dados com ADO

47

88

Camada Desconectada

88

Camada Conectada

88

Frameworks de Desenvolvimento

ADO Object Model

89

Camada Desconectada

89

Camada Conectada

90

Contectando a um Banco de Dados

91

Criando um Banco de Dados

91

Criando um Formulrio de Insero de Dados

93

Criando uma Listagem de Dados

96

Unidade 9 Depurando Aplicaes no Visual Studio

99

Erros de Sintaxe (Syntax Errors)

99

Erros em tempo de execuo (runtime)

99

Erros de Semntica

99

A Classe Debug

100

Habilitando a Depurao

100

Adicionando BreakPoints

101

Executando a Aplicao em Modo de Depurao

101

Execuo Passo a Passo

101

Usando a Janela de Depurao

102

Exibindo a Janela Window

102

Depurao Remota

102

Tracing

102

Classe TraceContext

103

Habilitando o Tracing em uma Aplicao Web

104

Dados do Trace

104

Categorias do Trace

104

Unidade 10 Compilando, Testando e Distribuindo Aplicaes .NET ..........................106


Criando um Projeto de Instalao

106

Frameworks de Desenvolvimento

Unidade 1
Definio de Framework

Um framework captura a funcionalidade comum a vrias aplicaes.


As aplicaes devem ter algo razoavelmente grande em comum: pertencem a um mesmo
domnio de problema:
A definio que usamos foca quatro caractersticas principais de um framework (Orientado a
Objeto):
- Um framework prov uma soluo para uma famlia de problemas semelhantes;
- Usando um conjunto de classes e interfaces que mostra como decompor a famlia de
problemas;
- E como objetos dessas classes colaboram para cumprir suas responsabilidades;
- O conjunto de classes deve ser flexvel e extensvel para permitir a construo de vrias
aplicaes com pouco esforo, especificando apenas as particularidades de cada aplicao;

Observe que um framework uma aplicao quase completa, mas com pedaos faltando.
Ao receber um framework, seu trabalho consiste em prover os pedaos que so especficos
para sua aplicao.
5

Frameworks de Desenvolvimento

Na prtica, ento, um framework um conjunto de facilidades definidas por um conjunto de


funcionalidades que interagem entre si e que capaz de auxiliar no trabalho do desenvolvedor
em determinada rea de atuao desse framework.
Esse conceito comeou a ser utilizado para ajudar no processo de reutilizao de softwares ou
pedaos desses softwares.

Frameworks de Desenvolvimento

Classificao dos Frameworks


Orientados a objetos / baseados em componentes
Os frameworks podem ser classificados em caixa-branca e caixa-preta [Fayad 97]. Os
frameworks caixa-branca baseiam-se nos mecanismos de herana e ligao dinmica
(dynamic binding) presentes em orientao a objetos. Os recursos existentes em um
framework caixa-branca so reutilizados e estendidos a partir de: herana de classes do
framework e sobrecarga (overriding) de mtodos "hook" pr-definidos. Mtodos "hook" so
definidos em interfaces ou classes abstratas e devem necessariamente ser implementados por
uma aplicao. Um exemplo de mtodo hook na linguagem Java o actionPerformed(Action
Event e) pertencente interface ActionListener do framework AWT (Abstract Window
Toolkit). Este mtodo chamado sempre que ocorre um evento ActionEvent correspondendo,
por exemplo, a um clique de boto. Os padres de projeto (design patterns) utilizados so o
Command, o Observer e o Template Method [Gamma 94].
Frameworks caixa-preta so baseados em componentes de software. A extenso da
arquitetura feita a partir de interfaces definidas para componentes. Os recursos existentes
so reutilizados e estendidos por meio de: definio de um componente adequado a uma
interface especfica e integrao de componentes em um framework que utiliza padres de
projeto como o Strategy [Gamma 94].
Quanto ao contexto de utilizao do framework h uma classificao proposta em [Fayad 97],
segundo a qual os frameworks so classificados em: "Framework de Infraestrutura de
Sistema", "Framework de Integrao de Middleware" e "Framework de Aplicao".
Frameworks de infraestrutura de sistema tratam de questes de projeto como sistemas
operacionais, comunicao, interfaces grficas e linguagens de programao. O framework
AWT seria classificado como um framework de infraestrutura de sistema.
Frameworks de integrao de middleware so responsveis por integrar aplicaes
distribudas e componentes em uma mesma arquitetura. Exemplos de frameworks de
middleware so os ORB (Object Request Broker) como o CORBA - Common ORB
Architecture, e o RMI - Remote Method Invocation.
Frameworks de aplicao tratam de questes de projeto de domnios de aplicao, como
telecomunicaes, finanas, produo e educao. O framework que se est desenvolvendo
neste trabalho um framework de aplicao.

Frameworks de Desenvolvimento

Profissionais Envolvidos
No processo de desenvolvimento de um framework deve-se produzir uma estrutura de classes
com a capacidade de adaptar-se a um conjunto de aplicaes diferentes.
A principal caracterstica buscada ao desenvolver um framework a generalidade em relao
aos conceitos e funcionalidades do domnio tratado. Alm disso, fundamental que a
estrutura produzida seja flexvel.
Pode-se afirmar que o desenvolvimento de um framework diferente do desenvolvimento de
uma aplicao padro. A distino mais importante que frameworks tem que cobrir todos os
conceitos relevantes do domnio enquanto uma aplicao se preocupa somente com os
conceitos mencionados nos requisitos da aplicao (Bosh, 1999).
A complexidade em se desenvolver um framework deve-se aos seguintes fatores (Silva,
2000):
Necessidade de considerar os requisitos de um conjunto significativo de aplicaes de modo
a torn-lo genrico.
Necessidade de ciclos de evoluo voltados a dotar a estrutura de classes do framework de
alterabilidade (capacidade de alterar suas funcionalidades sem conseqncias imprevistas
sobre o conjunto da estrutura) e extensibilidade (capacidade de ampliar a funcionalidade
presente sem conseqncias imprevistas sobre o conjunto da estrutura).
Em termos prticos, dotar um framework de generabilidade, alterabilidade e extensibilidade
requerem uma cuidadosa identificao das partes que devem ser flexveis e a seleo de
solues de projetos de modo a produzir uma arquitetura bem estruturada. Isto conduz a
observao de princpios de projeto orientados a objetos.
Em termos ideais, um framework deve abranger todos os conceitos gerais de um domnio de
aplicao, deixando apenas aspectos particulares para serem definidos nas aplicaes
especficas (Silva, 2000).
No contexto de desenvolvimento, a existncia do framework estar sempre relacionada
existncia de outros artefatos que so originadores do framework, originados a partir dele ou
que exercem influncia na definio das estruturas de classes.
A figura mostra as vrias fontes de informao que influem na definio da estrutura de um
framework: artefatos de software existentes, artefatos de software produzidos a partir do
framework e o conhecimento do desenvolvedor do framework (ou a equipe de
desenvolvimento). As setas representam o fluxo de informaes que levam produo da
estrutura de classes do framework.
Como um framework geralmente no consegue ser uma construo completa de um domnio,
mas sim uma descrio aproximada, possvel que a construo de aplicaes sob um
framework leve obteno de novos conhecimentos do domnio tratado, que talvez no
estivessem disponveis durante a construo do framework. Estas novas informaes podem
levar necessidade de alterar o framework, causando a sua evoluo como ilustra a figura:
8

Frameworks de Desenvolvimento

Silva (2000) aborda que o desenvolvimento tradicional de aplicaes envolve dois tipos de
indivduos: o desenvolvedor de aplicao e o usurio de aplicao (ambos podem
corresponder a grupos de indivduos com diferentes funes).
Desenvolvedores devem levantar os requisitos de uma aplicao, desenvolv-la e entreg-la
aos usurios, que por sua vez interagem com a aplicao apenas atravs de sua interface.
O desenvolvimento de frameworks introduz outro indivduo, a saber, o desenvolvedor de
framework . Nesse contexto, o papel do usurio de aplicao o mesmo descrito acima. O
papel do desenvolvedor de aplicaes difere do caso anterior pela insero do framework no
processo de desenvolvimento de aplicaes. Com isto, o desenvolvedor de aplicaes um
usurio de um framework que deve estender e adaptar a estrutura deste framework para a
produo de aplicaes.
De forma genrica as atividades macros so descritas a seguir:
Anlise de domnio - processo de identificar e organizar o conhecimento sobre alguma
classe de problemas o domnio do problema para dar suporte descrio e soluo destes
(Arango e Prieto-Daz, 1991).
Projeto de framework o objetivo ao realizar essa atividade obter um framework flexvel.
A atividade rdua j que difcil encontrar as abstraes corretas e identificar as partes
estveis e variveis do framework. Para aumentar a extensibilidade e flexibilidade do
framework padres de projeto podem ser usados (Mattsson, 2000).
Instanciao do framework a instanciao difere dependendo do tipo de framework: caixa
branca (o usurio constri classes a partir das classes disponveis), caixa preta (o usurio tem
que escolher uma das classes fornecidas). Um framework pode ser instanciado uma ou mais
vezes dentro da mesma aplicao ou instanciado em diferentes aplicaes (Mattsson,2000).

Frameworks de Desenvolvimento

Benefcios e Desafios Decorrentes da Adoo de um


Framework
Os principais benefcios da utilizao de frameworks de aplicao orientada a objetos so a
modularidade, a reusabilidade, a extensibilidade e a inverso de controle que eles fornecem
aos desenvolvedores (Fayad e outros, 1999):
Modularidade: frameworks promovem a modularidade por encapsular detalhes de
implementao voltil em interfaces estveis. A modularidade ajuda a aumentar a qualidade
do software por localizar o impacto de mudanas no projeto e na implementao. Essa
localizao reduz o esforo requerido para entender e manter o software existente.
Reusabilidade: as interfaces estveis fornecidas pelo framework promovem a reusabilidade
por definir um componente genrico que pode ser reaplicado para criar novas aplicaes. A
reusabilidade influencia no conhecimento do domnio e prioriza os esforos de
desenvolvedores experientes a fim de evitar recriao e revalidao de solues comuns a
requisitos recorrentes de aplicaes e desafios de projeto de software.
Extensibilidade: um framework promove a extensibilidade por fornecer mtodos adaptveis
(hook) explcitos (Pree, 1995). Permitindo as aplicaes estenderem suas interfaces estveis.
A extensibilidade essencial para assegurar a especializao de novos servios da aplicao e
novas caractersticas.
Inverso de controle: a arquitetura do framework caracterizada por uma inverso de
controle. Isso permite ao framework (ao invs da aplicao) determinar que conjunto de
mtodos especficos da aplicao invocar em resposta a eventos externos.
Frameworks so considerados de grande importncia para o desenvolvimento de aplicaes
orientadas a objetos. Eles so considerados como uma das principais formas atravs da qual
sistemas orientados a objetos podem alcanar a reusabilidade.

10

Frameworks de Desenvolvimento

Unidade 2
Plataforma de Desenvolvimento Java

Plataforma Java o nome dado ao ambiente computacional, ou plataforma, da empresa Sun


Microsystems (agora Oracle).
A plataforma permite desenvolver aplicativos utilizando qualquer uma das linguagens criadas
para a plataforma Java, sendo a linguagem padro a que leva seu prprio nome: Linguagem
Java.
Uma grande vantagem da plataforma a de no estar presa a um nico sistema operacional ou
hardware, pois seus programas rodam atravs de uma mquina virtual que pode ser emulada
em qualquer sistema que suporte a linguagem Java.
O universo Java um vasto conjunto de tecnologias, composto por trs plataformas principais
que foram criadas para segmentos especficos de aplicaes:
- Java SE (Java Platform, Standard Edition). a base da plataforma; inclui o ambiente de
execuo e as bibliotecas comuns.
- Java EE (Java Platform, Enterprise Edition). A edio voltada para o desenvolvimento de
aplicaes corporativas e para internet.
- Java ME (Java Platform, Micro Edition). A edio para o desenvolvimento de aplicaes
para dispositivos mveis e embarcados.
Alm disso, podem-se destacar outras duas plataformas Java mais especficas:
- Java Card. Voltada para dispositivos embarcados com limitaes de processamento e
armazenamento, como smart cards e o Java Ring.
- JavaFX. Plataforma para desenvolvimento de aplicaes multimdia em desktop/web
(JavaFX Script) e dispositivos mveis (JavaFX Mobile).

Tecnologias Java
A plataforma Java constituda de um grande nmero de tecnologias, cada uma prov uma
poro distinta de todo o ambiente de desenvolvimento e execuo de software. Os usurios
finais, tipicamente, interagem com a mquina virtual Java (Java Virtual Machine, ou JVM) e
um conjunto padro de bibliotecas de classe.

11

Frameworks de Desenvolvimento

Existe um grande nmero de maneiras de se utilizar uma aplicao Java, inclundo applets
embutidas em pginas web, aplicativos de uso geral em desktops, aplicativos em aparelhos
celulares e em servidores de aplicaes para Internet.
Os desenvolvedores de aplicaes em Java utilizam um conjunto de ferramentas de
desenvolvimento, o JDK.

12

Frameworks de Desenvolvimento

Ambiente Eclipse
Eclipse um IDE (ambiente de desenvolvimento integrado) de cdigo aberto. Existe mais
ferramentas similares de cdigo aberto disponveis, mas o Eclipse IDE acabou tornando-se
uma tima alternativa em virtude da quantidade de plug-ins disponveis para dar suporte
aos diversos tipos de tecnologias que envolvem o desenvolvimento de softwares e sistemas.
Sua instalao muito simples, podemos baix-lo de http://www.eclipse.org em forma de
arquivo ZIP e s temos que descompact-lo na pasta onde quisermos t-lo instalado.
No site oficial, h opes para download que sugerem um desenvolvimento mais focado para
uma ou outra rea. Isso se deve ao fato de que essas opes de download j trazem embutidos
alguns plug-ins necessrios para facilitar o desenvolvimento dos projetos focados em uma ou
outra rea.
Para execut-lo basta acionar o arquivo Eclipse.exe. Uma vez iniciado abrir uma tela
inicial solicitando onde queremos que o Eclipse v salvando os projetos que criarmos:
Obs.: Nessa apostila optamos por usar a verso Eclipse IDE for Java EE Developers, que j
traz o suporte para o desenvolvimento de aplicaes web.

13

Frameworks de Desenvolvimento

Aps escolher a rea de trabalho (onde sero criados os diretrios - projetos com seus
cdigos), abrir a primeira tela da IDE, dando as boas vindas.

Essa pgina inicial pode ser fechada. Atrs dela est efetivamente o ambiente de
desenvolvimento.
Caso seja de seu interesse, navegue pelas opes que aparecem nessa tela inicial para obter
maiores informaes sobre a IDE.

14

Frameworks de Desenvolvimento

A primeira tela realmente significativa do Eclipse IDE possui uma srie de informaes
organizadas em painis.
O Package Explorer, que est no lado esquerdo da tela, a rea onde estaro dispostas as
informaes bsicas do seu projeto arquivos, diretrios, plugins, etc.
Os outros painis no so to importantes e alguns podem at ser fechados de acordo com a
preferncia do desenvolvedor.
Todos os painis podem ser abertos/fechados atravs do menu Window, em Show View.
Outro painel interessante o Outline, que fornece informaes sobre as classes, mtodos e
outros recursos usados no seu projeto.
Para vermos esses painis em pleno funcionamento, criaremos um exemplo bsico Ol
Mundo, como segue:
- V ao menu File e escolha New e dentro dessa opo Java Project.

15

Frameworks de Desenvolvimento

- Defina um nome para seu projeto.


- O Eclipse j encontra automaticamente o JDK instalado no seu computador, bastando
apenas avanar para a prxima etapa.
- Nessa prxima tela (que opcional) voc pode configurar plugins e outros recursos. Se isso
no for do seu interesse, apenas confirme e finalize essa etapa.

16

Frameworks de Desenvolvimento

- Na etapa seguinte, voc dever criar um novo arquivo, vinculado ao projeto Java que voc
acabou de criar.

- D um nome (Mundo) para esse novo arquivo (classe Java), escolha se voc quer que essa
nova classe j venha com o cdigo referente ao mtodo main e construtores da superclasse
(caso esteja herdando de outra classe).

17

Frameworks de Desenvolvimento

Como todo bom software de desenvolvimento, o Eclipse traz um auxlio ao desenvolvedor


quando esse est escrevendo o cdigo, que chamamos de auto completar.
Esse recurso permite que no seja necessrio decorar todas as possibilidades de uso das
funes e mtodos disponveis da linguagem.
Aps escrever o cdigo, podemos visualizar o resultado no painel Console (nesse nosso
exemplo) ou em um navegador (caso seja um projeto web) ou outro local conforme a
configurao do projeto criado.

Unidade 3
Introduo ao Framework .NET
18

Frameworks de Desenvolvimento

Viso Geral

O Framework .NET um framework de desenvolvimento criado pela Microsoft para a


criao de aplicaes voltadas s plataformas Microsoft e outras. Entender o
funcionamento bsico do Framework .NET essencial pois todo o desenvolvimento de
aplicaes utilizando esse framework se resume na utilizao das classes que compem o
mesmo.

Nesse captulo veremos os componentes chaves do Framework .NET, assim como o papel
que cada um desempenha.

O que o Framework .NET

O framework .NET possue dois componentes chaves:

O Common Language Runtime

A biblioteca de classes do .NET Framework

O Common Language Runtime (CLR) o agente que gerencia as aplicaes .NET em


tempo de execuo. Ele fornece recursos chave como gerenciamento de memria, threads,
e gerenciamento de recursos. As aplicaes que rodam sobre o CLR so conhecidas como
aplicaes de cdigo gerenciado (managed code), todas as demais so conhecidas como
aplicaes de cdigo no gerenciado (unmanaged code).

As bibliotecas do Framework .NET so um conjunto de classes reutilizveis que fornecem


todas as funcionalidades que sua aplicao necessita. Essas bibliotecas permitem voc
desenvolver tanto aplicaes Windows como aplicaes ASP.NET, ou mesmo aplicaes
para dispositivos mveis Windows Mobile.

Common Language Runtime

A Common Language Runtime (CLR) a mquina virtual do Framework .NET. Ela roda
em sistemas operacionais Windows (XP, Vista, Server, etc), e sua funo executar as
aplicaes .NET compiladas em um formato bytecode denominado MSIL (Microsoft
Intermediate Language). Durante a execuo, o CLR JIT (Just-in-time ) compila o
bytecode em linguagem de mquina nativo e executa a aplicao. Ou ainda, o cdigo
MSIL pode j estar precompilado em cdigo nativo, e nesse caso o JIT no necessrio, o
que aumenta o desempenho da aplicao.

O CLR oferece os seguinte servios:

Gerenciamento de memria e garbage collection

Gerenciamento de thread

19

Frameworks de Desenvolvimento

Gerenciamento de excees

Segurana

Os desenvolvedores .NET pode desenvolver aplicaes usando qualquer linguagem .NET


como C#, VB.NET, ou C++. O bytecode MSIL permite a criao de aplicaes .NET
portveis para outras plataformas pelo fato de as mesmas s serem compiladas em
linguagem de mquina na hora de sua execuo.

As aplicaes .NET no so aplicaes Win32 propriamente ditas (apesar de executarem


no ambiente Windows),razo pela qual o runtime Win32 no sabe como execut-las. O
Win32, ao identificar uma aplicao .NET, dispara o runtime .NET que, a partir desse
momento, assume o controle da aplicao no sentido mais amplo da palavra, porque,
dentre outras coisas, ele quem vai cuidar do gerenciamento da memria via um
mecanismo de gerenciamento de memria chamado Garbage Collector (GC) ou coletor
de lixo, acerca do qual falaremos mais tarde. Esse gerenciamento da memria torna os
programas menos susceptveis a erros. Mais ainda, o CLR como seu prprio nome o diz,
compartilhado e, portanto, no temos um runtime para VB.NET, outro para C# etc. o
mesmo para todo mundo.

Biblioteca de Classes do Framework .NET

A biblioteca de classes do Framework .NET permite a voc desenvolver:

Aplicaes console

Aplicaes windows

Windows services

Aplicaes ASP.NET

Web Services

Aplicaes Windows Communication Foundation (WCF)

Aplicaes Windows Presentation Foundation (WPF)

Aplicaes Windows Workflow Foundation (WF)

As bibliotecas de classe so organizadas utilizando a hierarquia de namespaces. Por


exemplo, todas as classes que executam operao de IO esto localizadas no namespace
System.IO, e as classes que executam expresses regulares esto localizadas sob o
namespace System.Text.RegularExpressions.

As bibliotecas do Framework .NET esto divididas em duas partes:

Framework Class Library (FCL)

20

Frameworks de Desenvolvimento

Base Class Library (BCL)

A BCL um subconjunto um subconjunto de toda a biblioteca e contm um conjunto de


classes que fornecem funcionalidades bsicas para suas aplicaes. Algumas classes da BCL,
esto guardadas na DLL mscorlib.dll, System.dll, e System.core.dll. A BCL est disponvel
em todas as linguagens suportadas pelo Framework .NET e encapsula todas funes comuns
como manipulao de arquivos, acesso a banco de dados, manipulao de graficos, e
documentos XML.
A FCL compem toda a biblioteca e fornece as classes para desenvolver todos os diferentes
tipos de aplicaes descritos acima.

Dificuldades encontradas no desenvolvimento de


sistemas para Windows antes do .NET
Algumas das dificuldades encontradas no desenvolvimento de sistemas Windows antes do
.NET so:
Complexidade associada a linguagens de programao de difcil sintaxe, e ainda as dores de
cabea provocadas pelo gerenciamento da memria heap por parte do programador.
Pouca integrao e reaproveitamento de cdigo entre linguagens de programao diferentes;
ausncia de implementao de mecanismo de herana entre linguagens diferentes.
Diversidade com pouca integrao na resoluo de problemas complexos, dificultando a
compreenso e o desenvolvimento dos sistemas.
Falta de portabilidade de cdigo executvel entre plataformas diferentes.

Vejamos a evoluo histrica das ferramentas da Microsoft:

21

Frameworks de Desenvolvimento

Apenas para ilustrar um pouco a situao atual, vamos apresentar um pequeno estudo de caso.
Para simplificar o nosso problema, vamos considerar apenas as solues Microsoft.
Imaginemos uma situao hipottica na qual solicitada uma soluo de home banking que
aceite requisies de um browser da Internet ou qualquer outro dispositivo como handheld,
telefone celular etc.; vejamos qual seria a resposta imediata dos recursos de software que eu
iria precisar:
1. Uma linguagem de programao para desenvolver as pginas dinmicas: de cara, VBScript
ou JScript.
2. Precisamos desenvolver alguns objetos COM ou COM+ no servidor, mas por questes de
performance e poder de linguagem, escolhemos a linguagem C++, e claro, o compilador C++
do MS Visual Studio.
3. Vamos precisar de alguns componentes para executar no MS Queue server ou ento no MS
transaction server, e escolhemos a linguagem Visual Basic porque temos pessoal que j fez
esse tipo de trabalho usando VB.
4. Bem, vamos falar o bvio, mas precisamos tambm de Web designers com domnio de
HTML, Flash, ferramentas de editorao grfica etc.
5. Ainda temos um problema para resolver, que o fato de termos clientes heterogneos que
no conseguem ler um formato padro como uma Web page em HTML.
Ok, agora o momento de correr atrs do pessoal com todas essas competncias, tentar
gerenciar essa salada de tecnologias e linguagens de programao e, de quebra, fazer
funcionar tudo direitinho.
22

Frameworks de Desenvolvimento

E esta era uma situao bem comum no desenvolvimento de software at pouco tempo atrs:
ter de costurar uma srie de linguagens + ferramentas + tecnologias + modelos de objetos +
linguagens de script vs. linguagens de programao completas + linguagens de marcao.
Usando o .NET podemos proporcionar uma soluo alternativa, de menor complexidade de
implementao, mais integrada:
1. Uma linguagem de programao para desenvolver as pginas dinmicas no servidor Web:
C# usando o Visual Studio.
2. Uma linguagem de programao para desenvolver objetos reusveis, armazenados em uma
DLL no servidor: C# usando o Visual Studio.
3. Uma linguagem de marcao malevel o suficiente de sorte que permita mostrar o
contedo em diversos dispositivos: XML, gerado pelo C# ou pr-montado para alguns casos.
4. Todo o trabalho de formatao e transformao dos documentos XML gerados pela
soluo de homebank ser feito usando XSL para gerar a linguagem de marcao suportada
no lado cliente. Ah! Com que linguagem vamos fazer estas transformaes? Com C# claro!
Mas os nossos desenvolvedores tm um background muito forte em VB, de forma que ns
descartamos o C# como alternativa. No tem problema, tudo o que foi dito acima continua
vlido, vamos mudar apenas a linguagem de C# para VB. A plataforma .NET permite que
usemos a linguagem de programao da qual mais temos domnio e mesmo assim
continuamos a usufruir todo o seu potencial.
O exemplo anterior foi apenas para ilustrar o contexto atual de desenvolvimento de sistemas
complexos, onde temos de realmente fazer uma ginstica muito grande integrar todas as
partes constituintes da nossa soluo. A boa notcia que, como mostramos no exemplo, com
.NET esta situao est, digamos assim, findando esse problema, porque, como voc pode ter
percebido, a sua soluo caiu de trs linguagens de programao para apenas uma, e o resto
das tecnologias que usamos (COM+, por exemplo) se integra perfeitamente com o restante da
soluo.
Apenas falando no quesito da clareza e reutilizao de cdigo, algumas bibliotecas de classes,
como MFC (Microsoft Foundation Class), surgem nesse nterim, mas tm como foco a
linguagem C/C++ e no podem ser usadas a partir do Power Builder, por exemplo, ou ento
Delphi, que tem a sua prpria biblioteca de componentes reutilizveis. O que equivale a dizer
que essas bibliotecas no podem ser usadas a partir de qualquer linguagem de programao, o
que torna o reaproveitamento de cdigo ainda mais difcil.

Mesmo tecnologias como COM e CORBA sempre apresentam os mesmos problemas de


dificuldade de aprendizado por causa de sua complexidade; ou ento, mesmo quando
oferecem um modelo de objetos comum a ser usado por outras linguagens que no VB ou
C++,acabam esbarrando no fato de que cada linguagem de programao implementa os tipos
de uma forma diferente. E finalmente, quando achamos que conseguimos resolver os
problemas dos tipos, somos barrados porque no conseguimos programar relaes de herana
entre linguagens diferentes.
23

Frameworks de Desenvolvimento

Paralelamente s iniciativas da Microsoft, em 1995 surge a linguagem JAVA (na verdade,


mais que uma linguagem, uma plataforma de desenvolvimento) e, apesar de oferecer h
mais de dez anos a proposta de portabilidade de cdigo executvel, (leia-se, compile uma
vez e rode em qualquer plataforma), JAVA-cntrica, o que obriga o programador a
aprender uma nova linguagem se realmente quiser usufruir os recursos que ela oferece. Mas
voc pode perguntar: e .NET no nos obriga a aprender C#? A resposta no e saberemos
mais adiante como isso feito.

A abordagem .NET
Citaremos a seguir algumas das caractersticas de .NET que visam a resolver os problemas
citados acima:
Independncia de linguagem de programao: o que permite a implementao do mecanismo
de herana, controle de excees e depurao entre linguagens de programao diferentes.
Reutilizao de cdigo legado: o que implica em reaproveitamento de cdigo escrito usando
outras tecnologias como COM, COM+,ATL, DLLs e outras bibliotecas existentes.
Tempo de execuo compartilhado: o runtime de .NET compartilhado entre as diversas
linguagens que a suportam, o que quer dizer que no existe um runtime diferente para cada
linguagem que implementa .NET.
Sistemas auto-explicativos e controle de verses: cada pea de cdigo .NET contm em si
mesma a informao necessria e suficiente de forma que o runtime no precise procurar no
registro do Windows mais informaes sobre o programa que est sendo executado. O
runtime encontra essas informaes no prprio sistema em questo e sabe qual a verso a ser
executada, sem acusar aqueles velhos conflitos de incompatibilidade ao registrar DLLs no
Windows.
Simplicidade na resoluo de problemas complexos.

24

Frameworks de Desenvolvimento

Unidade 4
A Arquitetura .NET

Para melhor entendermos tudo o que temos dito at aqui, vamos falar um pouco da arquitetura
de .NET e os seus principais componentes.

CLR (Commom Language Runtime)


O CLR, ou tempo de execuo compartilhado, o ambiente de execuo das aplicaes
.NET. Como o leitor j deve ter atentado, as aplicaes .NET no so aplicaes Win32
propriamente ditas (apesar de executarem no ambiente Windows),razo pela qual o runtime
Win32 no sabe como execut-las. O Win32, ao identificar uma aplicao .NET, dispara o
runtime .NET que, a partir desse momento, assume o controle da aplicao no sentido mais
amplo da palavra, porque, dentre outras coisas, ele quem vai cuidar do gerenciamento da
memria via um mecanismo de gerenciamento de memria chamado Garbage Collector (GC)
ou coletor de lixo, acerca do qual falaremos mais tarde. Esse gerenciamento da memria torna
os programas menos susceptveis a erros. Mais ainda, o CLR como seu prprio nome o diz,
compartilhado e, portanto, no temos um runtime para VB.NET, outro para C# etc. o
mesmo para todo mundo.

CTS (Common Type System)


O CTS, ou Sistema Comum de Tipos, que tambm faz parte do CLR, define os tipos
suportados por .NET e as suas caractersticas. Cada linguagem que suporta .NET tem de,
necessariamente, suportar esses tipos. Apesar de que a especificao no demanda que todos
os tipos definidos no CTS sejam suportados pela linguagem, esses tipos podem ser um
subconjunto do CTS, ou ainda um superconjunto. No mdulo dois falaremos mais a respeito
dos diferentes tipos especificados no CTS. Um conjunto de classes bsicas que define todos
os tipos implementado na CTS. Por exemplo: um tipo Enum deve derivar da classe System.
Enum e todas as linguagens devem implementar o tipo Enum dessa forma. Todo tipo deriva
da classe Object, porque em .NET tudo um objeto e, portanto, todos os tipos devem ter
como raiz essa classe. E dessa forma que os diversos tipos nas diversas linguagens so
implementados, obedecendo s regras definidas no CTS. Na .NET, e em C#
conseqentemente, todos os tipos derivam de uma raiz comum: a classe Object, o que
equivale a dizer que todos os tipos so objetos, por definio.

25

Frameworks de Desenvolvimento

CLS (Common Language Specification)


O CLS, ou Especificao Comum da Linguagem, um subconjunto do CTS, e define um
conjunto de regras que qualquer linguagem que implemente a .NET deve seguir a fim de que
o cdigo gerado resultante da compilao de qualquer pea de software escrita na referida
linguagem seja perfeitamente entendido pelo runtime .NET. Seguir essas regras um
imperativo porque, caso contrrio, um dos grandes ganhos do .NET, que a independncia da
linguagem de programao e a sua interoperabilidade, fica comprometido. A grosso modo,
dizer que uma linguagem compatvel com o CLS significa dizer que mesmo quando esta
sintaticamente diferente de qualquer outra que implemente .NET, semanticamente ela igual,
porque na hora da compilao ser gerado um cdigo intermedirio (e no cdigo assembly
dependente da arquitetura do processador) equivalente para duas peas de cdigo iguais,
porm escritas em linguagens diferentes. importante entender esse conceito para no pensar
que o cdigo desenvolvido em C# no pode interagir com cdigo desenvolvido em VB ou
outras linguagens, porque mesmo estas sendo diferentes, todas so compatveis com o CLS.

BCL (Base Classe Library)


Como era de se esperar, uma plataforma que promete facilitar o desenvolvimento de sistemas
precisa ter uma biblioteca de classes bsica que alavanque a simplicidade e a rapidez no
desenvolvimento de sistemas. este o objetivo da BCL (Biblioteca de Classes Base), oferecer
ao desenvolvedor uma biblioteca consistente de componentes de software reutilizveis que
no apenas facilitem, mas tambm que acelerem o desenvolvimento de sistemas. Na BCL
encontramos classes que contemplam desde um novo sistema de janelas a bibliotecas de
entrada/sada, grficos, sockets, gerenciamento da memria etc. Esta biblioteca de classes
organizada hierarquicamente em uma estrutura conhecida como namespace. Ao desenvolver
um componente de software reusvel, este precisa ser estruturado em um namespace para que
possa ser usado a partir de um outro programa externo. A seguir mostramos uma tabela com
alguns dos principais namespaces que fazem parte da BCL:

26

Frameworks de Desenvolvimento

27

Frameworks de Desenvolvimento

Unidade 5
Criando Aplicaes com o
Visual Studio

O Visual Studio 2008 um ambiente extremamente verstil e poderoso para o


desenvolvimento de aplicaes .NET.
Tcnicamente, possvel escrever aplicaes .NET usando um editor de texto simples e um
compilador. Entretanto, o Visual Studio torna essa tarefa muito mais fcil e produtiva por
possuir um ambiente totalmente integrado e voltado produtividade. Ele tambm
disponibiliza um depurador e tem suporte a IntelliSense.
Temos ainda a vantagem de trabalhar com todos os dados de forma integrada dentro de um
mesmo projeto, com suporte a versionamento e compilao distintas para ambientes de
produo e desenvolvimento, dando assim controle no gerenciamento do ciclo de vida da
aplicao.

Verses do Framework .NET e Visual Studio


A seguinte tabela mostra a relao entre a verso do Visual Studio e a verso do Framework
que contm o mesmo:
Verso do Framework

Verso Visual Studio

1.0

Visual Studio .NET 2002

1.1

Visual Studio .NET 2003

2.0

Visual Studio 2005

3.0

Disponibilizado com o Windows Vista

3.5

Visual Studio 2008

C om o Visual Studio 2008 possvel desenvolver para mltiplas verses do Framework


.NET: 2.0, 3.0 e 3.5. Permitindo a continuidade e migrao de aplicaes desenvolvidas em
28

Frameworks de Desenvolvimento

verses anteriores. Sem a necessidade de migrar toda a aplicao de uma s vez. Voc pode
tambm, criar uma nova aplicao voltada a uma verso anterior do Framework, bastando
para isso indicar a verso desejada ao criar um novo projeto.

Conhecendo a IDE
Ao iniciar o Visual Studio 2008, temos acesso a sua interface:

Criando um Novo Projeto


Para criar um novo projeto selecione File > New > Project

Ser exibida a caixa de diligo New Project, que exibir os templates de aplicaes do Visual
Studio.
Um grande nmero de templates de projetos e itens de projeto j vem pr-instalados com o
Visual Studio. Esses templates aparecem como tipos de projetos dentro do menu File > New
Project. Voc pode utilizar qualquer um desses templates para criar um projeto bsico que
criar para voc um conjunto mnimo de itens que sua aplicao necessita como classes,
29

Frameworks de Desenvolvimento

controles, e referncias a bibliotecas do framework. Voc pode usar os templates tanto para
criar aplicaes desktop Windows Forms, como aplicaes Web.

Os templates esto categorizados pela linguagem e pelo tipo de aplicao.


Um nome de projeto default apresentado (WindowsFormsApplication1) no campo Name e
tambm:
Location: a pasta onde o projeto ser salvo
Solution Name: o nome da soluo, que por default tem o mesmo nome do projeto.
Entretanto, voc pode modificar o nome da soluo se voc quiser que seja diferente.
Lembre-se que uma soluo pode ter mais de um projeto.
Create directory for solution: se voc desmarcar essa opo, uma soluo no ser criada para
o seu projeto.
Voc tambm pode, no canto superior esquerdo, selecionar a verso do Framework para qual
voc est desenvolvendo a aplicao:

30

Frameworks de Desenvolvimento

Selecione a linguagem Visual C#, nos templates Windows Forms Application e clique em
OK. Um novo projeto vazio ser criado.

Componentes da IDE

Menu
A barra de menu contm os comandos do Visual Studio como o menu File, para criao de
novos projetos, abertura de projetos existentes, opo de salvar projetos formulrios, etc.

31

Frameworks de Desenvolvimento

possvel de ser customizado em Tools > Customize.

Toolbar (Barra de Ferramentas)


Contm atalhos para muitos dos comandos mais utilizados. Assim como o menu tambm
customizavel, bastando para isso clicar com o boto direito em qualquer toolbar existente e
abrir uma lista de barras de ferramentas disponveis, e ao final da lista, a opo de
customizar as mesmas.

Toolbox
A Toolbox contm todos os controles que voc pode utilizar em suas aplicaes. Voc pode
arrastar os controles da toolbox para dentro do painel de design da sua aplicao.

Cada aba da toolbox contm controles agrupados para fins especficos. Voc pode criar sua
prpria tab para armazenar seus prprios controls. Para tanto basta clicar com o boto direito
na Toolbox e selecionar Add Tab.

32

Frameworks de Desenvolvimento

Para adicionar controles a Toolbox, clique com o boto direiton na aba em que voc quer
adicion-los e selecione a opo Choose Items. Abrir a caixa de dilogo Choose Toolbox
Itens.

Voc pode adicionar os seguintes tipos de controles Toolbox:


Componentes do Framework .NET
33

Frameworks de Desenvolvimento

Componentes COM
Componentes WPF
Atividades de Workflow

Voc tambm pode clicar no boto Browse e procurar pela DLL que contm os controles que
voc quer adicionar a aplicao. Outra maneira de adicionar controles Toolbox arrastando
a DLL para dentro da Toolbox.

Voc pode reposicionar a Toolbox arrastando e colocando ela dentro de um dos pontos de
ancoramento que aparecero na tela:

Se voc tiver problema de espao em seu monitor, pode ainda, utilizar o boto Auto Hide para
ganhar algum espao na tela.

34

Frameworks de Desenvolvimento

Solution Explorer
Na aba Solution Explorer, temos todos os arquivos e recursos utilizados em nosso projeto. A
soluo pode conter um ou mais projetos. Os botes diponveis na barra de ferramentas dessa
aba so:
Properties
Show All Files
Refresh
View Code
View Designer
View Class Diagram
Esses botes so sensveis ao contexto, ou seja, alguns deles podem no estar visveis
dependendo do tem que estiver selecionado. Por exemplo, ao selecionar o nome do projeto,
os botes View Code e View Designer no so mostrados.
Para adicionar novos itens como Formulrios ou Classes ao seu projeto, clique com o boto
direito sobre o nome do projeto no Solution Explorer, e selecione Add, e escolha o item a ser
adicionado:

35

Frameworks de Desenvolvimento

Voc tambm pode adicionar projetos novos em File>Add New Project ou existentes em File
> Existing Project. Quando voc tem mais de um projeto na aplicao, um dos projetos deve
ser marcado como StartUp Project. Que ser o projeto que ir ser depurado ao se pressionar
F5. Para alterar o projeto inicial, clique com o boto direito sobre o projeto que voc deseja
que seja o inicial e selecione Set as Startup Project.

Properties
A janela de propriedades mostra as propriedades associadas ao diversos itens selecionados no
projeto (Windows Forms, controles, projetos, solues etc).

A figura abaixo mostra a janela de propriedades de um objeto Windows Form. Por default as
propriedades so listadas por categoria, mas voc pode optar por visualiz-las em ordem
36

Frameworks de Desenvolvimento

alfabtica. Alternativamente, voc pode escolher exibir os eventos relacionados ao objeto


selecionado.
Todos os valores default so exibidos em fonte normal, enquanto os valores que voc alterar
so exibidos em negrito. Isso muito til para identificar rapidamente quais atributos voc
mudou.
Voc tambm pode usar a Properties window para exibir eventos. Para cada evento voc pode
associar uma funo j existente no projeto para gerencia-lo, ou ento criar uma,
simplesmente d um duplo clique na propriedade em que voc quer criar o evento.

37

Frameworks de Desenvolvimento

Janela de Design
A janela de Design permite voc visualizar e desenhar a interface da sua aplicao.
Dependendo do tipo de projeto que voc estiver desenvolvendo, um tipo diferente de janela
aparecer para voc arrastar controles para ela.
Para alternar para o code-behind da aplicao, voc pode tanto usar um duplo clique na
interface, ou usar um clique com o boto direito sobre o Solution Explorer e selecionar o item
View Code.

Janela de Cdigo Code View


Permite voc visualizar e escrever a lgica da sua aplicao. Voc pode alternar entre o modo
de design e o cdigo clicando nas tabs.

Voc pode organizar as tabs tanto horizontalmente como verticalmente, clicando com o boto
direito e selecionado New Horizontal Tab Group ou New Vertical Tab Group.

Criando um Hello World


Vamos criar nosso primeiro aplicativo Windows Form. Caso j se encontre no Visual Studio,
feche o projeto atual, se houver algum aberto, em File > Close Project. Vamos criar uma nova
aplicao Windows Form, v em File > New Project, em Project Types, selecione Visual C#
> Windows, no campo Templates selecione Windows Forms Application, no campo name d
o nome de HelloWorld e clique em Ok
38

Frameworks de Desenvolvimento

Na janela de Design, selecione o Form recm criado, e na janela Properties altere a


propriedade Text para Hello World.
Em seguida, altere a propriedade Name para frmHello.
Na Toolbox, abra a aba Common Controls e arraste um controle Button para dentro do Form.
Selecione o label recm criado, e na janela Properties altere a propriedade Text para Clique
aqui e a propriedade Name para btnOla.
Agora adicionaremos algumas funcionalidades ao Form. Na janela de Design, d um duplo
clique sobre o boto recm criado. Abrir a aba de edio do code-behind. Insira a seguinte
linha de comando:
MessageBox.Show("Hello world!");
O cdigo completo deve ficar como o a seguir:
using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
System.Windows.Forms;

namespace HelloWorld
{
public partial class frmHello : Form
{
public frmHello()
{
InitializeComponent();
}
private void btnOla_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello world!");
}
}
}
Seu formulrio deve ficar como o a seguir:

39

Frameworks de Desenvolvimento

Para execut-lo, v em Debug > Start Debugging ou pressione F5 ou ainda, clique no boto
Start Debugging da barra de ferramentas do Visual Studio. A aplicao deve executar
corretamente, se no hover erros, abrindo o formulrio, e ao clicar no boto aparecer a
seguinte mensagem:

Criando uma Calculadora


Nesse exemplo vamos criar uma calculadora. Ela ter dois campos para a entrada dos
nmeros a serem operados, um label para apresentao do resultado, e 5 cinco botes para
execuo das operaes de soma, subtrao, multiplicao, adio e potnciao, e tambm
um boto para limpar os campos e resultado e um boto para fechar a calculadora.
Inicie o Visual Studio, se voc j estiver como ele iniciado, salve o seu trabalho e feche o
projeto atual em File > Close Project.
40

Frameworks de Desenvolvimento

Crie um novo Projeto em File > New Project, em Project Types selecione Visual C# >
Windows, e em Templates selecione Windows Forms Application. No campo nome escreva
Calculadora e clique Ok.

Passo 1 Ajustando o Formulrio


Selecione o formulrio recm criado, e altere as propriedades do mesmo na janela Properties
conforme a seguir:
Text: Calculadora
Name: frmCalculadora

Passo 2 Posicionando os Controles


Arraste para o formulrio apartir da Toolbox, aba Common Controls, os controles listados
abaixo alterando suas propriedades conforme a seguir:

Controle Label
Text: Primeiro Operador
Name: lblOperador1
Controle Textbox
Name: txtOperador1

Controle Label
Text: Segundo Operador
Name: lblOperador2
Controle Texbox:
Name: txtOperador2
Controle Label
Name: lblResultado
Text: 0

41

Frameworks de Desenvolvimento

Controle Button:
Text: +
Name: btnSomar
Controle Button:
Text: Name: btnSubtrair
Controle Button
Text: *
Name: btnMultiplicar
Controle Button
Text: /
Name: btnDividir
Controle Button
Text: Pot
Name: btnPotenciacao
Controle Button
Text: Limpar
Name: btnLimpar
Controle Button
Text: Sair
Name: btnSair
Ajuste a forma, disposio e tamanho de cada controle conforme for necessrio e salve seu
projeto.
Seu formulrio deve ficar parecido com o a seguir:

42

Frameworks de Desenvolvimento

Passo 3 Adicionando Funcionalidades


Agora iremos adicionar algum cdigo C# para adicionar as funcionalidades da nossa
calculadora.
Primeiro criaremos trs variveis auxiliares que recebero os valores dos Operadores 1 e 2, j
convertidos de String para Double, e uma varivel Double para armazenar o resultado da
operao. E finalmente uma funo que far a converso dos valores nos campos
txtOperador1 e txtOperador2 para double.
Clique em uma rea sem controles do formulrio com o boto direito, e selecione View Code.
Dentro do cdigo C# do formulrio, vamos inserir o cdigo abaixo:

Primeiro vamos adicionar o cdigo para cculo da soma. Clique duas vezes sobre o boto +
e adicione o cdigo abaixo ao evento Click do mesmo:
using
using
using
using
using
43

System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;

Frameworks de Desenvolvimento

using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Calculadora
{
public partial class frmCalculadora : Form
{
double op1;
double op2;
double resultado;
public void converteEntradas() {
op1 = 0;
op2 = 0;
if (txtOperador1.Text != "")
{
Double.TryParse(txtOperador1.Text, out op1);
}
if (txtOperador2.Text != "")
{
Double.TryParse(txtOperador2.Text, out op2);
}
}
public frmCalculadora()
{
InitializeComponent();
}
}
}
Agora adicionaremos o cdigo ao evento click do boto somar. Para isso, alterne para a aba
Form1.cs [Design] e clique duas vezes sobre o boto +, adicione o seguinte cdigo:
private void btnSomar_Click(object sender, EventArgs
e)
{
converteEntradas();
resultado = op1 + op2;
lblResultado.Text = resultado.ToString();
}

Alterne novamente para o modo de Design e d um duplo clique no boto -:


44

Frameworks de Desenvolvimento

private void btnSubtrair_Click(object sender,


EventArgs e)
{
converteEntradas();
resultado = op1 - op2;
lblResultado.Text = resultado.ToString();
}

Observe que esse procedimento necessrio, pois ao fazer isso o Visual Studio,
automaticamente liga a funo sendo criada ao evento click do controle. O que pode ser
verificado na janela de propriedades, ao se clicar no boto Events
Da mesma forma para os demais botes com o cdigo abaixo:
private void btnMultiplicar_Click(object sender,
EventArgs e)
{
converteEntradas();
resultado = op1 * op2;
lblResultado.Text = resultado.ToString();
}
private void btnDividir_Click(object sender, EventArgs
e)
{
converteEntradas();
resultado = op1 / op2;
lblResultado.Text = resultado.ToString();
}
private void btnPotenciacao_Click(object sender,
EventArgs e)
{
converteEntradas();
resultado = Math.Pow(op1, op2);
lblResultado.Text = resultado.ToString();
}
private void btnLimpar_Click(object sender, EventArgs
e)
{
txtOperador1.Text = "";
45

Frameworks de Desenvolvimento

txtOperador2.Text = "";
}
private void btnSair_Click(object sender, EventArgs e)
{
Application.Exit();
}

Salve o projeto e execute a aplicao pressionando F5.

46

Frameworks de Desenvolvimento

Unidade 6
Programao Orientada a Objetos

Introduo
A programao orientada a objetos (OOP) veio para ficar, sem dvida nenhuma. Ela permite
que sistemas complexos sejam desenvolvidos com mais facilidade, tanto na implementao
inicial quanto na manuteno. O produto mais popular do Visual Studio at hoje tem sido o
Visual Basic. Porm, reclamava-se muito da ausncia de um suporte mais completo a todos os
requisitos que caracterizavam uma linguagem de programao orientada a objetos (OOP).
Com a arquitetura .NET, a Microsoft parece ter resolvido atender ao clamor da comunidade
de desenvolvedores atacando em todos os flancos. Vrios melhoramentos foram feitos no
Visual Basic, de forma que ele pode ser considerado agora como orientado a objetos; mas
em C#, sem dvida alguma, que se ter acesso a uma linguagem de programao que
implementa, de maneira simples e direta (sem as complicaes do C++), todos os requisitos
de uma linguagem OOP em conjunto com uma forte tipagem de dados (um dos pontos fracos
do VB). Com isso, a programao torna-se mais slida e muitos erros podem ser eliminados
ainda em tempo de compilao.

Por que OOP existe?


Antes de continuarmos, vamos voltar um pouco no tempo e entender de onde vem a idia por
trs da programao orientada a objetos. O conceito predominante de programao antes de
OOP era a chamada programao procedural. Consistia basicamente em dividir a tarefa de
programao em pequenos blocos de cdigo chamados de procedimentos (procedures, em
ingls), tambm conhecidos na poca como sub-rotinas. Em todos os casos, o que se fazia,
basicamente, era escrever um trecho de cdigo que manipulasse os valores de algumas
variveis e desse algum tipo de retorno.

Exemplificando (cdigo em portugus):


x = 0
Enquanto x < 10
47

Frameworks de Desenvolvimento

x = x + 1
Fim Enquanto

O exemplo acima muito simples, mas bastante ilustrativo. Mostra que existem dados
(variveis) e cdigos que manipulam esses dados (estruturas de controle). Qual o
inconveniente disso? Supondo que x fosse um valor que tivesse de ser exibido na tela, seria
necessrio acrescentar algum cdigo que fizesse isso. Ou seja, x no era capaz de se autoexibir na tela. O cdigo completo seria:

x = 0
Enquanto x < 10
x = x + 1
Fim Enquanto
PosicionarCursor 0,0
Imprimir x

Se fosse feita outra alterao no valor de x, voc teria de executar novamente os comandos de
impresso para que o valor fosse atualizado na tela. O ponto a que queremos chegar que
dados e cdigos eram concebidos como elementos separados. Havia, inclusive, uma definio
que dizia: dados + cdigo = programa.

Com a OOP, uma das idias bsicas era eliminar essa distncia entre dados e cdigo e fazer
com que ambos ficassem mais interligados. Ambos seriam capazes de interagir de forma mais
homognea e autnoma. Primeiramente, expandiu-se a idia de procedimento para a idia de
classe. Uma classe permite que vrios procedimentos e dados sejam armazenados dentro dela.
Os procedimentos passaram a chamar-se mtodos e os dados passaram a chamar-se
propriedades. Mas no foi uma mera maquiagem e uma mudana de nome para a mesma
coisa. De fato, o conceito de classe mudou radicalmente a viso da programao. Uma classe
define como um objeto deve funcionar. Fazendo uma analogia clssica, como o projeto de
uma casa: estabelece como as coisas tm de ser. A partir dessa planta, podem ser construdas
vrias casas idnticas. Isso chamado de instncia em OOP. Quando dizemos instanciar uma
classe, significa colocar no ar um objeto baseado na descrio da classe. Vamos usar o
prprio Windows como referncia. Uma das coisas mais comuns na interface do Windows o
boto OK. Voc provavelmente o ver na grande maioria das janelas que abrir. Observe que
ao clicar com o mouse sobre aquele boto, ele produz um efeito de forma que parece
realmente ter sido pressionado.
48

Frameworks de Desenvolvimento

Porm, no existem apenas botes OK. Voc encontra botes dos mais variados tipos nas
mais diversas janelas. Na figura anterior, voc nota que existem trs botes idnticos, cada
qual com um ttulo diferente. Internamente, a propriedade que define o rtulo do boto
chamada de Text. Assim como existe Text, existem diversas outras propriedades. Uma delas
Color, que define a cor do boto; outra define se o boto est pressionado ou no. Resumindo,
existem propriedades que definem diversos aspectos do boto. O grande detalhe que, ao
alterar uma propriedade, obtm-se um efeito imediato.
Exemplificando em forma de cdigo (fictcio):

BotaoOk.Pressionado = Verdadeiro

Ou
BotaoOk.Pressionar

Ambos os cdigos produzem um efeito imediato. Observe aqui duas coisas: primeiro, que a
propriedade ou mtodo vm sempre atrelados a um objeto. Segundo, que se parece muito com
a atribuio de uma varivel no primeiro caso ou lembra meramente a execuo de algum
procedimento no segundo cdigo. Voc poderia tambm ter os cdigos inversos:

BotoOk.Pressionado = Falso ou BotoOk.Liberar

A grande mgica em OOP que propriedades podem disparar a execuo de mtodos e


mtodos podem alterar os valores de propriedades sem que voc precise fazer nada para que
isso acontea ao manipular o objeto. Isso faz com que os objetos tenham vida prpria. Os
acadmicos gostam de dizer que a OOP faz com que voc programe moldando objetos
muito parecidos com a realidade. Bom, acho isso um exagero. Mas concordo que os
resultados que voc v so mais concretos, embora a programao por trs seja ainda mais
abstrata do que a procedural. Em relao a programao procedural e orientada a objetos,
importante salientar que ambas no so inimigas e que a OOP no veio para aniquilar
ningum. Pelo contrrio, a OOP abraa e expande o conceito de programao procedural para
horizontes ainda mais amplos.

49

Frameworks de Desenvolvimento

Conceitos de encapsulamento, herana e


polimorfismo
OK, objetos tm propriedades que podem ser manipuladas e gerar resultados visveis e
imediatos. Ento vamos primeiramente entender a mecnica de funcionamento dos objetos.
Como j dissemos, ao alterar o valor de uma propriedade, cdigos so executados de forma a
produzir um resultado visvel. No exemplo do boto, qualquer modificao nas propriedades
Color ou Text produziro efeitos imediatos. Porm, ao usar um objeto, voc no v o
cdigo nem precisa conhec-lo para criar um boto. Isto chamado de encapsulamento.Os
cdigos usados para alterar cores, ttulos, forma e aspecto do boto ficam escondidos na
implementao da classe. Tambm era possvel encapsular funcionalidade dentro da
programao procedural atravs da criao das chamadas bibliotecas de funes. Mas em
OOP, esse conceito vai um pouco alm. Vamos entender por qu. Suponha que voc no est
satisfeito e gostaria de criar botes redondos como os que voc encontra no painel do Media
Player do Windows, por exemplo. Voc precisa conhecer mais dois conceitos para poder
atingir esse resultado:

Herana e Polimorfismo.

Herana significa partir de algo j pronto e modific-lo com o propsito de deix-lo mais
adequado a determinada finalidade. Supondo que voc tem uma classe boto com
propriedades bsicas; voc pode herdar aquelas caractersticas bsicas e adicionar ainda mais
funcionalidade.O detalhe que, ao derivar uma classe a partir de outra, voc no precisa
conhecer o cdigo da classe anterior. A sua nova classe no trar os cdigos da classe pai.
Eles continuaro encapsulados l e voc poder us-los se quiser.O dado importante que
voc no precisa manipular os cdigos da classe pai.

Como a inteno seria criar um boto com caractersticas de funcionamento diferentes, muitas
das propriedades anteriores passariam a funcionar de modo diferente. Observe esquerda do
painel do Media Player que existem botes com os ttulos de Now Playing, Media Guide,
CD Audio etc. de se imaginar que exista uma propriedade Text para aquele tipo de boto
tambm. Ou seja, vamos assumir neste caso que existe a propriedade Text para todos os
botes do Windows. Mas por que alguns Texts so diferentes dos outros? Isso se chama
Polimorfismo. Ou seja, cada novo descendente de uma classe pode entender a propriedade
Text de uma forma diferente e aplicar seus prprios cdigos de modo a redefinir seu
comportamento. Resumindo, Herana, Polimorfismo e Encapsulamento so os trs
mecanismos bsicos que uma linguagem deve comportar para ser considerada inteiramente
orientada a objetos.

50

Frameworks de Desenvolvimento

Orientao a eventos

Um tpico que no deve ser confundido com orientao a objetos a orientao a eventos.
Uma linguagem de programao pode ser orientada a objetos sem ser orientada a eventos e
vice-versa. A unio desses dois conceitos, entretanto, produz resultados muito mais
interessantes que os dois separadamente. Como o prprio nome sugere, uma linguagem
orientada a eventos uma linguagem capaz de responder a determinados acontecimentos
dentro de um determinado ambiente. Os eventos podem ser muitos: o clique do mouse, uma
tecla pressionada, uma informao que chega pela placa de rede etc.

Em ambientes grficos, isso tem uma importncia essencial. O mouse, sem dvida alguma,
foi o dispositivo que mais causou reviravolta no mundo da programao orientada a eventos.
No tempo das telas de texto, muito comuns no ambiente DOS, mainframes e verses mais
antigas de Unix, o principal dispositivo de entrada de dados era o teclado. Vejamos um
exemplo de programa com interface de texto:

Numa tela como essa, se o usurio quisesse pular de um campo para o outro, teria de usar o
teclado e necessariamente passar pelos campos dentro de uma determinada seqncia.Como
advento do mouse, passou a ser possvel que o usurio se posicionasse em qualquer campo e
houve uma quebra de estratgia. Nos tempos da tela de texto, era o programador quem dava
as cartas e estabelecia a seqncia de operao de um programa. Hoje as coisas so diferentes,
o programa tem de estar preparado para responder a seqncia de eventos que o usurio achar
mais conveniente. Os sistemas operacionais tambm se tornaram multitarefa e vrias aes
podem estar acontecendo ao mesmo tempo. Programar com orientao a objetos combinada
com orientao a eventos significa criar mtodos que sero acionados quando determinadas
situaes ocorrerem. Geralmente, esses mtodos tm nomes como Obj_Click (Obj_Clicar),
Obj_KeyPress (Obj_PressionarTecla), assim facilitando sua identificao. Resumindo, o que
51

Frameworks de Desenvolvimento

fazemos posicionar estrategicamente um punhado de cdigos de programao em pontos do


programa que sero disparados em determinadas circunstncias. A sensao que se tem de
que a programao ficou mais solta e mais descontrolada, mas ocorre exatamente o
oposto.

Implementao prtica dos conceitos


Vejamos agora, em termos de cdigo, o que pode ser feito para criar classes em C#.
Conforme j foi visto no mdulo 2, C# uma linguagem inteiramente orientada a objetos, de
forma que tudo deve ser implementado dentro de classes. No existem variveis ou
procedimentos soltos. Apenas para relembrar, o esqueleto bsico de uma classe dever ter
mais ou menos o seguinte aspecto:

escopo class NomeClasse


{
// Propriedades
escopo tipo nome;
escopo tipo nome;
// Construtores
escopo NomeClasse
{
// Especificaes
}
// Mtodos
escopo tipo NomeMtodo
{
// Especificaes
}
}

52

Frameworks de Desenvolvimento

Evidentemente, esse exemplo est muito simplificado, mas traz a idia bsica: voc tem de
planejar quais sero as propriedades, os mtodos, os construtores, destrutores e seus escopos e
tipos.

Exemplo:

public class Cadastro


{
// Propriedades
public string CPF;
public string NomeCliente;
// Construtores
public Cadastro( )
{
MessageBox.Show( "Eu sou o construtor 'default'!" );
}
public Cadastro( string fCPF, string fNome )
{
// Comandos de inicializao
this.CPF = fCPF;
this.NomeCliente = fNome;
MessageBox.Show( "Eu sou um construtor customizado
e recebi " + fCPF + " e " + fNome + " como parmetros." );
}
// Mtodos
public bool Gravou( )
53

Frameworks de Desenvolvimento

{
// Cdigo para gravao
return true;
}
}

Em C#, a regra para definir um construtor muito simples: basta criar um mtodo cujo nome
seja idntico ao da classe. Toda vez que uma instncia da classe for criada, o construtor ser
automaticamente disparado. Observe tambm que, no exemplo anterior, foram criados dois
construtores para a mesma classe. Isso, em OOP, chamado de sobrecarga (overload) de
mtodo. A palavra sobrecarga pode trazer a idia de estresse ou excesso de trabalho, mas
nesse caso um elemento que nos ajuda e muito! Quando um mtodo sobrecarregado, o
editor do Visual Studio d uma indicao clara disso. Vamos tomar como exemplo o
MessageBox. Ao digitar MessageBox.Show, o editor mostra que existem doze alternativas
diferentes para o mtodo Show:

O que diferencia um do outro a combinao do nmero de parmetros, seus nomes e tipos.


Isso conhecido como assinatura do mtodo. O compilador reconhecer automaticamente
qual assinatura voc est usando. No caso da nossa classe, podemos escolher qual construtor
ser usado fornecendo a assinatura correta:

{
// Construtor 'default' chamado
Cadastro Ficha1 = new Cadastro( );
// Construtor otimizado chamado
Cadastro Ficha2 = new Cadastro( "123", "De Oliveira Quatro" );
}

54

Frameworks de Desenvolvimento

Um detalhe importante que criamos duas instncias da mesma classe e ambas jamais se
misturam. Outro detalhe que o chamado construtor default, o qual no recebe nenhum
parmetro, existe em todas as classes. Porm, se voc criar um novo construtor customizado
com parmetros, o construtor default silenciosamente removido. No nosso exemplo, a
reescrita do construtor default se tornou obrigatria a partir do momento em que quisemos
usar a inicializao padro de uma classe.

Vamos agora entender os escopos (visibilidade) de uma classe e de seus membros. Uma
propriedade (ou campo) ou mtodo podem ser public, protected, private ou internal. Em C#,
eles so chamados de modificadores de acesso.
Veja os significados:

Quando voc cria um objeto, muitos de seus elementos so visveis e outros esto escondidos.
Fazendo uma comparao com o mundo real, quando usamos um carro, muitos de seus
elementos (ou propriedades) so facilmente acessveis enquanto outros permanecem mais
bem-guardados. A velocidade, o nvel do combustvel, o cmbio, todos esses elementos so
visveis externamente. Outros permanecem mais escondidos e so usados indiretamente: a
injeo eletrnica, as vlvulas, os eixos de trao etc. Criar uma classe passa pela mesma
idia. Na verdade, a criao de uma classe lida com dois alvos: existe uma parte pensada no
programador que usar a classe em seu sistema e outra pensada no usurio, que normalmente
ver apenas a superfcie do objeto criado. Veremos o uso desses modificadores com
exemplos prticos e isso se tornar mais claro.

55

Frameworks de Desenvolvimento

Herana e Agregao
O trabalho de desenvolvimento de um nico sistema pode resultar na criao e/ou utilizao
de dezenas ou mesmo centenas de classes. Muitas dessas classes tm funcionalidades muito
distintas, mas outras se cruzam e se complementam. Por causa desses eventuais
cruzamentos de classes, fundamentalmente necessrio entender o modo como elas se
relacionam. Assim como na vida real com as mais diversas pessoas, duas classes podem se
relacionar baseada no ser e no ter. No caso do ser, diz-se que uma classe foi derivada
de outra e ambas tm uma relao de parentesco. Pelo outro lado, o ter especifica que uma
classe incorporou outra e ambas tm uma relao de
amizade.

Vamos tomar um exemplo da vida real: como se constri um computador? Existem muitas
peas que formam uma mquina completa hoje em dia: processador, HD, monitor etc.
Observe que a Intel produz novos processadores a partir dos preexistentes. A partir disso,
nota-se uma linha genealgica: 8086, 286, 386, 486, Pentium, Pentium II e por a vai. Cada
novo processador herda as caractersticas da gerao anterior e agrega novos recursos e mais
potncia. Ento podemos dizer que temos uma classe onde cada novo processador filho da
gerao anterior. Concluso: todos eles SO processadores.O relacionamento entre eles
baseado em ser. J um computador seria uma classe que agrega vrias outras. Assim como
o exemplo do processador, HDs, Impressora e tantos outros perifricos tambm tm sua linha
evolutiva. A gente diz que um computador TEM memria, disco rgido etc. Ou seja, trata-se
de uma classe que incorpora diversas outras.O relacionamento do computador com os demais
elementos do tipo ter. Fcil de entender na teoria, no ? Pois vejamos agora um pouco de
cdigo:

class Processador
{
public double Megahertz;
public int AnoFabricacao;
}
class Intel386 : Processador
{
public Intel386( )
{
56

Frameworks de Desenvolvimento

Megahertz = 33.3;
AnoFabricacao = 1993;
}
}
class DiscoRigido
{
public int CapacidadeGB;
}
class Computador
{
Intel386 MeuProcessador;
DiscoRigido MeuHD;
public Computador( )
{
MeuHD.CapacidadeGB = 70;
}
}

No exemplo anterior, Intel386 uma classe derivada a partir de Processador. DiscoRigido


uma classe independente e Computador tambm. Na classe Computador, so agregadas as
classes DiscoRigido e Processador.

Criao de Propriedades

Vamos explorar agora um pouco mais as possibilidades de criao de propriedades. Os


exemplos anteriores foram muito simples. Uma propriedade, preciso entender em primeiro
lugar, se parece muito com uma simples varivel, mas bem mais do que isso. Uma
57

Frameworks de Desenvolvimento

propriedade (tambm chamada de atributo, dependendo da forma como foi definida) um


valor ao qual associado um mtodo.
Toda vez que for lido ou gravado o valor da propriedade, mtodos podem entrar em ao.
Essas aes so definidas pelas palavras get e set.Na prtica, pode- se dizer que uma
propriedade composta de trs elementos: um campo (local onde armazena-se o valor,
tambm chamado de atributo), um mtodo de leitura (get) e um mtodo de gravao (set).
Veja o exemplo da nossa classe Cadastro reescrita dentro dessas premissas:

class Cadastro2
{
protected string fCPF;
public string CPF
{
set
{
fCPF = value;
}
get
{
return fCPF;
}
}
}

Como dissemos anteriormente, temos trs elementos. As variveis fCPF e fNome so os campos
(fields) onde os valores so efetivamente armazenados. Observe que se trata de variveis do
tipo protected, o que significa que s sero vistas pelas classes descendentes (lembre-se do
conceito de ser) e no sero manipuladas por outras classes (lembre-se do conceito de
ter). O set e o get, como voc pode notar, servem para recuperar e gravar novos valores. A
palavra value reservada no C# para receber o valor passado para a propriedade. Veja o
exemplo:

58

Frameworks de Desenvolvimento

InstanciaCadastro2.CPF = "123"; // Dispara o "set"


x = InstanciaCadastro2.CPF; // dispara o "get"

Para testar este cdigo, sugerimos que voc crie um projeto de teste bem simples,
apenas um formulrio com um boto e escreva o cdigo dentro do evento click desse boto.

Talvez voc esteja se perguntando agora quem foi o maluco que resolveu complicar tanto a
programao. Mas o fato que isso, acredite ou no, torna as coisas mais fceis. Se voc
tivesse de fazer com que um CPF fosse imediatamente validado ao ser atribudo, por
exemplo, ficaria muito mais fcil dessa forma. Ou seja, assim que o valor fosse informado, a
prpria classe seria capaz de identific-lo como vlido ou no. No nosso estudo de caso,
desenvolveremos um exemplo
baseado nessa idia.Uma das coisas que voc pode fazer com uma propriedade e no
consegue com uma varivel, por exemplo, torn-la somente leitura ou somente gravao.
No caso de ter uma propriedade somente leitura, implemente apenas o mtodo get. Se
implementar apenas o set, ela ser apenas de escrita. No caso de no ser uma propriedade
full e apenas um campo (atributo), a forma seria:
public readonly string CampoSomenteLeitura

Mtodos polimrficos

Vamos criar uma classe pensando em um mtodo cuja implementao seria diferente na
classe pai e na classe filha. Ou seja, a implementao da classe filha ser ligeiramente
diferente e melhorada em relao verso pai. Nesse caso, toda vez que temos um mtodo
que se modifica da classe pai para filho, esse mtodo chamado de virtual.
Em OOP, um mtodo virtual se caracteriza pela capacidade do compilador de detectar
mudanas de acordo com o contexto da classe e viabilizar o polimorfismo. Em bom
portugus: o mtodo camaleo.

Vejamos este trecho de cdigo para clarear um pouco mais:

class PrimeiraGeracao
59

Frameworks de Desenvolvimento

{
public virtual void Mensagem( string msg )
{
msg += " Primeira Gerao ";
MessageBox.Show( msg );
}
}
class SegundaGeracao : PrimeiraGeracao
{
public override void Mensagem( string msg )
{
msg += " Segunda Gerao ";
base.Mensagem( msg );
}
}

class TerceiraGeracao : SegundaGeracao


{
public override void Mensagem( string msg )
{
msg += " Terceira Gerao ";
base.Mensagem( msg );
}
}

60

Frameworks de Desenvolvimento

Observe que na primeira gerao, o mtodo Mensagem definido como virtual. Nas duas
geraes posteriores, ele definido como override. Dentro de cada mtodo override, observe a
presena da palavra-chave base. Ela essencial para permitir que o polimorfismo acontea.
Sua finalidade acionar a codificao escrita na classe pai (o nvel imediatamente anterior).
Apenas a Primeira Gerao gera uma sada na tela. As outras classes apenas agregam mais
informao
mensagem final. A terceira passa para segunda, que passa para a primeira, que efetivamente
imprime. Exemplo de utilizao:

TerceiraGeracao teste = new TerceiraGeracao( );


teste.Mensagem( "Mecanismo de Herana: " );

A grande vantagem por trs disso tudo que ao gerar uma nova verso do mtodo, voc no
precisa necessariamente conhecer o cdigo da classe pai para fazer a nova implementao. Se
quiser, pode at mesmo descartar o que foi escrito anteriormente, basta no incluir a chamada
atravs da palavra- chave base. Existe tambm uma outra palavra-chave bastante importante
nesse processo de herana e polimorfismo. Essa palavra this. A palavra this refere-se
sempre ao contexto atual. Na grande maioria dos casos, a palavra this pode ser omitida. Mas
quando existem coincidncias entre nomes de variveis ou parmetros com campos ou
propriedades de uma classe, conveniente usar this:

class ContextoPai
{
public string Nome; // this.Nome refere-se a este item
public ContextoPai( string Nome )
{
this.Nome = Nome;
}
}

Apenas para traar um paralelo, o this em C# seria idntico ao this em C++ e Java, idntico ao
me em Visual Basic e idntico ao self em Delphi.
61

Frameworks de Desenvolvimento

Um pouco de Concretismo e Abstracionismo

Bom, vamos dar alguns exemplos mais avanados de como criar mtodos em classes. Uma
das coisas que mais massacram as almas dos programadores estabanados, quando eles se
deparam com OOP, a necessidade primordial de planejamento. Muita gente simplesmente
senta na cadeira e comea a escrever, gerando um cdigo que muitas vezes complicado de
entender e dar manuteno. Para quem vai desenvolver classes, um mnimo de planejamento
absolutamente indispensvel no incio. como jogar xadrez. Se voc no consegue pensar
nos lances seguintes, o xeque-mate (e neste caso o seu rei ser o sacrificado) pode aparecer de
uma hora para outra. Baseado nessas premissas, no exagero dizer que a OOP requer um
nvel muito alto de abstrao por parte do programador. Um nvel de abstrao to alto que
ele pode simplesmente criar uma classe completamente vazia, oca, apenas para definir como
ser o seu formato final ou de seus descendentes. O C# suporta abstrao em classes atravs
de dois mecanismos: criao de classes e mtodos abstratos e interfaces. Uma classe abstrata,
como o prprio nome sugere, no traz uma implementao concreta. Ela serve para dar forma
a um projeto de classe. Veja o cdigo:

abstract class EntradaDeDados


{
public abstract string Conteudo( );
public abstract string Exibir( );
}

Normalmente, toda entrada de dados ter um contedo, o qual pode eventualmente ser
exibido. Isso uma premissa. Criar uma classe abstrata significa definir premissas. Nada
codificado concretamente na primeira gerao da classe. As classes filhas (atravs de
override) que definiro a funcionalidade de cada mtodo ou propriedade. Se voc tentar
instanciar uma classe abstrata, obter um erro do compilador:

EntradaDeDados x = new EntradaDeDados( ); _ Cannot create an


instance of the
abstract class or interface 'EntradaDeDados'

62

Frameworks de Desenvolvimento

Na classe filha, voc teria as implementaes:


class EntradaDeOcorrencias : EntradaDeDados
{
public override string Conteudo( ) 81

{
// Implementao
return "";
}
public override string Exibir( )
{
// Implementao
return "";
}
}

Interfaces
O recurso de criao de interfaces segue mais ou menos o mesmo princpio dos mtodos
abstratos: apenas define o formato de uma classe sem implementar seu cdigo. Porm, h
uma caracterstica que torna as interfaces bastante diferentes de simples classes abstratas: elas
fornecem subsdio para a criao de novas classes numa forma mais parecida com a
montagem de um quebra-cabea. O C# no suporta herana mltipla. Isso significa que uma
classe filha s pode ter um nica classe como pai. Interfaces permitem criar algo parecido
com herana mltipla em C++. Por definio, em OOP, Interfaces so colees de mtodos
abstratos relacionados semanticamente. Em bom portugus: peas de um quebra-cabea que
podem ser encaixadas conforme a convenincia de quem estiver jogando... Observe que, para
efeito de padronizao, comum identificar os nomes das interfaces com I maisculo no
incio. Vamos a um exemplo:

public interface ICodigoBarras


63

Frameworks de Desenvolvimento

{
void LeituraPadrao3of9( ); // Implicitamente abstrato
void LeituraPadraoEAN13( );
void MetodoIdentico( );
}
public interface IControleArmazenamento
{
void Localizador( );
void Categorizacao( );
void MetodoIdentico( );
}
public class Produto : ICodigoBarras, IControleArmazenamento
{
// Aqui viriam as implementaes
public void LeituraPadrao3of9( )
{
// Implementao
}
public void LeituraPadraoEAN13( )
{
// Implementao
}
public void Localizador( )
{
// Implementao
}

64

Frameworks de Desenvolvimento

public void Categorizacao( )


{
// Implementao
}
// No caso de nomes coincidentes, implemente apenas uma vez
public void MetodoIdentico( )
{
// Implementao
}
}

A definio da classe produto seria resultante da agregao de mtodos definidos em duas


interfaces diferentes. Voc tambm pode agregar outros detalhes pertinentes classe produto.
Tambm pode criar novas classes baseadas em uma classe pai combinada com vrias
interfaces:

public class Produto : Cadastro, ICodigoBarras,


IcontroleArmazenamento

Selando as classes

Para selar este assunto de criao de classes com chave de ouro, a linguagem C# permite criar
classes seladas. Por definio, classes seladas no permitem nenhum tipo de herana ou
derivao. Simplesmente so classes que devem ser entendidas como terminadas. Exemplo de
cdigo de classe selada:,

sealed class FimDePapo


{
public string UltimaPalavra;
}
65

Frameworks de Desenvolvimento

class AindaQueroMaisPapo : FimDePapo


{
// Erro de compilao:
// cannot inherit from sealed class 'FimDePapo'
}

Ferramentas de apoio

Se voc se empolgar com a criao de objetos e de repente se vir s voltas com mil e uma
classes, existem algumas ferramentas no editor do Visual Studio que tornaro a sua vida mais
fcil. Para ter uma viso global dos objetos criados dentro da sua aplicao, clique com o
boto direito do mouse dentro do editor e selecione Synchronize Class View. Voc ver no
canto superior direito da sua tela (essa posio pode variar) uma janela com todas as
definies de classes, mais ou menos com o seguinte formato:

66

Frameworks de Desenvolvimento

Ao clicar duas vezes sobre um mtodo, propriedade ou classe, o editor posicionar o cursor
dentro do cdigo correspondente. Uma vez dentro do cdigo, se no estiver interessado em
visualizar o cdigo de classes que considera que j esteja corretamente implementados, voc
pode usar os sinais de + e que ficam no canto da tela e contrair ou expandir os cdigos
das classes. Veja o exemplo com a classe Processador contrada, exibida na Figura 3.7.

Tempo de vida dos objetos

At agora, temos falado de criar objetos, mas tambm igualmente importante saber como e
quando destru-los. Vimos que para criar uma nova instncia de uma classe basta usar a
palavra new:

x = new ClasseExemplo( )

O prprio runtime de .NET vai se encarregar de destruir o objeto quando ele no for mais
necessrio. A pergunta : como ele sabe que um objeto no mais necessrio? Resposta
simples e incompleta: o runtime libera a memria alocada pelo objeto quando no existe mais
nenhuma referncia ligada ao objeto dentro do contexto corrente. Exemplo:

public static int Main( )


{
QualquerClasse x = new QualquerClasse( );
...
Return 0;
}
// se x a nica referncia para "QualquerClasse"
// ela pode ser destruda quando termina seu escopo

67

Frameworks de Desenvolvimento

Existem diversos aspectos referentes a Garbage Collection (coleta de lixo) que esto fora do
escopo deste curso. Vamos nos deter em mostrar como programar a destruio de um objeto.
muito comum necessitarmos que determinados processos ocorram quando um objeto
finalizado. Os exemplos so muitos: liberao de recursos alocados como impressora ou porta
serial, fechamento de arquivos etc. Assim como temos em C# os construtores, tambm temos
os destrutores. Lembre-se de que a regra para a criao de um construtor muito simples:
basta criar um mtodo com o mesmo nome da classe. No caso do destrutor, basta tambm
criar um mtodo com o mesmo nome da classe, mas precedido por um til (~). Exemplo:

class Teste
{
~Teste( )
{
// Aqui voc escreve o cdigo de liberao de recursos
// Base.Finalize( ) chamado automaticamente em C#
68

Frameworks de Desenvolvimento

}
}

Evidentemente, se voc achar conveniente que a liberao de recursos seja feita em algum
momento que no necessariamente seja o da destruio do objeto, voc inteiramente livre
para criar algum mtodo que faa isso.

Tratamento de excees
O tradicional termo tratamento de erros agora chamado de tratamento de excees. E
veremos que faz mais sentido. Em C#, o tratamento de excees feito de maneira muito
elegante e simples.O C# adota um estilo relativamente comum em outras linguagens, que o
de tratar erros como objetos que encapsulam todas as informaes que necessitamos para
resolv-lo. Essa idia vlida para todo o ambiente .NET e foi batizada como SEH
(Structured Exception Handling). A idia bsica mais ou menos a seguinte: todo objeto que
representa uma exceo derivado de System.Exception. Essa classe possui os seguintes
membros:

Excees podem ser disparadas pelos mais diversos elementos. Podem ser disparadas a partir
de erros do sistema operacional, de erros de dispositivos, de inconsistncias de dados.
Tambm podemos criar nossas prprias excees. Vamos observar um exemplo de como
disparar uma exceo e como trat-la com a nossa classe de Cadastramento e validao do
CPF:
69

Frameworks de Desenvolvimento

public class Cadastro


{
// Propriedades
public string CPF;
public string NomeCliente;
public Cadastro( string fCPF, string fNome )
{
// Inicializao
CPF = fCPF;
NomeCliente = fNome;
if ( CPF.Length != 11 )
{
// THROW a palavra chave para gerar a exceo
throw new Exception( "CPF Invlido" );
}
}
}
Colocamos uma validao no construtor, de forma que se forem passados menos de 11
caracteres, o CPF automaticamente considerado incorreto. Ao instanciar essa classe com um
parmetro invlido, a classe ir disparar a exceo e o resultado na tela dever ser uma tela
similar a esta:

70

Frameworks de Desenvolvimento

Observe que um dos detalhes importantes est na sentena unhandled exception.


Traduzindo: exceo no-tratada. A exceo foi disparada pela palavra chave throw e
preciso que haja um bloco de cdigo preparado para manipular a classe de erro retornada.O
formato de tratamento de uma exceo o seguinte:

try
{
// Cdigo sujeito a excees
}
catch( TipoExcecao1 e )
{
// Tratamento para exceo tipo 1
}
catch( TipoExcecao2 e )
{
// Tratamento para exceo tipo 2
}
catch
{
// Tratamento para qualquer tipo de exceo
}
71

Frameworks de Desenvolvimento

finally
{
// Trecho que deve sempre ser executado, havendo ou no
exceo
}

A estrutura try..catch requer que exista pelo menos um bloco catch vazio. Os blocos de finally e
catch(exception) so opcionais. Nossa classe Cadastro deveria ser instanciada da seguinte forma:
try
{
Cadastro teste = new Cadastro( "123", "De Oliveira Quatro" );
}
catch
{
MessageBox.Show( "Impossvel instanciar o objeto Cadastro" );
}

Como voc deve ter observado no exemplo, entretanto, no existe uma pista clara de qual foi
o motivo que realmente fez a instanciao do objeto. Para termos um controle mais efetivo,
poderamos usar o catch com uma exceo customizada. Vamos criar uma exceo que ser
usada especificamente para o caso de encontrar um CPF invlido e colocar isso dentro de um
contexto com mais outras possibilidades de erro. O esboo do cdigo ficaria desta forma:

// Criao das classes


public class eCPFInvalido : Exception{ }
public class Cadastro
{
// Campos
public string CPF;
72

Frameworks de Desenvolvimento

public string NomeCliente;


public Cadastro( string fCPF, string fNome )
{
// Inicializao
NomeCliente = fNome;
if ( CPF.Length != 11 )
{
throw new eCPFInvalido( );
}
else
{
CPF = fCPF;
}
}
}
// Cdigo que ir testar o tratamento de excees
// Insira-o dentro do evento click de um boto,
// por exemplo
try
{
int x;
int z = 0;
Cadastro teste = new Cadastro( "123", "De Oliveira Quatro" );
x = 3 / z; // Teste pr esta linha antes da anterior
}
catch( eCPFInvalido Erro ) // Experimente inverter a ordem dos
catches
73

Frameworks de Desenvolvimento

{
MessageBox.Show( "CPF Invlido" );
}
catch( Exception Erro )
{
MessageBox.Show( "Impossvel instanciar o objeto Cadastro: " +
Erro.Message );
}
finally
{
MessageBox.Show( "Sempre executado, haja erro ou no." );
}

Observe uma srie de detalhes pertinentes ao exemplo anterior:

O catch( Exception Erro) o trecho que captura toda e qualquer exceo. Ele praticamente
igual a um catch vazio conforme demonstrado antes, por uma razo muito simples: Exception
pai de todas as excees. Qualquer exceo sempre se encaixar em Exception por causa
disso. A razo pela qual usamos Exception em vez de um catch vazio foi a inteno de exibir a
mensagem enviada pelo sistema na ocorrncia do erro.
O bloco finally executado sempre, haja erro ou no. Neste caso, ele executado DEPOIS do
bloco catch que capturar a exceo. Se voc tem o costume de programar em Delphi, vai notar
que essa ordem invertida em C#.
Qualquer erro ocorrido dentro um bloco try desvia o fluxo de execuo para o catch
correspondente e NO retorna o fluxo de execuo para o ponto que originou o erro ou a
linha seguinte. Em outras palavras, no existe nada semelhante ao Resume, to popular no
VB, por exemplo.
A ordem dos fatores altera (e muito) os resultados. Se voc tentar, por exemplo, as inverses
sugeridas pelos comentrios no exemplo anterior, vai perceber que, no caso de alterar a ordem
dos catches, voc receber um erro do compilador: A previous catch clause already catches
all exceptions of this or a super type (System.Exception) (Uma clusula catch anterior j
captura todas as excees deste tipo ou de um tipo superior System.Exception). No caso de
inverter as linhas de cdigo, voc vai fazer com que diferentes catches sejam executados.
74

Frameworks de Desenvolvimento

Apenas um e somente um bloco catch executado para cada tratamento de exceo (try).

No nosso estudo de caso, tambm daremos seguimento a este assunto e desenvolveremos


controles de excees mais sofisticados.

Converso de tipos (Typecasting)


Quase todas as linguagens de programao possuem recursos para compatibilizao de dados.
No caso da OOP, isso um tpico que requer um pouco mais de cuidados do que uma
simples converso de nmeros em strings e vice-versa. Em muitos casos, um objeto pode ser
passado como parmetro e um mtodo pode estar habilitado a lidar com classes bastante
diferentes. Primeiro vamos examinar em um sistema de herana linear, baseado no conceito
de ser:

Eis aqui agora um diagrama demonstrando o conceito de ter:

75

Frameworks de Desenvolvimento

A pergunta-chave para explicar o tpico de type cast de objetos seria: como posso criar um
mtodo que seja capaz de receber um objeto como parmetro, no importa qual seja e,
sabendo que alguns desses objetos tm o mtodo gravar e outros no, por exemplo, como
fazer para que meu cdigo seja inteligente o suficiente para saber com qual objeto est
lidando e realizar a ao da maneira mais adequada? Ok, vamos por partes. Seja qual for o
caso, teremos de fazer uso de dois operadores de typecast: is e as.O operador is permite que
voc verifique se o objeto de um tipo especfico e retorna verdadeiro ou falso, de acordo
com o resultado do teste. Exemplo:

if ( p is Intel286 )
{
// instrues
}

J o operador as permite usar uma classe como se ela fosse outra. Evidentemente, esse tipo de
personalidade trocada pode dar confuso e deve ser usada com cuidado. Como regra geral,
podemos dizer que quanto mais prximo for o parentesco entre duas classes, maiores as
chances de ter um typecast correto. Quanto mais distante, maior a possibilidade de erros no
seu typecast. Mas lembre- se que parentes prximos tambm podem brigar, portanto mais
do que conveniente planejar bem um typecast! Veja um exemplo:

(p as Intel286).ModoProtegido = true;

Nesse caso, estamos fazendo um typecast no objeto p para us-lo como um processador
Intel286. Se o typecast falhar, um objeto com valor nulo ser retornado e uma exceo ser
gerada. Vamos analisar os dois casos ilustrados no incio deste tpico. O primeiro caso seria
mais simples, por se tratar de herana linear pura e simples. Bastaria criar um mtodo que
recebesse como parmetro a classe mais superior, no caso, a classe Processador. Veja o
cdigo:

class Processador
{
public double Megahertz;
76

Frameworks de Desenvolvimento

public int AnoFabricacao;


}
class Intel8086 : Processador
{
public Intel8086( )
{
Megahertz = 4.77;
AnoFabricacao = 1981;
}
}
class Intel286 : Intel8086
{
public bool ModoProtegido = false;
public Intel286( )
{
Megahertz = 20.0;
AnoFabricacao = 1984;
}
}

Observe que a partir da gerao do 286, foi adicionado um novo campo indicando que o
processador dispe de um recurso chamado Modo Protegido e cujo valor padro false.
Caso queiramos ativar o modo protegido de um processador atravs de uma classe externa,
poderamos escrever uma classe com o seguinte formato:

class VerificarModoProtegido
{
public void AtivarModoProtegido( Processador p )
77

Frameworks de Desenvolvimento

{
if ( p is Intel286 )
{
// observe o type cast nesta linha:
(p as Intel286).ModoProtegido = true;
MessageBox.Show( "Modo protegido foi ativado" );
}
if ( p is Intel8086 )
{
MessageBox.Show( "Modo protegido no disponvel" );
}
}
}

Vamos agora escrever um cdigo que acionaria tudo de vez. Observe que esse cdigo possui
um truque:

Intel8086 p8086 = new Intel8086( );


Intel386 p386 = new Intel386( );
VerificarModoProtegido Modo = new VerificarModoProtegido( );
// fcil prever a sada desta linha:
Modo.AtivarModoProtegido( p8086 );
// Mas o que voc acha que vai acontecer nesta aqui?
Modo.AtivarModoProtegido( p386 );

A primeira linha, obviamente, responder que o processador no possui modo protegido.


Porm, j que nossa classe prev apenas processadores 8086 e 286, como ela ir se comportar
recebendo como parmetro um 386? Resposta: ela acionar ambos os ifs. Ou seja, ela
78

Frameworks de Desenvolvimento

ativar o modo protegido, informar que o mesmo foi ativado e logo em seguida dir que o
processador no possui modo protegido!

Nossa classe anterior, portanto, teria de ser reescrita e ficaria mais consistente
desta forma:

class VerificarModoProtegido
{
public void AtivarModoProtegido( Processador p )
{
if ( p is Intel286 )
{
// observe o type cast nesta linha:
(p as Intel286).ModoProtegido = true;
MessageBox.Show( "Modo protegido foi desativado" );
}
else if ( p is Intel8086 )
{
MessageBox.Show( "Modo protegido no disponvel" );
}
}
}

Voc conseguiu enxergar a diferena? Todo e qualquer detalhe em programao pode ser
crucial! muito fcil deixar bugs no cdigo... Agora que sabemos como tratar objetos em
herana linear, como proceder em relao a objetos que no necessariamente tm
parentesco entre si? Eis aqui o grande detalhe: todos os objetos tm parentesco, sim. Todos
eles so filhos de System.Object. No precisa fazer exame de DNA, pode acreditar nisso! Veja
este exemplo de cdigo:
79

Frameworks de Desenvolvimento

public void QualquerObjeto( System.Object o )


{
// Diferentes comparaes e typecasts podem ser usados
}

Resumindo, o mesmo raciocnio aplicado a herana linear tambm se aplica a objetos no


lineares; afinal, todos os objetos so descendentes de um mesmo ramo. Basta que o parmetro
que receber os objetos seja definido como System.Object.

Resumo
Neste mdulo voc foi exposto a uma srie de conceitos e tcnicas. Dominar a Programao
Orientada a Objetos dentro dos atuais ambientes de desenvolvimento absolutamente
essencial. Voc aprendeu todos os conceitos essenciais de OOP (Polimorfismo,
Encapsulamento, Herana) e viu de que forma eles so implementados e como se aplicam em
C#. Aprendeu tambm a diferena entre orientao a eventos e orientao a objetos. Vimos
tambm como construir classes, mtodos e propriedades. Outras informaes importantes
como tratamento de excees, interfaces, e type casting completaram o repertrio bsico de
informaes sobre OOP de que voc precisa para programar de maneira consistente nessa
tecnologia.

80

Frameworks de Desenvolvimento

Unidade 7
Segurana em Aplicaes .NET

O Common Language Runtime e o Framework .NET fornecem muitas classes e servios que
permitem aos programadores escrever cdigo para aplicaes seguras. Esses componentes
permitem aos administradores customizar o acesso que a aplicao ter a recursos
protegidos. O framework tambm fornece classes e servios que facilitam o uso de
criptografia e segurana por definio de papis de usurio.

Utilizao de Strong Names


Strong Name uma tecnologia baseada em criptografia introduzida pela plataforma .NET e
traz consigo muitas possibilidades para as aplicaes .NET. Uma delas o aumento da
segurana no desenvolvimento de aplicaes.
Imagine que voc precise criar um conjunto de componentes que gerenciam a rea de
recursos humanos de uma determinada empresa. Entre esses componentes, vamos ter um
chamado Salario, que dado o nome do funcionrio, valor base do salrio e a quantidade de
horas extras que o funcionrio realizou no ms, retorn o valor lquido que a empresa dever
pagar a ele.
Para ilustrar isso, temos um projeto do tipo Class Library, chamado de RegrasDeNegocio.
Dentro deste projeto, criamos uma classe chamada Salario, que possuir apenas o mtodo
chamado de Calcular, que receber os parmetros mencionados acima. Traduzindo tudo isso
em cdigo, teremos algo como:
public class Salario
{
public decimal Calcular(string nomeDoFuncionario, decimal
valorBase, decimal horasExtras)
{
return valorBase + horasExtras;
}
}
Note que no h nenhuma complexidade envolvida para no desviarmos o foco. Como
sabemos, este projeto dar origem uma DLL, que poder ser utilizada por vrias aplicaes
que rodam dentro da empresa. Como j era de se esperar, vamos referenci-la em um projeto
chamado AplicacaoDeRH, que utilizar esse componente recm criado para calcular os
salrios de seus respectivos funcionrios. Com isso, o cdigo de consumo na aplicao final
81

Frameworks de Desenvolvimento

algo parecido com isso:


Console.WriteLine(new Salario().Calcular("Julio Cesar",
1000.00M, 250.00M));
D mesma forma que antes, vamos manter a simplicidade aqui. Depois deste software (EXE
+ DLL) instalado na mquina do responsvel pelo RH da empresa, eu chego at o diretrio
fsico onde ele est instalado. Copio esses dois arquivos para minha mquina para comear a
analisar como esse componente e aplicao foram desenvolvidos. Como sabemos, dentro de
qualquer assembly .NET, temos apenas cdigo IL, que um cdigo ainda decompilvel.
Podemos utilizar o Reflector para isso e, consequentemente, visualizar tudo o que eles
possuem (classes, mtodos, parmetros, etc.).
A partir de agora, vamos explorar a vulnerabilidade. Como eu conheo toda a estrutura que o
componente (DLL) tem, nada impede de eu criar um projeto no Visual Studio .NET, com o
mesmo nome, com os mesmos tipos e os mesmos parmetros. Com isso, eu vou manipular o
corpo do mtodo Calcular, verificando se o funcionrio que est sendo calculado o salrio
sou eu, e se for, multiplico a quantidade de horas extras por 2, para que eu possa ganhar um
valor maior do que realmente deveria.
public class Salario
{
public decimal Calcular(string nomeDoFuncionario, decimal
valorBase, decimal horasExtras)
{
if (nomeDoFuncionario == "Julio Cesar")
horasExtras *= 2;
return valorBase + horasExtras;
}
}
Depois de compilado, isso dar origem uma - nova - DLL com o mesmo nome. De alguma
forma, eu chego at o computador do responsvel pelo RH da empresa, e substituo
fisicamente a DLL anterior por essa DLL que acabamos de desenvolver, e que viola a regra
de negcio, pois manipula o resultado para beneficiar um funcionrio especfico. Com isso,
quando o responsvel pelo RH for calcular o meu salrio, ele me pagar duas vezes o valor
das minhas horas extras. Se ele confia cegamente no software que d o resultado, estou
sendo beneficiado, a empresa prejudicada e dificilmente algum encontrar o problema.

A importncia do StrongName
Todo e qualquer assembly possui algumas caractersticas que ajudam ao runtime determinar
a sua identidade. A identidade de qualquer assembly .NET composta por quatro
82

Frameworks de Desenvolvimento

informaes, a saber: nome, verso, cultura e uma chave pblica. O nome nada mais que o
nome do assembly, desconsiderando a sua extenso. A verso o nmero em que o projeto
se encontra, e que por padro 1.0. J a cultura determina se o assembly sensitivo
alguma cultura e, finalmente, a chave pblica, qual falaremos mais adiante.
Podemos utilizar vrias ferramentas para conseguir visualizar essas informaes. No nosso
caso, se abrirmos dentro do Reflector o componente que criamos inicialmente, aquele que
possui o cdigo legal, poderemos comprovar essas caractersticas que ajudam a identificar o
assembly:
RegrasDeNegocio, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null
Quando criamos a assembly ilegal, com o cdigo que multiplica a quantidade de horas extras
por dois, poderemos notar que o resultado ser idntico, ou seja, no h nada que diferencie a
identidade dos dois assemblies. Sendo assim, a substituio fsica o suficiente para
comprometer a regra de clculo de salrio, j que para a aplicao que a consome, acaba
sendo o mesmo componente. Se repararmos melhor, entre as quatro informaes que
compem a identidade do assembly, uma delas chamada de PublicKeyToken, e que est
nula (no definida). justamente nela que est a soluo para o nosso problema.
Dentro do .NET Framework existem dois tipos de assemblies: os que so fracamente
nomeados e os que so fortemente nomeados. Aqueles que so fracamente nomeados (que
o padro para todos os projetos .NET), so estruturalmente idnticos, possuindo o mesmo
formato e os mesmos tipos definidos, mas como est, d margem para esse tipo de problema.
Isso acontece porque quando efetuamos a referncia do componente RegrasDeNegocio.dll na
aplicao AplicacaoDeRH.exe, o .NET injeta no manifesto da AplicacaoDeRH, informaes
pertinentes ao assembly de regras de negcio. Se analisarmos o manifesto do EXE, veremos
a seguinte informao:

83

Frameworks de Desenvolvimento

Na imagem acima, podemos verificar que dentro da AplicacaoDeRH h uma referncia para o
componente RegrasDeNegocio, que inclui o nome e a verso dele. Como at ento o
componente ilegal possui a mesma identidade, a aplicao consome ele sem maiores
problemas, no sabendo que se trata de um componente malicioso.
Para resolver o nosso problema, vamos recorrer aos assemblies fortemente nomeados (strong
names). A nica e principal diferena em relaes aos assemblies fracamente nomeados, a
atribuio de uma chave nica, que no se repetir em nenhum lugar do mundo. A Microsoft
criou esse recurso, desde a primeira verso do .NET Framework, que utiliza um par de chaves
(pblica e privada) para garantir a unicidade do assembly. Antes de ver como elas funcionam,
vamos primeiramente entender como ger-la. O .NET Framework fornece uma ferramenta
chamada SN.exe, que responsvel por gerar e manipular essas chaves. Para gerar a nossa
chave, podemos executar o seguinte comando (atravs do prompt do Visual Studio .NET):
SN -k MinhasChaves.snk
O arquivo gerado possui as duas chaves, a pblica e a privada e voc pode nomear o arquivo
da forma que quiser. Com o par de chaves gerado, podemos criar um segundo arquivo para
acomodar somente a chave pblica, mas em um primeiro momento, isso desnecessrio. A
ideia aqui somente visualizarmos o que temos como chave pblica:
SN -p MinhasChaves.snk MinhaChavePublica.snk
Para visualizarmos a chave pblica, podemos utilizar o seguinte comando:
SN -tp MinhaChavePublica.snk
Public key is
00240000048000009400000006020000002400005253413100040000010001
00f1589e575d9c20
cc36a0fb7245d74c8d69ddc26a0c92ebee5e65dba7c94a6583701176cc5a8f
d795e11d7e366c49
a19f3ae28509fa8961e6eca103353fe98168a402dc35001b98d9d5325f6121
bde11bc698f268a3
e7e338b950b565be26e371c2550dfaee54f9ef8993dc476f60b2ab5ad69d5a
e832ddd7e35e43ad
6daafae2
Public key token is 0b8510fcd7fd739a
S que o arquivo snk por si s no funciona. Voc precisa vincul-lo ao assembly qual deseja
assinar. Para isso, voc pode abrir o arquivo AssemblyInfo.cs, e adicionar o atributo
AssemblyKeyFileAttribute, que recebe o caminho fsico at o arquivo que contm o par de
chaves, e que no nosso exemplo MinhasChaves.snk.
[assembly: AssemblyKeyFile(@"C:\MinhasChaves.snk")]
Ao compilar o assembly com a chave vinculada, veremos que a identidade do assembly j
mudar. Ao vincular a chave criada acima no nosso componente RegrasDeNegocio, a
identidade ir aparecer da seguinte forma:

84

Frameworks de Desenvolvimento

RegrasDeNegocio, Version=1.0.0.0, Culture=neutral,


PublicKeyToken=0b8510fcd7fd739a
A nica e essencial diferena que agora a propriedade PublicKeyToken reflete exatamente a
nossa chave pblica, que est contida no arquivo MinhasChaves.snk vinculado ao
componente. A partir de agora, as aplicaes que referenciarem o componente
RegrasDeNegocio, guardaro alm do nome e verso do mesmo, a chave pblica que o
identifica. Depois dessas alteraes, se visualizarmos o manifesto da aplicao
AplicacaoDeRH, teremos o seguinte resultado:

Com isso, qualquer pessoa maliciosa que tente refazer o assembly, por mais que ela se atente
a criar toda a estrutura de tipos e mtodos, definir o mesmo nome de assembly, e ainda,
assinar com um outro strong name, ela jamais conseguir reproduzir a mesma identidade e,
consequentemente, no conseguir mais alterar o componente que est instalado no cliente.
importante dizer que fisicamente, a substituio ainda poder ocorrer, mas quando a
aplicacao AplicacaoDeRH tentar acessar algum recurso do assembly RegrasDeNegocio,
uma exceo ser disparada, informando que o assembly solicitado no corresponde aquele
que foi inicialmente referenciado.
Observao: Toda essa segurana pode continuar vulnervel se voc deixar o arquivo com a
chave privada em mos erradas. Se a pessoa maliciosa conseguir ter acesso a esse arquivo, ela
ir gerar o assembly idntico como ela j fazia, mas ao invs de criar um novo par de chaves
para assinar o assembly, ela utilizar o mesmo que voc utilizou para assinar o seu, que o
verdadeiro, e com isso todo o problema volta a acontecer.
Para finalizar, vamos entender como todo esse mecanismo funciona e como o runtime do
.NET Framework assegura isso. Quando geramos a chave a partir do utilitrio SN.exe, um par
de chaves adicionado no arquivo MinhasChaves.snk. Quando compilamos o projeto com
esse arquivo vinculado a ele, o .NET gera um hash do componente utilizando o algoritmo
SHA1 e assina esse hash com a chave privada. O resultado deste processo adicionado no
prprio assembly, incluindo tambm a sua chave pblica, que est matematicamente
relacionada chave privada. A imagem abaixo ilustra esse processo:

85

Frameworks de Desenvolvimento

Como vimos acima, quando o componente referenciado na aplicao que o utiliza, a chave
pblica tambm adicionada aplicao. Durante a execuo, o .NET Framework ir aplicar
o mesmo algoritmo de hash no contedo do componente (DLL) e dar origem um novo
hash e a chave pblica embutida na aplicao que consome aquele componente, ser utilizada
para extrair o contedo (j "hasheado") que est embutido na DLL do componente. Para
determinar se a DLL a mesma ou no, o resultado do hash deve ser igual, do contrrio, a
DLL foi substituda e, felizmente, uma exceo ser disparada, evitando assim de consumir
um componente ilegal. A imagem abaixo ilustra esse processo:

Ao assinar uma aplicao/componente com um strong name, podemos tirar proveito de vrias
funcionalidades, como por exemplo, o refinamento de segurana, a instalao no GAC, que
por sua vez possibilita a centralizao, execuo lado a lado de mltiplas verses de um
mesmo componente, etc. Mas um dos principais benefcios fornecidos por ele, a unicidade
do componente, evitando que algum consiga reproduz-lo e, consequentemente, colocar em
risco a execuo e a confiabilidade das aplicaes que a consomem.

SQL Injection
A Injeo de SQL, mais conhecida atravs do termo americano SQL Injection, um tipo de
ameaa de segurana que se aproveita de falhas em sistemas que interagem com bases de
dados via SQL. A injeo de SQL ocorre quando o atacante consegue inserir uma srie de
instrues SQL dentro de uma consulta (query) atravs da manipulao das entrada de dados
de uma aplicao.
Para nos prevenirmos contra esse tipo de ataque, o ASP.NET fornece o objeto SqlCommand,
junto com a estrutura SqlParameter. Juntos, eles fazem a validao e ajustes nos dados que o
usurio envia e que venham a compor o comando SQL.
Exemplo de utilizao:
86

Frameworks de Desenvolvimento

// cria um novo comando SQL


SqlCommand cmd = new SqlCommand("SELECT * FROM usuario WHERE
usuario=@usuario AND senha=@senha", conn);
// cria os parametros do comando
SqlParameter[] parametro = new SqlParameter[2];
parametro[0] = new SqlParameter("usuario", txtUsuario.Text);
parametro[1] = new SqlParameter("senha", txtSenha.Text);
// substitui parametros no comando
cmd.Parameters.AddRange(parametro);

87

Frameworks de Desenvolvimento

Unidade 8
Acessando Dados com ADO

O ADO.NET um conjunto de classes que voc pode utilizar para manipular dados, e
especificamente desenhado para gerenciar conexes em um ambiente desconectado. Alm de
ser uma boa opo para aplicaes web, o ADO.NET utiliza o formato XML para transmisso
de dados entre a aplicao e o banco de dados.
composto de duas camadas, uma conectada e outra desconectada.

Camada Desconectada
A camada desconectada consiste em um nmero de classes para armazenamento de dados e
relaes. A classe DataSet a classe principal de aramazenamento de dados em cach de
memria. Contm uma coleo ou mais de objetos DataTable que so compostos de linhas e
colunas de dados, chave primria, chave estrangeira, constraints, e informaes sobre os
relacionamentos dos dados nos objetos DataTable. Voc pode imaginar a classe DataSet
como uma representao em memria do banco de dados.

Camada Conectada
A camada conectada responsvel pelo trfego de dados entre a aplicao e a fonte de dados.
A camada conectada especfica para cada banco de dados, como o SQL Server ou arquivo
XML. A camada conectada tambm conhecida como provedora de dados e o ADO.NET j
vem com alguns provedores de dados prontos para uso, incluindo:
SQL Server .NET Framework Data Provider. Para acesso a bases SQL Server 7.0 e
verses posteriores.
OLE DB .NET Framework Data Provider. Para acessar qualquer fonte OLE DB que
voc tenha um provedor OLE DB.
ODBC .NET Framework Data Provider. Para acessar qualquer fonte ODBC para qual
voc prossua um driver ODBC.
Um grande nmero de terceiros,incluindo IBM e ORACLE, fornecem implementaes de
Data Providers para o Framework .NET.

88

Frameworks de Desenvolvimento

ADO Object Model


Camada Desconectada
A camada desconectada independente da fonte de dados pode ser usada para
gerenciamento da informao em memria. Em funo disso, pode ser usada com mltiplas
fontes de dados, ou dados XML, ou para gerenciar dados locais da aplicao. Opcionalmente,
voc pode conectar a alguma fonte de dados usando a camada conectada.
composta das seguintes classes, encontradas no namespace System.Data:
Tipo

Descrio

Constraint

Representa uma restrio que rege um ou mais objetos


DataColumn. Uma constraint uma regra que usada para
manter a integridade dos dados em uma tabela. A classe abstrata
Constraint tem duas classes derivadas que so usadas para chaves
primrias e/ou colunas de valores nicos utilizando a classe
UniqueConstraint. A classe base abstrata Constraint tambm
contem a ao a ser executada sobre os dados de uma tabela filha
quando os dados de uma tabela paid apagada usando a classe
ForeignKeyConstraint.

DataColumn

Representa uma simples coluna de um DataTable, mltiplos


objetos DataColumn representam a estrutura de um DataTable.

DataRelation

Representa uma relao pai/filho entre dois objetos DataTable.


Um objeto DataRelation unido a um numero igual de objetos
DataColumn de dois objetos DataTable diferentes. O bjeto
DataRelation permite a navegao entre tabelas relacionadas.

DataRow

Representa um registro de dado em um objeto DataTable.

DataSet

Esse o container geral de objetos que representa um objeto


database na memria,consistindo de um ou mais objetos
DataTable e zero ou mais objetos DataRelation. Esse classe
serializavel.

DataTable

Representa uma tabela de dados em memria. A estrutura


composta de um ou mais objetos DataColumn, e a informao
salva em objetos DataRow. Essa classe serializavel e pode ser
transportada via rede.

89

Frameworks de Desenvolvimento

DataTableReader

Obtem o contedo de um mais objetos DataTable na forma de um


ou mais read-only, forward-only result sets.

DataView

Representa uma viso customizada de um DataTable, que pode


ser utilizado para ordenar, filtrar, procurar, editar, e navegar.

Camada Conectada
A camada conectada, fornece um link entre a fonte de dados e a camada desconectada. Os
tipos bsicos, encontrados no namespace System.Data.Common esto listados abaixo.
A camada conectada inclui as classes DataAdapter, Connection, Command e DataReader.
Que so Data Providers desenhados para manipulao de dados e para rpida acessos leitura
de dados, forward-only, read-only.O objeto Commandpermite acesso a comandos do banco
de dados, permite retornar dados ao banco, modificar informao, executar stored procedures,
e enviar ou receber parmetros. A classe DataReader fornece um stream de dados de alta
performance. E a classe DataAdapter fornece a ponte entre o objeto DataSet e a fonte de
dados. A classe DataAdapter utiliza o objeto Command para executar comandos SQL na
fonte de dados tanto para caregar o DataSet como para reconciliar as mudanas que foram
feitas no objeto DataSet, de volta para banco.
DBCommand

Representa um comando SQL ou stored procedure a ser executada


no banco de dados. Esse tipo normalmente dividido em quatro
diferente grupos, um para seleo de dados, um para insero, um
para atualizao e um quarto para excluso.

DbConnection

Representa a conexo fonte de dados e se conecta a ela a partir de


uma connection string.

DbDataAdapter

Representa uma conexo a um banco de dados e a um conjunto de


comandos SQL que so usados para preencher um DataSet e/ou um
DataTable, e atualizar a fonte de dados.Esse objeto um mediador
entre cliente e servidor, e usa um objeto de conexo e comando para
executar suas tarefas.

DbDataReader

L um stream de registros de um data source (forward-only, readonly).

Os tipos listados so tipos abstratos e precisam ser herdados. Voc precisa utilizar os
seguintes tipos para implementaes especficas de banco de dados:
90

Frameworks de Desenvolvimento

Para uso com SQL Server .NET Data Provider, voc precisa das classes
SqlDataAdapter, SqlDataReader, SqlCommand, e SqlConnection, encontrados no
namespace System.Data.SqlClient.
Para uso com OLE DB .NET Data Provider, voc tem OleDbDataAdapter,
OleDbDataReader, OleDbCommand, e OleDbConnection, todas sob o namespace
System.Data.OleDb.
Para uso com ODBC .NET Data Provider, voc tem OdbcDataAdapter,
OdbcDataReader, OdbcCommand e OdbcConnection, todas sob o namespace
System.Data.Odbc.
Para uso com Oracle .NET Data Provider, voc em OracleDataAdapter,
OracleDataReader, OracleCommand, and OracleConnection, todas sob o namespace
System.Data.OracleClient. Voc pode utilizar essas classes para os bancos Oracle
verso 8.1.7 ou mais recentes.
Observao: voc no pode misturar os tipos da camada conectada. Todos os tipos utilizados
para gerenciar dados em uma determinada fonte, devem vir do mesmo .NET Data Provider.

Contectando a um Banco de Dados


Criando um Banco de Dados
Crie um novo projeto em File > New Web Site, selecione o template ASP.NET Web Site, de
o nome de WebSite3, utiliza a linguagen Visual C#, e clique em Ok.
No Solution Explorer, sobre a pasta App_Data, clique em Add New Item... , selecione Sql
Server Database, utilize o nome Database.mdf, e clique em Add.

Na aba Server Explorer ( View >Server Explorer ), abra expanda o ramo Database.mdf e
clique com o boto direito sobre o item Tables:
91

Frameworks de Desenvolvimento

Clique com o boto direito, selecione Add New Table, e insira a seguinte definio:

Clique com o boto direito sobre a linha id, e selecione a opo Set Primary Key, e na aba
Properties marque a opo IsIdentity com Yes:

92

Frameworks de Desenvolvimento

Clique em File > Save Table, nomeie a tabela como Contatos e clique Ok.

Criando um Formulrio de Insero de Dados


Na aba Solution Explorer, clique sobre a pgina Default.aspx e abra para edio no modo
Source. Criaremos um formulrio de entrada de dados para os campos nome, email, telefone,
e um boto salvar que executar a entrada dos dados.

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Insero de Dados</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table style="width: 100%;">
<tr>
<td>Nome: </td>
<td>
<asp:TextBox ID="txtNome"
runat="server"></asp:TextBox>
</td>
93

Frameworks de Desenvolvimento

</tr>
<tr>
<td>
EMail:
</td>
<td>
<asp:TextBox ID="txtEMail"
runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
Telefone:
</td>
<td>
<asp:TextBox ID="txtTelefone"
runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
&nbsp;
</td>
<td>
<asp:Button ID="btnSalvar" runat="server"
Text="Salvar" />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>

No modo de Design, clique duas vezes sobre o boto Salvar do formulrio e inclua os
namespaces na pgina:

using System.Data.SqlClient;

O cdigo para insero:

94

Frameworks de Desenvolvimento

using
using
using
using
using
using
using
using
using
using
using
using

System;
System.Configuration;
System.Data;
System.Linq;
System.Web;
System.Web.Security;
System.Web.UI;
System.Web.UI.HtmlControls;
System.Web.UI.WebControls;
System.Web.UI.WebControls.WebParts;
System.Xml.Linq;
System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnSalvar_Click(object sender, EventArgs e)
{
// inicializa conexo ao banco
// C:\sites\WebSite3\App_Data\Database.mdf
// altere conforme a localizao da sua aplicao
SqlConnection conn = new SqlConnection(@"Data
Source=.\SQLEXPRESS;AttachDbFilename=C:\sites\WebSite3\App_Dat
a\Database.mdf;Integrated Security=True;User Instance=True");
conn.Open();
// cria um novo comando SQL
SqlCommand cmd = new SqlCommand( "INSERT INTO Contatos
(nome, email, telefone) VALUES ( @nome, @email, @telefone )",
conn);
// cria os parametros do comando
SqlParameter[] parametro = new SqlParameter[3];
parametro[0] = new SqlParameter("nome", txtNome.Text);
parametro[1] = new SqlParameter("email",
txtEMail.Text);
parametro[2] = new SqlParameter("telefone",
txtTelefone.Text);
// substitui parametros no comando
cmd.Parameters.AddRange(parametro);
// executa comando SQL no banco
cmd.ExecuteNonQuery();
// fecha conexao
95

Frameworks de Desenvolvimento

conn.Close();
Response.Redirect("Default.aspx");
}
}

Salve e execute a pgina em Debug > Start Debugging, e insira alguns registros.
OBSERVAO: para obter a string de conexo do banco, na aba Server Explorer, clique
com o boto direito sobre o banco de dados, selecione Properties, e copie a string que se
encontra na propriedade Connection String.

Criando uma Listagem de Dados


Para a listagem utilizaremos o controle de dados DataGrid, que recebe um DataReader como
fonte de dados. No solution Explorer, sobre a localizao da aplicao, clique com o boto
direito e selecione a opo Add New Item, template Web Form, nomeie o mesmo como
listagem.aspx, linguagem C#,e marque a opo Place code in a separate file.
Abra o arquivo listagem.aspx para edio, no modo Source, e insira um controle GridView a
partir da aba Data da Toolbox, e altere o nome do mesmo para gvListagem.

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="listagem.aspx.cs" Inherits="listagem" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Listagem</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="gvListagem" runat="server">
</asp:GridView>
</div>
</form>
</body>
</html>
96

Frameworks de Desenvolvimento

Clique com o boto direito sobre o cdigo e selecione View Code e insira o seguinte cdigo
no evento Page_Load, tomando cuidado de importar o namespace using
System.Data.SqlClient;.

using
using
using
using
using
using
using
using
using
using
using
using
using

System;
System.Collections;
System.Configuration;
System.Data;
System.Linq;
System.Web;
System.Web.Security;
System.Web.UI;
System.Web.UI.HtmlControls;
System.Web.UI.WebControls;
System.Web.UI.WebControls.WebParts;
System.Xml.Linq;
System.Data.SqlClient;

public partial class listagem : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{
// inicializa conexo ao banco
// C:\sites\WebSite3\App_Data\Database.mdf
// altere conforme a localizao da sua aplicao
SqlConnection conn = new SqlConnection(@"Data
Source=.\SQLEXPRESS;AttachDbFilename=C:\sites\WebSite3\App_Dat
a\Database.mdf;Integrated Security=True;User Instance=True");
conn.Open();
// cria um novo comando SQL
SqlCommand cmd = new SqlCommand("SELECT * FROM
Contatos", conn);
// cria um novo DataAdapter apartir do comando SQL
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
// cria um DataSet para leitura dos dados
DataSet ds = new DataSet();
// preenche o DataSet
adapter.Fill(ds);
// liga o DataSet a GridView
97

Frameworks de Desenvolvimento

gvListagem.DataSource = ds;
gvListagem.DataBind();
// fecha a conexo
conn.Close();
}
}
Salve e execute a pgina em Debug > Start Debugging.

98

Frameworks de Desenvolvimento

Unidade 9
Depurando Aplicaes no Visual Studio

Quando voc desenvolve aplicaes, voc pode encontrar diversos tipos diferentes de erros.
Antes de solucion-los voc tem que identificar o tipo de erro e trat-lo apropriadamente.
Existem 3 tipos de erros que voc tem que lidar ao desenvolver um aplicativo: erro de sintaxe,
erros de runtime, e erros de semntica.

Erros de Sintaxe (Syntax Errors)


Os erros de sintaxe precisam ser solucionados para que o compilador possa compilar a
aplicao. Eles se referem a estrutura e as regras associadas aos comandos da linguagem e
aplicao. Por exemplo, se voc tentar utilizar o seguinte comando:
if( this.isPostBack)
{
// bloco de instrues
}

E esquecer de fechar o par de parnteses ( ) ou chaves { }, um erro de sintaxe ocorre. O


Visual Studio alerta voc sobre esses erros indicando no cdigo enquanto voc desenvolve.

Erros em tempo de execuo (runtime)


So erros que ocorrem quando a aplicao est sendo executada. So tambm conhecidos
como excees. Por exemplo, se uma aplicao espera que um determinado arquivo esteja
disponvel em algum servidor de uma rede, mas ele no encontrado pela aplicao, ser
gerado um erro em tempo de execuo (exception). Esse tipo de erro deve ser gerenciado pela
prpria aplicao.

Erros de Semntica
So erros mais difceis de localizar pois sua aplicao ir executar e no ser emitido
nenhuma notificao. Mesmo assim, sua aplicao no executa a tarefa esperada. Por
exemplo, seu programa exibe um formulrio de entrada com os dados de um cliente e so
salvos sem erro nenhum. Mas ao visualizar novamente a informao, alguns dados no
aparecem corretamente ou no foi salvo. Isso significa que a semntica da aplicao no est
correta.
99

Frameworks de Desenvolvimento

A Classe Debug
A classe Debug oferece mtodos e propriedades que podem ajudar voc a depurar seu cdigo
exibindo informaese verificando seu cdigo com declaraes no cdigo. Usando a classe
Debug, voc tem a garantia de um cdigo robusto sem afetar a performance e tamanho do
cdigo do seu produto na release final. Isso por que os cdigos de depurao da classe no
so compilados com o programa na verso Release da aplicao. A classe Debug disponvel
globalmente na aplicao importando o namespace System.Diagnostics. No h necessidade
de instanciar a classe, ela no tem construtores, e voc no pode herdar a mesma pois do
tipo sealed.
Mtodos da Classe Debug
Mtodo

Descrio

Debug.Write

Escreve a string que voc determinar, ou


escreve a sada de um mtodo ToString de
um objeto .

Debug.WriteLine

Escreve uma linha de texto de sua escolha,


ou escreve a sada do mtodo toString de
um Objeto.

Debug.WriteIf

Para escrever uma string


condicionalmente.

Debug.Print

Para gerar a sada de uma linha de texto


formatado.

Debug.Assert

Para exibir uma mensagem se uma


determinada condio for falsa.

Habilitando a Depurao
Voc deve habilitar a depurao caso voc deseje depurar a sua aplicao. Isso feito no
arquivo web.config. Dentro do mesmo voc precisa localizar o elemento compilation e
alterar o atributo debug para true.
<configuration>
<system.web>
<compilation debug="true">
...
</system.web>
<configuration>
100

Frameworks de Desenvolvimento

Adicionando BreakPoints
O Visual Studio nos fornece o recurso de BreakPoints, que so nada mais do que pontos de
parada da execuo de uma aplicao.
Voc pode colocar ou remover em qualquer ponto do seu cdigo C# um Break Point
pressionando a tecla F9, ou a partir do menu Debug > Toggle Breakpoint, ou ainda sobre a
linha de cdigo clicando o boto direito opo Breakpoint. Ou ainda, clicando sobre a bolinha
vermelha que marca o Break Point.

Executando a Aplicao em Modo de Depurao


Para executar sua aplicao em modo de debug, voc deve pressionar F5 ou clicar em Start
Debugging no menu Debug. Se a depurao no estiver habilitada, voc ser perguntado se
quer habilitar o modo de depurao pela caixa de dilogo abaixo. Basta clicar em Ok para
habilitar a depurao. Isso ir modificar o arquivo web.config.

Execuo Passo a Passo


Quando o depurador encontra uma linha com um breakpoint, a execuo suspensa. Voc
pode ento executar sua aplicao passo a passo e examinar a lgica de sua aplicao.

101

Frameworks de Desenvolvimento

Pressione F10 ou clique em Step Over no menu Debug, se voc quer que a linha atual seja
executada sem entrar no cdigo da instruo que est sendo executada, como um mtodo na
mesma classe ou em uma classe externa. A execuo ir parar na prxima linha de cdigo.
Pressione F11 ou clique na opo Step Into do menu Debug se voc quiser entrar no cdigo
da instruo da linha atual, se houver algum. Por default, propriedades so normalmente no
usam esse tipo de execuo por no conter cdigo sobre elas.

Usando a Janela de Depurao


O Depurador do Visual Studio oferece diversas janelas, coletivamente conhecidas como
variable windows que exibem informaes sobre as variveis enquanto voc est depurando.
Cada janela tem uma grid de trs colunas: Name, Value e Type. A coluna nome mostra os
nomes das variveis adicionadas automaticamente nas janelas Auto e Locals.
Na janela Watch, a coluna Name onde voc adiciona suas prprias variveis ou expresses.
As colunas Value e Type exibem o valor e o tipo de varivel ou resultado correspondente.
Voc pode editar o valor da varivel na coluna Value.

Exibindo a Janela Window


No menu Debug, selecione Windows e ento o nome da janela que voc quer abrir. Voc
pode escolher Autos, Locals, Watch ou Watch1 at Watch4. Para exibir esses itens, o
depurador deve estar sendo executado ou no modo break.

Depurao Remota
Para voc executar depurao remota, voc deve usar o programa Remote Debugging
Monitor ou msvsmon.exe, que uma aplicao qual o Visual Studio se conecta.
Por default, o Remote Debugging Monitor roda como uma aplicao Windows, voc pode
configur-lo para rodar como servio caso queira que ele seja executado em um servidor
remoto. Voc pode executar o assistente a partir do menu Start, pasta Tools.
Depois de iniciar o depurador remoto, voc deve configurar os ambientes em ambas as
mquinas. Voc tambm deve levar em considerao, as questes de seguranas relacionadas
ao acesso remoto.

Tracing
Tracing o processo de receber informao sobre a execuo da aplicao em tempo de
execuo. uma maneira de monitorar a sua aplicao. Essa informao pode lhe auxiliar a
identificar problemas ou analisar performance, de uma maneira que no afeta a
aplicao.Tracing normalmente utilizado em ambiente de produo em que no possvel
executar depurao.
102

Frameworks de Desenvolvimento

Voc pode utilizar o tracing para:


Ter um diagnstico das informaes de uma requisio a uma pgina ASP.NET
Escrever instrues de depurao diretamente no cdigo.
Descobrir o cdigo no qual a sua aplicao percorreu.

Classe TraceContext
a classe usada para escrever mensagens em uma pgina ou no trace log em memria.
Mtodos da Classe TraceContext:
Write : escreve uma mensagem de trace no log
Warn : similar ao mtodo Write, porm as mensagens aparecem em vermelho.
Ambos os mtodos possuem 3 overloads, todos os 3 possuem uma mensagem de tracing, e
adicionalmente um nome de categoria, e um parmetro to tipo Exception que indica que voc
pode informar um erro capturado ou uma exceo definida pelo usurio.
Exemplo:
Trace.Warn("Ateno");
Trace.Write("Mensagem de Trace");
Trace.Write("Categoria", "Mensagem de Trace");
Trace.Write("Categoria", "Mensagem de Trace", new
Exception("mensagem da exceo"));
Sada:

O parmetro trace permite voc classificar a sada do Trace por categoria alterando o cdigo:

<%@ Page ... Trace="True" TraceMode="SortByCategory" %>

103

Frameworks de Desenvolvimento

Alternativamente voc tambm pode utilizar SortByTime.


Voc pode utilizar a propriedade IsEnable do TraceContext para alterar o estado do tracing
dinamicamente ou verificar seu estado:
// habilitando o tracing no cdigo
Trace.isEnabled = true;
// verificando seu estado
if (Trace.IsEnabled)
{
Trace.Write("Tracing est habilitado!");
}

Habilitando o Tracing em uma Aplicao Web


Voc pode utilizar o seguinte cdigo para ativar o Tracing a nvel de pgina:
<%@ Page Language="C#" Trace="true" ... %>

Ou a nvel de aplicao, alterando o arquivo web.config:


<configuration>
...
<system.web>
<trace enabled=true />
...
</system.web>
</configuration>

Dados do Trace
As informaes do trace a nvel de pgina so adicionadas ao final da pgina .aspx em que
estiver habilitado.

Categorias do Trace
Os dados do Trace so divididos em diversas categorias conforme listado:
104

Frameworks de Desenvolvimento

Categoria

Descrio

Request Details

Informao sobre a requisio: identificao da sesso (ID),


tempo da requisio, tipo de requisio, e status.

Trace Information

Sadas padro e customizadas de trace. A coluna From First(s)


contem o tempo total desde a execuo at o trace acontecer, e a
coluna From Last(s) mostra o tempo restante.
Os tempos aqui so importantes para se ter um perfil e para
identificar os mtodos que mais demoram para responder.

Control Tree

Lista de todos os itens que esto na pgina, junto com o


tamanho de cada uma.
uma representao da ASP.NET Control Tree. Mostra cada
controle, seu ID nico, tipo, nmeros de bytes que utiliza para
ser renderizado, e o nmero de bytes que ocupa na ViewState e
ControlState.

Session State

Informao sobre os valores armazenados na sesso (Session),


se houver algum.

Application State

Informao sobre os valores armazenados na Application, se


houver algum.

Headers Collection

Lista de requisio e header de resposta.

Form Collection

Lista de controles e seus valores, do formulrio que foi enviado.

Querystring
Collection

Lista de valores passados na URL.

Server Variables

Lista de toda as variveis do servidor e seus valores.

105

Frameworks de Desenvolvimento

Unidade 10
Compilando, Testando e Distribuindo
Aplicaes .NET

Depois de pronta sua aplicao precisa ser distribuida para todos que querem ou precisam
us-la. Para usar a sua aplicao, o nico requisito para o computador do cliente que tenha
instalado o .NET Framework. Este pode ser instalado diretamente do site da Microsoft, ou ser
disponibilizado com sua aplicao no pacote de instalao. Ele tambm disponvel atravs
do Windows Update e futuramente deve vir junto com todos os sistemas operacionais da
Microsoft.
Ento, tendo o .NET Framework instalado na mquina, para sua aplicao funcionar basta
voc copiar o arquivo executvel para a mquina em questo e execut-lo. No entanto essa
prtica no muito recomendada, mais elegante criar um pacote de instalao para instalar
o programa, permitindo assim tambm sua possivel desinstalao atravs do Painel de
Controle, Adicionar/Remover programas.

Criando um Projeto de Instalao


Para esse exemplo, utilizaremos o projeto da Calculadora desenvolvido nessa apostila. Com
seu projeto aberto, no menu File clique aponte em New e clique em New Project.
Na janela New Project, em Project Type, selecione Other Project types > Setup and
Deployment Projects.

106

Frameworks de Desenvolvimento

Repare em Templates nas seguites opes:

Setup Project: cria um programa de instalao que usa o Windows Installer.

Web Setup Project: usa o Windows Installer e um Servidor Web para disponibilidar a
aplicao.

Merge Module Project: cria um arquivo de instalao do tipo msm que pode ser usado por
outras aplicaes.

Cab Project: usado quando voc precisa de arquivos de instalao com tamanho
especifico. Se por exemplo sua aplicao tem 30MB e voc quer disponibiliza-la na
internet, pode criar 3 arquivos de 10MB para facilitar o download.

Smart Device CAB Project: usado para criao de projeto instalao para dispositivos
mveis.

Setup Wizard: um assistente, atravs dele voc pode criar os tipos citados acima s que
de maneira simplificada.

Selecione Setup Wizard.


Em Solution, selecione Add to Solution como a imagem:

107

Frameworks de Desenvolvimento

Isso adiciona o projeto a soluo que esta aberta no Visual Studio, se estiver marcado Create
new Solution, o projeto aberto fechado e criado um novo projeto.
Em Name voc pode dar uma nome para seu projeto de instalao. Por hora, mantena o nome
padro e clique em OK. O Assistente ser inicializado.

108

Frameworks de Desenvolvimento

Clique em Next.

109

Frameworks de Desenvolvimento

Nesse passo voc deve informar o tipo de aplicao, se Windows ou Web. Nesse caso,
mantenha a opo Windows application selecionada.
Clique em Next.

110

Frameworks de Desenvolvimento

Selecione as opes Content Files from Calculadora e Primary output Files from
Calculadora. Isso inclui na instalao arquivos EXE e DLL do projeto.
Se tiver arquivos adicionais para serem adicionados ao projeto como o arquivo do banco de
dados do Access ou algum TXT com informaes sobre o projeto clique em Add para
adicionar o arquivo no passo 4 do assistente.

111

Frameworks de Desenvolvimento

Clique em Next para prosseguir.

112

Frameworks de Desenvolvimento

Clique em Finish.
O Visual Studio adiciona um novo projeto na soluo chamado Setup1, como voc pode ver
no Solution Explorer.
O File System Editor tambm aparece como mostra a figura.

113

Frameworks de Desenvolvimento

Voc usa o File System Editor para adicionar arquivos no seu projeto de instalao e criar os
atalhos do menu Iniciar e Desktop para sua aplicao.
Clique em Setup1 na janela Solution Explorer e veja as propriedades disponveis na janela
Properties.
A propriedade Author e Manufacturer so geralmente preenchidas com o nome da companhia
que desenvolve o software, seus valores tambm so usados para construir o caminho padro
onde ser instalado o programa. Uma vez instalado o programa a propriedade Author
exibida nas informaes de suporte em Adicionar/Remover Programas no Painel de Controle.
A propriedade Title o nome do programa de instalao e a propriedade Version permite
especificar informaes sobre a verso do seu programa de instalao. As propriedades
Product Code contm informaes geradas pelo Visual Studio que permitem identificar
individualmente distribuies do seu programa.
Ateno, estas propriedades dizem respeito ao programa de instalao e no a aplicao
Formularios.
Na janela Solution Explorer, clique com o boto direito do mouse sobre Setup1 e clique e em
Properties.
exibida a caixa de dilogo Setup1 Property Pages. Esta caixa de dilogo permite que voc
altere algumas das opes escolhidas no assistnte (Setup Wizard) caso necessrio e
customize algumas configuraes adicionais que no estavam disponveis no assistente.
114

Frameworks de Desenvolvimento

A caixa Output File Name especifica o nome do arquivo da instalao. Geralmente ele
contm a extenso .msi por ser usado pelo Windows Installer.
A caixa de seleo Package Files contm 3 opes:

As Loose Uncompressed Files: cria arquivos descompactados dentro da pasta de


instalao.

In Setup File: a que cria o arquivo msi.

Cabinet Files(s): gera os arquivos cab na pasta de instalao.

A caixa de seleo Compression permite escolher a otimizao da compactao dos arquivos


de intalao, a maior parte dos programadores escolhe Optimized for Size, que prioriza
diminuir o tamanho dos arquivos de instalao.
Clique em OK.
Em Build > Configuration Manager, altere a opo Debug para Release:

115

Frameworks de Desenvolvimento

Quando estamos criando nossa aplicao importante que esta caixa de seleo esteja
marcada com Debug para que possamos usar as ferramentas de depurao de erros do Visual
Studio. Com o Debug marcado o programa compilado com informaes extras para permitir
a depurao dos erros, essas informaes no so necessrias quando estamos
disponibilizando nossa aplicao e tambm ocasionam perda de performance na nossa
aplicao.
Na janela Solution Explorer, clique com o boto direito do mouse em Setup1, selecione View,
clique em Launch Condition.
aberta a pgina Launch Condition.

Na janela Properties a propriedade InstallUrl setada com uma pgina na Internet que
possibilita o download e instalao do .NET Framework, como sabe, necessrio para sua
aplicao funcionar.

116

Frameworks de Desenvolvimento

Por padro sempre que inicializado a instalao verificado se o .NET Framework esta
instalado na mquina em questo ou no. Se no estiver ele usa essa propriedade, a InstallUrl
para fazer o download e instalao do arquivo Dotnetfx.exe, que instala o .NET Framework.
Antes de iniciar o download e instalao da Internet ele emite uma mensagem, o contudo
desta mensagem est na propriedade Message.
Voc pode disponibilizar o .NET Framework junto com sua instalao, para que no seja
necessrio baixar o arquivo da internet. Para isso voc muda a propriedade InstallUrl para o
caminho da sua instalao e se desejar muda a propriedade Message para um mensagem mais
apropriada. Ser necessrio copiar ento o arquivo Dotnetfx.exe para a pasta de instalao do
seu programa ou para a pasta que voc indicar em InstallUrl.
Vamos deixar como est, para fazer o download se necessrio.
Na janela Solution Explorer, clique com o boto direito sobre Setup1, depois clique em
Build.

No Windows Explorer localize a pasta do projeto Setup1, ela foi especificada quando voc
criou o projeto e entre na pasta Release.
Eis os arquivos necessrios para a instalao do seu projeto, voc pode copiados em um CD
para disponibilizar a instalao do seu programa, como citado anteriormente voc pode copiar
para esta pasta tambm o arquivo Dotnetfx.exe para disponibilizar junto a instalao do .NET
Framework.

117

Frameworks de Desenvolvimento

118

Você também pode gostar