Você está na página 1de 59

Verso: 2.

www.marcelosincic.com.br

Pgina 1 de 59

Ol,
Criei estas apostilas a mais de 5 anos e atualizei uma srie delas com alguns dados adicionais.
Muitas partes desta apostila est desatualizada, mas servir para quem quer tirar uma dvida ou
aprender sobre .Net e as outras tecnologias.
Perfil Microsoft: https://www.mcpvirtualbusinesscard.com/VBCServer/msincic/profile
Marcelo Sincic trabalha com informtica desde 1988. Durante anos trabalhou com desenvolvimento (iniciando com
Dbase III e Clipper S'87) e com redes (Novell 2.0 e Lantastic).
Hoje atua como consultor e instrutor para diversos parceiros e clientes Microsoft.
Recebeu em abril de 2009 o prmio Latin American MCT Awards no MCT Summit 2009, um prmio entregue a apenas
5 instrutores de toda a Amrica Latina (http://www.marcelosincic.eti.br/Blog/post/Microsoft-MCT-Awards-AmericaLatina.aspx).
Recebeu em setembro de 2009 o prmio IT HERO da equipe Microsoft Technet Brasil em reconhecimento a projeto
desenvolvido (http://www.marcelosincic.eti.br/Blog/post/IT-Hero-Microsoft-TechNet.aspx). Em Novembro de 2009
recebeu novamente um premio do programa IT Hero agora na categoria de especialistas
(http://www.marcelosincic.eti.br/Blog/post/TechNet-IT-Hero-Especialista-Selecionado-o-nosso-projeto-de-OCS2007.aspx).
Acumula por 5 vezes certificaes com o ttulo Charter Member, indicando estar entre os primeiros do mundo a se
certificarem profissionalmente em Windows 2008 e Windows 7.
Possui diversas certificaes oficiais de TI:
MCITP - Microsoft Certified IT Professional Database Administrator SQL Server 2008
MCITP - Microsoft Certified IT Professional Database Administrator SQL Server 2005
MCITP - Microsoft Certified IT Professional Windows Server 2008 Admin
MCITP - Microsoft Certified IT Professional Enterprise Administrator Windows 7 Charter Member
MCITP - Microsoft Certified IT Professional Enterprise Support Technical
MCPD - Microsoft Certified Professional Developer: Web Applications
MCTS - Microsoft Certified Technology Specialist: Windows 7 Charter Member
MCTS - Microsoft Certified Technology Specialist: Windows Mobile 6. Charter Member
MCTS - Microsoft Certified Technology Specialist: Windows 2008 Active Directory Charter Member
MCTS - Microsoft Certified Technology Specialist: Windows 2008 Networking Charter Member
MCTS - Microsoft Certified Technology Specialist: System Center Configuration Manager
MCTS - Microsoft Certified Technology Specialist: System Center Operations Manager
MCTS - Microsoft Certified Technology Specialist: Exchange 2007
MCTS - Microsoft Certified Technology Specialist: Windows Sharepoint Services 3.0
MCTS - Microsoft Certified Technology Specialist: SQL Server 2008
MCTS - Microsoft Certified Technology Specialist: .NET Framework 3.5, ASP.NET Applications
MCTS - Microsoft Certified Technology Specialist: SQL Server 2005
MCTS - Microsoft Certified Technology Specialist: Windows Vista
MCTS - Microsoft Certified Technology Specialist: .NET Famework 2.0
MCDBA Microsoft Certified Database Administrator (SQL Server 2000/OLAP/BI)
MCAD Microsoft Certified Application Developer .NET
MCSA 2000 Microsoft Certified System Administrator Windows 2000
MCSA 2003 Microsoft Certified System Administrator Windows 2003
Microsoft Small and Medium Business Specialist
MCP Visual Basic e ASP
MCT Microsoft Certified Trainer
SUN Java Trainer Java Core Trainer Approved
IBM Certified System Administrator Lotus Domino 6.0/6.5

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 2 de 59

Viso Geral do .NET e Visual Studio 2008 __________________________ 5


1.1

Viso Geral do .NET Framework ______________________________ 5

1.2

Linguagens Suportadas _____________________________________ 7

1.3
Resumo das Classes do .NET Framework ______________________ 7
1.3.1 Class Library _____________________________________________ 8
1.3.2 Classes Especializadas _____________________________________ 9
1.4
2

Utilizando o Visual Studio 2008 _______________________________ 9

Viso Geral do C# e Formulrios ________________________________ 12


2.1
Conceitos Bsicos_________________________________________ 12
2.1.1 Regras de Codificao em C# _______________________________ 12
2.1.2 Projetos e Solues _______________________________________ 13
2.1.3 Classes ________________________________________________ 14
2.2
Formulrios e Controles ____________________________________ 15
2.2.1 Utilizando Controles _______________________________________ 15
2.2.2 Manipulao de Controles __________________________________ 16
2.2.3 Debug __________________________________________________ 16
2.2.4 Compilao _____________________________________________ 17

Manipulao de Variveis ______________________________________ 19


3.1

Nomeando Variaveis _______________________________________ 19

3.2

Tipos de Dados do Sistema _________________________________ 19

3.3
Utilizando Variveis CTS ___________________________________ 20
3.3.1 Criao e Atribuio de Valor _______________________________ 20
3.3.2 Operadores e Precedncia _________________________________ 21
3.3.3 Manipulao de String _____________________________________ 21

3.4

Converses Implcitas e Explicitas ___________________________ 21

3.5

Tipos Compostos _________________________________________ 22

3.6

Constantes e Read Only ____________________________________ 23

3.7

Generics _________________________________________________ 23

Instrues Condicionais, Laos e Desvios ________________________ 25


4.1

Contexto de Variveis ______________________________________ 25

4.2
Comparativos _____________________________________________ 25
4.2.1 Comando if ______________________________________________ 25
4.2.2 Comando switch__________________________________________ 26
4.3
Laos____________________________________________________ 27
4.3.1 Comando while e do ______________________________________ 27
4.3.2 Comando for ____________________________________________ 28
4.3.3 Comando foreach_________________________________________ 28
4.4

Desvios __________________________________________________ 29

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 3 de 59

Tratamento de Erro ____________________________________________ 30


5.1

Erro de Execuo sem Tratamento ___________________________ 30

5.2
Try-Catch-Finally __________________________________________ 30
5.2.1 Try-Finally ______________________________________________ 31
5.2.2 Throw __________________________________________________ 32
5.3
6

Checked e Unchecked _____________________________________ 32

Mtodos _____________________________________________________ 34
6.1
Definio de Mtodos ______________________________________ 34
6.1.1 Mtodos Estticos sem Retorno _____________________________ 34
6.1.2 Mtodos Estticos com Retorno _____________________________ 35
6.2
Recebendo Parmetros ____________________________________ 35
6.2.1 Parmetros de entrada (in) _________________________________ 35
6.2.2 Parmetros de sada (out) __________________________________ 37
6.2.3 Parmetros referenciais (ref) ________________________________ 37
6.2.4 Parmetros Mltiplos ______________________________________ 38
6.3

Overload de Mtodos ______________________________________ 39

Arrays e Parmetros ___________________________________________ 41


7.1
Definio _________________________________________________ 41
7.1.1 Definindo Arrays__________________________________________ 41
7.2

Mtodos Comuns__________________________________________ 42

Classes Bsicas do .NET Framework _____________________________ 43


8.1

Classe AppDomain e Application ____________________________ 43

8.2

Classe Security ___________________________________________ 43

8.3

Classe IO ________________________________________________ 43

Classes e Objetos _____________________________________________ 45


9.1
Definio de Classes e Objetos ______________________________ 45
9.1.1 Abstrao e Encapsulamento _______________________________ 45
9.1.2 Herana ________________________________________________ 46
9.1.3 Polimorfismo ____________________________________________ 46
9.1.4 Classes Abstratas ________________________________________ 46
9.1.5 Interfaces _______________________________________________ 47
9.2
Criao e Instanciamento de Classes _________________________ 47
9.2.1 Propriedades e Enumeradores ______________________________ 48
9.2.2 Construtores_____________________________________________ 49
9.2.3 Destrutores ______________________________________________ 50
9.3
Controle de Acessibilidade _________________________________ 50
9.3.1 Mtodos Estticos ________________________________________ 51

10 Herana e Polimorfismo ________________________________________ 52


10.1

Classes e Mtodos Protegidas_______________________________ 53

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

10.2

www.marcelosincic.com.br

Pgina 4 de 59

Polimorfismo _____________________________________________ 54

11 Namespace, Delegates, Operadores e Eventos ____________________ 56


11.1

Namespace _______________________________________________ 56

11.2

Delegates ________________________________________________ 56

11.3

Operadores _______________________________________________ 57

11.4

Eventos __________________________________________________ 58

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 5 de 59

1 Viso Geral do .NET e Visual Studio 2008


A plataforma .NET no se resume apenas ao framework de desenvolvimento, mas abrange um
conjunto de quatro grupos:
.NET Framework
Abrange uma estrutura de objetos, classes e ferramentas que se integram ao sistema
operacional para fornecer suporte a desenvolvimento. Ao instalar o .NET Framework em uma
maquina no necessrio fazer deployment de outros componentes, uma vez que todos j
esto instalados. Isto possibilita fcil desenvolvimento e distribuio de aplicaes.
O framework tambm possibilita que terceiros desenvolvam novos componentes e objetos por
utilizar o .NET Framework SDK (Software Development Kit), o que aumenta muito a
funcionalidade e os recursos disponveis.
Podemos comparar o framework tambm a um sistema operacional para softwares, cabe a
ele controlar acesso a memria, instancia e destruio de objetos, variveis, formulrios,
grficos, acesso a disco, etc.
.NET Enterprise Servers
Formada por uma srie de servidores preparados com componentes em .NET ou compatveis,
aumenta o poder desta plataforma de desenvolvimento. Veja abaixo a lista dos principais
servidores:
Windows
Server
SQL Server
Exchange
Server
Biztalk
Commerce
Server
Host Integrator
Server (HIS)
Internet
Security Server
(ISA)
Content
Manager
SharePoint

Fornece os recursos de sistema operacional. Fica sobre sua responsabilidade a segurana e autenticao,
criptografia, emisso de certificados digitais (PKI), acesso a dados, etc. Um importante componente do
Windows Server o IIS (Internet Information Server) que o responsvel por manter e processar sites web
com contedo dinmico ou esttico.
Servidor de banco de dados com capacidade at 3 terabytes (3072 gigabytes), gerencia dados com
recursos avanados como suporte a XML, XMLHTTP, DTS, etc.
Gerenciador de correio eletrnico com recursos como distribuio inteligente de documentos,
agendamento em grupo, escalabilidade, etc.
Converte, recebe e envia arquivos em XML de qualquer e para qualquer outro sistema.
Gerenciador de lojas para comrcio eletrnico, gerenciando automaticamente promoes, carto de
crdito, entregas, etc.
Permite ao SQL Server trocar dados diretamente com mainframes e outros sistemas operacionais como
AS/400, OS/390, ISAM, etc.
Firewall e Proxy para acesso a Internet com lista de usurios, autorizao e contedo.
Gerenciador de contedo para sites de notcias e corporativos, permitindo que usurios finais digitem
textos e estes automaticamente sejam formatados na web.
Sistema GED para compartilhamento de arquivos em redes locais ou pela Internet, permitindo mobilidade,
controle de verso e atualizaes.

Visual Studio .NET


Ferramenta de desenvolvimento para o framework. Permite rpido desenvolvimento de
software por trabalhar com recursos de arrastar e soltar, help on-line, etc. Por ser a
ferramenta utilizada neste curso, abrangeremos adiante em detalhes.

1.1 Viso Geral do .NET Framework


Entender o framework essencial para desenvolvimento neste modelo.
Observe no grfico abaixo os principais componentes que formam o .NET framework:

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 6 de 59

Linguagens
Visual Basic.NET, C#, C++.NET, Perl.NET, J# e mais 25 outras linguagens podem ser
utilizadas no desenvolvimento. Qualquer linguagem que manipule objetos pode ser utilizada
com o framework. At linguagens antigas como Cobol2, Mumps, Python esto disponveis em
verso para framework.
Em teoria como o framework um repositrio de componentes e objetos, as linguagens
citadas funcionam apenas como script, instanciando os objetos que precisam, alimentam suas
propriedades e respondem aos eventos.
XML Web Services
D suporte a web services que so aplicativos rodando diretamente na Internet.
Antes dos ws precisvamos estar em uma rede local para poder utilizar componentes em uma
aplicao, o que era um problema para troca de arquivos e dados entre empresas.
Pensando nisso o consrcio W3C, o mesmo que padronizou a Internet e o html, criou um
padro de comunicaes baseadas em xml para troca de dados. Disto surgiram siglas como
SOAP, UDDI, WSDL entre outras que do o suporte transmisso, publicao e definio
respectivamente.
User Interface
Repositrio dos controles grficos utilizados em formulrios e pginas web. Dentro deste
componente encontramos textbox, label, listbox, grid e todos os outros controles grficos.
ASP.NET
Gerencia pginas web dinmicas e tambm a comunicao dos web services.
ADO.NET
Componente de acesso a dados formados por quatro principais subcomponentes
(SQLCliente, OracleClient, ODBCClient e OLEDBClient) para suporte a diferentes bancos de
dados corporativos.
Sua vantagem poder escrever os cdigos sem a preocupao de diferentes verses do
DBMS como acontecia alguns anos atrs onde as verses de sistemas eram diferentes em
cada produto DBMS.
.NET Class Library
Responsvel pelos tipos de dados, classes do acesso a disco, thread e todos os servios da
plataforma.
Common Language Runtime (CLR)
Uma definio bem simples e conhecida maquina virtual. o CLR que instancia, constri e

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 7 de 59

destri todos os objetos. Podemos dizer que o class library e os outros componentes so o
corpo do framework, mas o CLR que o faz se movimentar. Abordaremos em seguida o CLR.
Enterprise Services
Servios de suporte a servidores e aplicaes, como WMI para acesso a dados do sistema
operacional, MSMQ para troca de mensagens, COM+ para controle transacional, etc.
Como referencia, listamos abaixo o contedo que ser abrangido em cada apostila:
Apostila
Implementao de OOP
com C#
ASP.NET
ADO .NET
.NET Framework
Avanado
Microsoft Enterprise
Services

Horas Contedo
10
Conceitos de orientao a objetos, introduo ao Framework, sintaxe e OOP utilizando C#.
16
6
4
4

Acesso a dados utilizando os modelos conectados (datareader) e desconectado (dataset), XML e


XSL Data Document.
Distribuio e versionamento, acesso a disco, string, remmoting, thread, serializao e integrao
gerenciado e no gerenciado. Destaca-se a configurao de segurana.
Servios transacionais com COM+, Message Queue e administrao de componentes no
gerenciados.

1.2 Linguagens Suportadas


Para visualizar porque o framework importante e revolucionrio no ambiente Microsoft, veja
imagem abaixo:

O Visual Basic, o C++ e o ASP eram independentes, o que causava inconsistncias, como por
exemplo, os componentes do C++ (MFC) eram diferentes dos criados no VB e eram comuns os
erros de runtime. Com a unificao de todos os modelos em um nico framework, estes problemas
foram resolvidos.
No momento da compilao o .NET gera o chamado pseudocode que o cdigo em uma
linguagem interpretada que leva o nome de IL (Interpreted Language). Um sistema feito em VB, C#,
J# ou qualquer outra ao ser compilado se transforma no mesmo IL.
DICA: Voc pode Utilize a ferramenta ILDASM.EXE para visualizar o IL.
A nica diferena entre as diferentes 30 linguagens o compilador responsvel para transformar os
comandos da linguagem em comandos IL, resultando em alguns compiladores sendo mais rpidos
que outros. Mas no momento da execuo, todos os cdigos rodam na mesma velocidade, pois
esto na mesma linguagem e utilizando os mesmos componentes, sendo possvel um dll em C#
executar um programa em Python e assim por diante.
Portanto mais importante do que conhecer a linguagem conhecer os recursos que o framework do
.NET contem para utilizar todos os seus recursos.

1.3 Resumo das Classes do .NET Framework


Note diagrama abaixo todos os componentes que formam o CLR e um breve resumo de cada um
destes componentes.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

Componente
Class Loader
MSIL to Native
Code Manager
Garbage
Collector
Security Engine
Debug Engine
Type Checker
Exception
Manager
Thread Support
Com Marshaller
Base Class
Library

www.marcelosincic.com.br

Pgina 8 de 59

Funo
Gerencia os metadados dos objetos, sendo o responsvel pela criao e destruio.
O .NET trabalha com metadados, ou seja, o cdigo pr-compila e no momento da execuo gerada em memria
uma cpia do componente compilado, que fica ativo enquanto a aplicao estiver ativa.
Gerencia a execuo dos cdigos, criao de variveis e tratamento de erros.
Responsvel por liberao de memria destri objetos que no esto sendo utilizado. Ser tratado em mais
detalhes no mdulo 6.
Permitem ou no a execuo e os acessos a disco, servidores, recursos, etc. Abordados em mais detalhes no curso
de Framework Avanado.
Todos os debugs so feitos sobre o cdigo IL, portanto no importa a linguagem utilizada, o debugador sempre o
mesmo.
No .NET variveis no so criadas na linguagem e sim no framework. Detalhes no mdulo 3.
Contem todas as definies de erro do framework. Detalhes no mdulo 5.
Suporte a mtodos executados em modo multi-thread fornecendo sincronizao. Detalhes no curso Framework
Avanado.
Componentes criados em .NET podem conversar com COM e vice-versa sobre a orquestrao desta classe,
fornecendo suporte transacional e outros recursos.
Integra o cdigo sendo executado com o CLR.

1.3.1 Class Library


Para poder utilizar os componentes do CLR necessrio utilizar o Class Library, j que o CLR
fornece a base de execuo mas no pode ser diretamente executado. Alistamos abaixo as classes
que formam o framework.

Classe
System
System.Security
System.Runtime.InteropServices
System.NET
System.Text
System.Globalization
Sytem.Reflection
System.Threading
System.Configuration
www.marcelosincic.com.br

Funo
Classe bsica de acesso.
Funes de autenticao e autorizao por sistema operacional.
Representa o COM Marshaller para execuo de e para COM.
Suporte a TCP/IP, sockets, internet, etc.
Manipulao de string.
Suporte a sistema em multilinge.
Fazer a leitura dos metadados da classe.
Suporte a multi-threading.
Leitura de dados do computador e ambiente operacional.

Abordado em
Framework Avanado
Enterprise Services
Framework Avanado
Mdulo 3
Framework Avanado
Mdulo 11
Framework Avanado
Mdulo 8
Reproduo e distribuio livre

Verso: 2.0

System.IO
System.Diagnostics
System.Collections

www.marcelosincic.com.br

Leitura e escrita de arquivos textos.


Permite acesso ao Performance Monitor do Windows.
Criao de colees, como arrays.

Pgina 9 de 59

Mdulo 8
Framework Avanado
Mdulo 7

1.3.2 Classes Especializadas


Alem das classes aqui descritas til detalhar as classes de dados, web e formulrios para melhor
aproveitamento. Primeiramente abordamos a classe de dados no grfico abaixo. A classe de dados
ser abrangida em detalhes no curso de ADO.NET, as classes de web no curso de ASP.NET e por
ultimo as classes de formulrios no mdulo 2 desta apostila.

1.4 Utilizando o Visual Studio 2008


Para iniciarmos qualquer projeto importante conhecer bem o ambiente IDE do VS2008.
Abaixo a tela principal do Visual Studio 2008, onde pode-se ver os ltimos projetos utilizados ou
ento clique no boto New Project.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 10 de 59

Ao clicar no boto New Project a tela abaixo ser aberta permitindo escolher a linguagem e o tipo
de projeto desejado. Em nosso exemplo iremos utilizar projetos Windows Application tambm
chamados de WinForms, projetos desktop.
Coloque no Name o nome do projeto e o Location padro na pasta Meus Documentos\Visual
Studio Projects mais o nome do projeto.

Ao criar o novo projeto ser criado automaticamente o Form1. Segue a tela principal do IDE e um
breve resumo de como utiliz-las.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

Janela
Barra de Ferramentas
(Toolbox)
Edio de Formulrio (Form
Editor)
Edio de Cdigo (Code
Editor)
Gerenciador de Soluo
(Solution Explorer)
Gerenciador de Servidores
(Server Explorer)
Visualizador de Classes (Class
View)
Propriedades (Properties)
Help Automtica (Dynamic
Help)

www.marcelosincic.com.br

www.marcelosincic.com.br

Pgina 11 de 59

Funo
Separada por grupos, utiliza-se por arrastar e soltar no formulrio desejado. Alguns tipos de controle
como o timer, no aparecer no formulrio e sim no rodap.
Janela para incluso e dimensionamento dos controles desejados, bastando arrastar da barra de
ferramentas para dentro dele.
Janela para edio de cdigo fonte, aberta como tab quando duplo clique sobre qualquer dos objetos
do formulrio
Lista dos formulrios, classes e qualquer outro objeto que o projeto possua, aberto para edio com
duplo clique.
Permite gerenciar Performance Monitor, Message Queue, SQL Server, Services, Event Viewer e
conexes criadas no computador local ou remoto se configurado.
Mostra graficamente as classes do projeto com o nome das classes, propriedades e tipos.
Alteraes dos atributos, mostra as propriedades do objeto clicado no momento.
Mostra automaticamente o help relativo ao comando ou objeto que o ponteiro est locado.
obrigatria a instalao dos CDs do MSDN para funcionar.

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 12 de 59

2 Viso Geral do C# e Formulrios


2.1 Conceitos Bsicos
Antes de codificar um programa dentro do Visual Studio precisamos conhecer as regras bsicas de
cdigo, conceitos de projetos e classe, utilizao e manipulao de propriedades dos objetos, debug
e compilao.
2.1.1 Regras de Codificao em C#
Ao utilizar duplo clique no formulrio Form1 abrimos o editor de cdigo e inserimos apenas as das
linhas dentro do bloco Form1_Load. O restante do cdigo que pode ser notado faz parte do objeto
formulrio padro.

Algumas das principais regras de sintaxe de C# podem ser notadas no exemplo:


O mtodo Main obrigatrio para a inicializao dos programas em C#, sejam estes
formulrios, classes, console ou qualquer outro. O C# procura e executa na chamada inicial
sempre este mtodo. Por padro este mtodo faz a funo de chamar a classe que ir
fornecer a operao, no caso o Form1.
Todas as linhas de comando precisam ser delimitadas, uma vez que o delimitador de
comandos no o ENTER e sim os sinais ; ou {. Veja no exemplo que aps todas as linhas
existe um destes dois sinais. O sinal ; utilizado para indicar que aquele comando termina e
que no em bloco. O sinal { indica que aquele comando um bloco composto.
Existem dois modelos de codificao, PascalCasing e carnelCasing. Por padro todo o
framework baseado em PascalCasing, ou seja todas as primeiras letras em maisculo,
incluindo nas classes do CLR, como por exemplo a classe System.InteropServices. J o C#
como linguagem segue o padro ECMA, portanto no utiliza nenhum dos dois modelos de
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 13 de 59

casing por apenas utilizar letras minsculas. Note que os comandos so todos em minsculos
e apenas as classes utilizam maisculos.
A identao no obrigatria para a linguagem, mas extremamente recomendvel na
codificao. Como pode ser visto, a identao est na linha onde consta o MessageBox est
no quarto nvel, sendo o nvel principal o nome da aplicao, o segundo nvel a classe do
formulrio, o terceiro nvel o mtodo Load. No VS a identao automtica.
Para fazer comentrios utiliza-se as duas barras invertidas \\, que podem ser usadas tanto
em uma linha inteira quanto no final da linha. Ao compilar um projeto, os comentrios so
excludos do assemblie.

2.1.2 Projetos e Solues


No VS todas as aplicaes so chamadas de projetos. Cada projeto um assemblie, seja este um
executvel, dll ou aplicao web. O tipo de assemblie a ser gerado pode ser alterado por se clicar
com o boto direito no nome do projeto e escolher Properties.

Existem algumas limitaes quanto a alterao do tipo de assemblie a ser gerado. Aplicaes
WinForms, Console e Library podem ser convertidas entre elas sem problemas, mas aplicaes web
s podem ser convertidas entre si, no caso os projetos do tipo Web Application e Web Services.
DICA: Diferente do Java, no .NET no h ligao entre o nome do assemblie e das classes nem no
namespace (detalhes no mdulo 11).
O Startup Object um formulrio ou classe (formulrios no .NET tambem so classes) que contenha
o mtodo Main. Notar que nem todos os formulrios iro aparecer nesta lista, e quando isto
acontecer verifique se o mtodo Main est escrito corretamente (veja o exemplo no tpico anterior).
Um importante recurso provido pelo VS trabalhar com o conceito de Solution ou soluo. Podemos
agrupar diferentes tipos de projetos em uma soluo, como por exemplo, em uma nica soluo ter
dois projetos WinForms, um projeto web service e um quarto projeto web application. Utilizando
solues conseguimos em uma nica janela do VS aberta trabalhar com todos os projetos a que
estamos envolvidos.
DICA: Solutions no devem ser compartilhados entre usurios, enquanto projetos sim.
Um projeto utiliza como extenso de arquivo o acrnimo da linguagem mais a palavra proj, por
exemplo vbproj e cproj. J as solues utilizam a extenso sln e ficam sempre no diretrio local do
usurio, enquanto o projeto pode estar na rede ou no servidor web quando a aplicao do tipo web
application.
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 14 de 59

2.1.3 Classes
No entraremos em detalhes agora sobre recursos das classes, mas precisamos entender a
estrutura de um projeto, e para isso essencial entender o conceito das classes.
Classes so objetos que podem ou no se tornar componentes. Damos o nome componente aos
assemblies, e um mesmo assemblie pode conter diversas classes. Da mesma maneira, o arquivo
fsico no disco que contem as classes, extenso cs para C# e vb para Visual Basic, podendo contem
mltiplas classes internamente. Veja o diagrama abaixo para entender melhor este conceito.

Veja no projeto abaixo um exemplo de uma soluo, um projeto, dois arquivos de classes C# e em
um nico arquivo trs classes contidas.

Apesar de estarem dentro do arquivo Class1 as trs classes so totalmente independentes ao serem
compiladas. Ou seja, no importa o arquivo fsico onde as classes esto, uma vez que na
compilao no existem arquivos fsicos, apenas classes. Imagine que no assemblie compilado
estar apenas as classes Form1, Automveis, Motoclicletas e Bicicletas dentro do componente
WindowsApplication1.
DICA: Uma arquivo pode conter mltiplas classes, mas uma classe no pode ser em mltiplos
arquivos no framework 1.x.
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 15 de 59

Uma classe sempre utiliza um escopo, neste caso public (detalhes no mdulo 6), a palavra chave
class e o nome definido. Todas as classes iniciam e terminam com os delimitadores de chave.
No .NET 2.0 foi introduzido o recurso parcial class que permite dividir uma mesma classe em mais
que um arquivo. Qual a vantagem disto?
Imagine uma classe que monta um formulrio com dezenas ou centenas de linhas com definies de
variveis, controles, etc. Podemos dividir a poro de cdigo das definies iniciais e grficas em um
arquivo e os eventos e mtodos no segundo arquivo, usando como declarao:
public partial class frmClientes

Este recurso pode ser muito bem visto em pginas aspx e formulrio onde a poro programador separada da pores
criada pelo IDE. Anteriormente quando este recurso no existia era comum programadores alterarem linhas de cdigo
criadas pelo IDE sem inteno e perdermos tempo precioso para conseguir fazer com que o IDE redesenhasse o
formulrio.

2.2 Formulrios e Controles


2.2.1 Utilizando Controles
Controles so os objetos grficos utilizados em formulrios.
Ao utilizar formulrios, seja do tipo windows ou web, podemos arrastar os controles da barra de
ferramentas (toolbox). Segue abaixo uma lista dos principais controles utilizados em aplicaes
WinForms.
cone

Funo
A barra de rodap fixa utilizada nos aplicativos como Office, Explorer e outros para mostrar estado de botes,
data e hora, e qualquer outra dado utilizando painis
Guias como as de propriedades permitindo mltiplas janelas em um nico espao
Caixa para digitao, possui a propriedade multiline para maiores.
Em intervalos freqentes executa o mtodo timer
Barra de botes 3D como a utilizada nos aplicativos do Windows.
Caixas automticas de ajuda
Lista de textos, imagens e qualquer outro tipo de informao, utilizada no Windows Explorer para demonstrar
a lista de diretrios
Boto de comando com texto ou imagem de fundo
Caixa de ligado e desligado para mltiplas opes simultneas
Lista com mltiplos checkbox em um nico espao
Lista de opes com nica escolha
Menu de boto direito
Visualizador de relatrios criados com o Crystal Report embutido no VS2008
Grid de dados
Caixa de texto com boto para mostrar calendrio dinmico
Caixa de texto fixa. O LinkLabel permite chamar pginas Internet executando o browser
Lista com diversos itens, podendo ser configurada para mltiplas opes
Calendrio aberto com navegao, utilizado no Windows
Numrico com valores mximo e mnimo com botes para alterao
Imagem com controle de click
Barra de progresso, utilizada no Internet Explorer para indicar progresso
Botes de opo para nica escolha
cone no tray icon do Windows
Menu para formulrios

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 16 de 59

2.2.2 Manipulao de Controles


Para manipular estes controle em tempo de design (tela de edio grfica do VS) utilizamos a janela
de propriedades (properties). Mas quando precisamos manipular as propriedades em tempo de
execuo (runtime) utilizamos o nome do objeto e acessamos suas propriedades. O exemplo abaixo
demonstra este principio, onde foi colocado um label, um textbox e um boto e o objetivo digitar um
texto no textbox e ao clicar no boto o texto ser colocado no label.

Neste caso acessamos o mtodo Click por ser o mtodo padro, bastando utilizar duplo clique.
Outros mtodos podem ser acessados utilizando-se a janela propriedades e clicando-se no boto
Events (cone de um raio).
Ao digitar na janela de cdigo o nome do objeto (case sensitivo) automaticamente o VS mostra uma
indica
lista com todos os eventos, mtodos e propriedades que o controle possui. O smbolo
propriedade,
indicam os mtodos e os eventos.
2.2.3 Debug
Os recursos de debug do VS so muito teis e permitem ver em tempo real a linha de cdigo que
est sendo executada, permitindo com uma variedade de janelas auxiliares verificar valores de
variveis (watch), valores atuais (local) e outras que ficam ativas quando executamos o projeto (tecla
F5).
Para poder fazer o debug de um programa temos duas diferentes formas. A primeira utilizar a
janela watch para definir um break que consiste em colocar o nome da varivel ou propriedade que
est debugando e escolher entre parar a execuo quando mudar de valor, ao ter um determinado
valor ou em determinado local de alterao. um modo muito til quando temos problemas com
uma varivel e no sabemos qual o local ou situao onde este valor est sendo alterado.
A segunda forma de fazer debug marcar uma linha de breakpoint, ou ponto de parada, clicando-se
na linha e utilizando o menu debug ou clicando-se na barra lateral de configurao, como o exemplo
abaixo demonstra.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 17 de 59

Os recursos Step Into e Step Over so especialmente importantes por permitirem passar o teste a
linha seguinte ou pular aquele mtodo at o breakpoint seguinte.
2.2.4 Compilao
Compilar um programa feito em linguagens como Visual Basic 6, C++, Delphi e algumas outras
linguagens geramos um cdigo que para ser executado no necessita de um framework como o
.NET. A este modelo chamamos de cdigo nativo.
Como o .NET precisa do framework para poder funcionar, no existe cdigo nativo de mquina, mas
sim o IL como citado no mdulo 1. Veja abaixo o mtodo click do boto do formulrio criado
anteriormente em IL:
.method private hidebysig instance void button1_Click(object sender,
class [mscorlib]System.EventArgs e) cil managed
{
// Code size
25 (0x19)
.maxstack 2
.locals init ([0] string Texto)
IL_0000: ldarg.0
IL_0001: ldfld
class [System.Windows.Forms]System.Windows.Forms.TextBox WindowsApplication1.Form1::textBox1
IL_0006: callvirt instance string [System.Windows.Forms]System.Windows.Forms.Control::get_Text()
IL_000b: stloc.0
IL_000c: ldarg.0
IL_000d: ldfld
class [System.Windows.Forms]System.Windows.Forms.Label WindowsApplication1.Form1::label1
IL_0012: ldloc.0
IL_0013: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
IL_0018: ret
} // end of method Form1::button1_Click

Como podemos notar, o cdigo no o mesmo que escrevemos originalmente, mas ele possui as
classes completas dos controles utilizados, como por exemplo a linha
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

[System.Windows.Forms]System.Windows.Forms.Control::set_Text(string),

Pgina 18 de 59

onde referenciado o textbox e utilizando o

set para alterar a propriedade texto com uma string.


Para que um programa escrito em linguagens do .NET se transformem em IL necessrio um
compilador especfico. Por exemplo, o compilador do C# se chama csc.exe e o compilador do VB o
vbc.exe. Utilizando o compilador do C# para criar a aplicao utilizada at o momento utilizamos a
seguinte linha de comando:
csc /target:exe /out:MeuExecutavel.exe Class1.cs Form1.cs

Nesta linha definimos o tipo de assemblie, neste caso executvel, o nome do assemblie e os
arquivos fsicos de classes que devem ser includos.
DICA: Para poder usar linhas de comando do .NET utilizamos o VS .NET 2008 Command Prompt e
no o console normal de comando do Windows.
Outro importante aplicativo utilizado na linha de comando o ngen.exe para evitar o IL. Caso utilize
este aplicativo ao invs de criar um IL teremos um assemblie j interpretado para .NET, o que no
elimina a necessidade do framework para acessar os objetos, mas evita que o Code Manager e o
MSIL to Native Compiler tenham que ser utilizados nas execues deste programa.
Outros aplicativos como o sn.exe, certmgr.exe, gacutil.exe, etc. so tratrados nas apostilas de
framework avanado e enterprise services.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 19 de 59

3 Manipulao de Variveis
3.1 Nomeando Variaveis
Algumas regras bsicas devem ser seguidas ao dar nome a variveis:
No devem comear com nmeros, sempre com letras
Evite utilizar _
Utilize PascalCasing
Evite abreviaes ou nomes no relacionados
No utilize palavras reservadas. Veja a lista abaixo.
abstract
byte
class
delegate
event
fixed
if
internal
new
override
readonly
short
struct
try
unsafe
Volatile

as
case
const
do
explicit
float
implicit
is
null
params
ref
sizeof
switch
typeof
ushort
while

base
catch
continue
double
extern
for
in
lock
object
private
return
stackalloc
this
uint
using

bool
char
decimal
else
false
foreach
int
long
operator
protected
sbyte
static
throw
ulong
virtual

break
checked
default
enum
finally
Goto
interface
namespace
out
public
Sealed
string
true
unchecked
void

3.2 Tipos de Dados do Sistema


O .NET Framework quem cria, manipula e gerencia varivel. Este processo
interessante por permitir que todas as linguagens tenham os mesmos tipos de dados, sendo este o
motivo de interoperabilidade sem problemas de compatibilidade. Este conjunto de variveis
chamado de CTS (Common Type Safe), sendo controlado pelo componente Type Checker do CLR.
Os principais tipos de dados que o CTS possui so referenciados pelo nome deles ou ento pelos
alias (apelidos) padronizados em todas as linguagens e banco de dados. Segue a lista dos tipos e
seus alias utilizados no C#:
Alias
sbyte
byte
short
ushort
Int
uint
long
ulong
char
float
double
bool
decimal
string

Nome de Sistema
System.SByte
System.Byte
System.Int16
System.UInt16
System.Int32
System.UInt32
System.Int64
System.UInt64
System.Char
System.Single
System.Double
System.Boolean
System.Decimal
System.String

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 20 de 59

3.3 Utilizando Variveis CTS


O CTS suporta variveis de sistema (citadas anteriormente) e objetos, como por exemplo,
formulrios, classes, controles, etc.
A forma de transferncia e assimilao de valores pode ser feita pelo modo valor (in) ou pelo modo
referencia (ref). Todos as variveis criadas de objetos so do tipo referencia, uma vez que o tipo de
dados parte do framework e o que se cria apenas um apontador para o objeto. Por exemplo, ao
criar uma varivel do tipo Dataset no se est criando um novo dataset. Para isso precisa-se utilizar
a palavra chave new.
3.3.1 Criao e Atribuio de Valor
Ao criar uma varivel do tipo CTS a sintaxe bsica formada pelo tipo da varivel, pode ser o alias,
e o nome. Opcionalmente pode-se atribuir o valor inicial sem a necessidade de outra linha. Compare
os dois exemplos abaixo:
int Idade;
Idade = 19;
string Nome = Fulano;

//Varivel numrica de nome idade sem valor


//Atribudo um valor numrico inteiro
//Varivel texto Nome com valor j definido

Utilizamos aqui variveis CTS e seus respectivos alias, mas poderamos ter usado os nomes de
sistema:
System.Int16 Idade;
Idade = 19;
System.String Nome = Fulano;

//Varivel numrica de nome idade sem valor


//Atribudo um valor numrico inteiro
//Varivel texto Nome com valor j definido

Para alterao de valores da varivel utilizamos o sinal = mesmo quando a alterao somar,
dividir e outros, como o exemplificado abaixo:
int Contador = 0;
Contador += 1;
Contador -= 1;
Contador /= 2;

//Criao com valor 0


//Soma um
//Subtrai um
//Divide por 2

Segue a lista com todos os operadores, funo e exemplo:


Operador
=
== e !=
> e >=

Funo
Altera valor de variveis CTS, no caso de objetos serve para comparao
Compara se o valor igual (==) ou diferente (!=)
Para objetos utilize o is
Maior (31 para frente) e maior ou igual (inclui o 30)

< e <=

Menor (29 para baixo) e menor ou igual (inclui o 30)

is
&&

Compara igualdade entre objetos


Significa que as comparaes devem ser todas verdadeiras
Palavra chave conhecida como and
Significa apenas uma das comparaes precisa ser verdadeira
Palavra chave conhecida como or
Condicional true/false
Soma um a varivel numrica
Subtrai um varivel numrica
Divide um numero retornando o resto
Manipula bits dentro de um byte

||
?:
++
-%
>>= ou <<=

www.marcelosincic.com.br

Exemplo
Nome = Fulano
Nome == Fulano
Nome != Fulano
Idade > 30
Idade >= 30
Idade < 30
Idade <= 30
Idade is int
Idade == 30 && Nome == Fulano
Idade == 30 || Nome == Fulano
Nome=(x-y) ? OK : Erro
Idade++
Idade-Idade % 3 == 0.50
1 << ( x % 32)

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 21 de 59

3.3.2 Operadores e Precedncia


Assim como em clculos matemticos, existe uma precedncia em processamento de variveis e
valores. Por exemplo, na equao 1+2*3/4 o resultado ser dois e meio uma vez que multiplicao e
diviso so executadas antes da adio e subtrao.
Para servir de referencia siga a seguinte regra: *, /, %, +, -, && e ||.
Como alternativa para controle de precedncia utilize parnteses. Por exemplo ao invs de escrever
A || B && C escreva (A || B ) && C. Vamos entender a diferena.
No primeiro exemplo B e C tem que ser igual e A no faz diferena. No segundo exemplo A e B no
fazem diferena, qualquer um deles pode ser combinado com C. Aqui fica clara a diferena feita pelo
controle de precedncia.
3.3.3 Manipulao de String
Variveis do tipo string so especiais por permitirem uma sria de operaes especiais. A tabela
abaixo demonstra o efeito de cada um dos mtodos string:
Operao
IndexOf(a)
Insert(3, xxx)
LastIndexOf(s, a)
Length
PadLeft(5, 0)
PadRight(5, 0)
Remove(ar)
Replace(ari, vvv)
Split(;)
Substring(2,4)
ToLower
ToString
ToUpper
Trim

Valor da Varivel
Produtividade
Maria
Variavel
Maria
20
20
Maria
Maria
Maria;Joo;Joaquim
Produtividade
Produtividade
Inteiro 60
Produtividade
Produtividade

Resultado
10
Marixxxa
4
5
00020
20000
Mia
Mvvva
Um em cada posio do array
Odut
Produtividade
String 60
PRODUTIVIDADE
Produtividade

Variveis string so tratadas como array, portanto ao utilizar o numero dois no estamos chamando
a segunda letra mas sim a terceira, pois numeraes de conjuntos iniciam baseados no zero e no
no numero um.

3.4 Converses Implcitas e Explicitas


Converses implcitas so feitas sem a necessidade de transformar um valor em outro. Isto s pode
ser feito quando duas variveis so do mesmo tipo principal, como por exemplo, dois valores
numricos ou valores string. Veja os exemplos abaixo:
int Numero= 9;
long Convertido = Numero;
string Convertido = Numero
Numero = 888;

//Funciona pois os dois so nmeros


//Erro, string no numero
//String no pode ser utilizado em nmeros

No primeiro exemplo a varivel long numrica e maior que a varivel inteira, portanto no
necessrio converter. J strings podem conter letras, ento necessrio validar como numrico para
depois converter em numero.
Neste caso utilizamos converso explicita, como os exemplos:
int Numero;
Numero = int.Parse(888)
string Nome;
Nome = Numero.ToString();

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 22 de 59

Note que todos os valores possuem a operao Parse para converter valores string ou de outros
tipos para o tipo desejado. Outra operao que todos os tipos tem a operao ToString para
transformar qualquer valor em string. Veja os exemplos abaixo:
int Numero = int.Parse(999)
long Numero = long.Parse(6767676)
string Cadeia = 8888.ToString()

//Transforma a string em inteiro


//Transforma a string em long
//Transforma 8888 em string

Para converso de valores numricos para outros valores nmeros e de char para string podemos
utilizar converso como o exemplo a seguir:
long Numero = (long)8777;
int Numero2 = (int)Numero;

3.5 Tipos Compostos


Existem dois tipos compostos no .NET Framework. So os valores do tipo enum e struc.
Os valores do tipo enum servem fornecer uma lista de valores possveis, e permite que se utilize um
nome ao invs de um valor numrico. Como exemplo imagine uma aplicao onde temos que definir
o sexo das pessoas envolvidas em um processo de seleo. O exemplo abaixo demonstra como
este cdigo seria:
enum Sexo
{
Masculino = 1,
Feminino = 2,
Ignorado = 3
}
string NomeFuncionario = Maria;
int SexoFuncionaro = Sexo.Feminino;
MessageBox.Show(SexoFuncionario.ToString());

//Resultado = 2

Como notado, muito mais fcil digitar Sexo e depois o tipo do que decorar que o numero um
masculino e o numero 2 feminino. A praticidade do enum reconhecida pois o prprio .NET utiliza
enum em muitas de suas classes. Sabemos da existncia de um enum pelo smbolo na lista de
um objeto.
Por outro lado, enquanto o enum cria uma lista de possibilidades com valores numricos ou
caracteres fixos, o struct monta uma varivel composta por diversos dados. Por exemplo, criar um
struct chamado funcionrio que contenha nome, idade, telefone e endereo. Veja o exemplo de
enum agora combinado com struct:
struct Funcionario
{
string Nome;
int Idade;
long Telefone;
string Endereo;
}
enum Sexo
{
Masculino = 1;
Feminino = 2;
Ignorado = 3;
}
Funcionrio Maria;
Maria.Nome = Maria;
Maria.Idade = 20;
Maria.Telefone = 89897676;
Maria.Sexo = Sexo.Feminino;
MessageBox.Show(Maria.Sexo.ToString());

//Resultado = 2

Este exemplo demonstrou muito bem como um struct ajuda, pois ele utilizado como uma nica
varivel, neste exemplo chamamos de funcionrio, e criamos uma varivel baseada no struct, no
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 23 de 59

exemplo Maria, e esta variavel contem os atributos que um funcionrio deve ter. A vantagem de um
struct montar uma estrutura pronta, uma vez que evita a um programador esquecer ou deixar de
informar determinado valor para um funcionrio, pois o funcionrio j contem automaticamente os
quatro atributos, mesmo que no informados. O sinal que indica um struct .

3.6 Constantes e Read Only


Constantes so variveis com valores fixos. Por exemplo, o PI matemtico um constante de
(aproximadamente) 3,141516.
Podemos criar constantes para certos dados muito utilizados em uma aplicao, como o exemplo
abaixo:
const string Aplicacao = "Curso";
const string Cidade = "Taquaritinga";
MessageBox.Show(Aplicacao + " --> " + Cidade);

Notamos que as variveis aplicao e cidade no podem ser alteradas e so utilizadas como
qualquer outra varivel do sistema.
Diferentes das constantes podemos ter variveis que so alteradas em uma classe, mas no podem
ser alteradas fora da classe em que foram criadas. Para isso utilizamos a instruo readonly aps a
definio da varivel, como o exemplo a seguir:
public readonly string Aplicacao;
public readonly string Cidade;
Aplicacao = "Curso";
Cidade = "Taquaritinga";

DICA: Variveis read only s podem ser alteradas no construtor da classe em que foram criadas.

3.7 Generics
Generics um recurso interessante para criar variveis e colees de dados utilizando formas
diferenciadas de ordenao e tipagem de dados. Foram criados para solucionar problemas de
colees que exigiam ordenao em diferentes formatos. Eles residem no namespace
System.Collections.Generics
O primeiro dos 3 principais tipos de generics que abordaremos o Queue.
System.Collections.Generic.Queue<string> Alunos = new Queue<string>();
Alunos.Enqueue("Marcelo");
Alunos.Enqueue("Joao");
Alunos.Enqueue("Maria");
foreach (string Nome in Alunos)
Response.Write(Nome + "<br>");

Neste primeiro exemplo o resultado ser Marcelo-Joo-Maria j que modelos de fila utilizam a
ordem de entrada para ordenao no retorno.
O segundo exemplo mostra o generic do tipo Stack:
Stack<string> Alunos2 = new Stack<string>();
Alunos2.Push("Marcelo");
Alunos2.Push("Joao");
Alunos2.Push("Maria");
foreach (string Nome in Alunos2)
Response.Write(Nome + "<br>");

Neste segundo exemplo o resultado ser Maria-Joo-Marcelo j que modelos de stack so LIFO,
utilizam a ordem de entrada inversa para ordenao no retorno.
O terceiro exemplo mostra o generic do tipo SortedDictionery:
SortedDictionary<int, string> Alunos3 = new
SortedDictionary<int,string>();
Alunos3.Add(2, "Marcelo");
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 24 de 59

Alunos3.Add(3, "Joao");
Alunos3.Add(1,"Maria");
foreach (KeyValuePair<int, string> Nome in Alunos3)
Response.Write(Nome.Key.ToString() + "." + Nome.Value + "<br>");
return;

Neste terceiro exemplo o resultado ser 1.Maria-2.Marcelo-3.Joo j que modelos de stack so


ordenados por uma chave primaria.
Como vimos nos 3 exemplos (existem vrios outros tipos) os generics so teis para tiparmos dados
em modo de ordenao rapidamente. Isso pode ser considerado como uma alternativa muito melhor
do que arrays, que so de poucos recursos e possuem um range especfico de dados quando
tipados.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 25 de 59

4 Instrues Condicionais, Laos e Desvios


4.1 Contexto de Variveis
Ao utilizarmos condicionais, laos e desvios precisamos juntar o conceito de bloco com criao de
variveis.
Aprendemos anteriomente que blocos so criados utilizando-se as chaves, como os exemplos
anteriores de enum, struct e classes. Variveis criadas dentro de um bloco s podem ser utilizadas
dentro do mesmo bloco. Este principio chamado de contexto. O exemplo abaixo demonstra uma
varivel dentro e outra fora do contexto:
int Idade;
{
int Peso;
Idade = 30;
Peso = 60;
}
MessageBox.Show(Idade.Tostring());
MessageBox.Show(Peso.ToString());

//Funciona normalmente
//Erro de varivel no definida

Notamos que dentro do bloco a varivel Idade pode ser utilizada normalmente, uma vez que ela foi
criada antes do bloco. J a varivel Peso que foi criada dentro do bloco s existe dentro do bloco,
portanto no MessageBox ocorreu um erro porque a varivel j no existia.

4.2 Comparativos
4.2.1 Comando if
A sintaxe bsica do comando if :
if(condicao)
//condio verdadeira
bloco ou comando
else
//condio falsa
bloco ou comando

Como primeiro exemplo do comando imaginemos uma aplicao onde validamos a idade que o
usurio digita:
int Idade;
Idade = int.Parse(textBox1.Text);
if(Idade <= 0 || Idade >= 100)
{
MessageBox.Show(Idade Incorreta. Digite Novamente);
textBox1.SetFocus();
}
else
MessageBox.Show(Idade aceita. Obrigado);

Note que o if contem os colchetes de bloco enquanto o else no. O motivo que quando o if ou o
else (vlido para todos os outros comandos deste mdulo) tem uma nica linha na seqncia no
necessrio colocar o bloco. O bloco s obrigatrio quando haver mais de uma linha aps os
comandos.
No exemplo utilizamos || para indicar que se a idade digitada for menor ou igual a 0 ou ento maior
ou igual a 100 a mensagem de erro aparece e obrigamos a digitar novamente. Caso contrrio, ou
seja, se estiver entre 1 e 99 mostramos uma mensagem de agradecimento.
Ampliando o nosso exemplo pode validar tambm o nome da pessoa:
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 26 de 59

int Idade;
Idade = int.Parse(textBox1.Text);
if(Idade <= 0 || Idade >= 100)
{
MessageBox.Show(Idade Incorreta. Digite Novamente);
textBox1.SetFocus();
}
else
{
string Nome;
Nome = textBox2.Text;
if(Nome.Length < 5 || Nome.Length >30)
{
MessageBox.Show(Nome Incorreto. Digite Novamente);
textBox2.SetFocus();
}
else
MessageBox.Show(Dados aceitos.);
}

Note que caso a idade esteja correta agora o else possui um bloco, e dentro deste bloco lemos o
nome escrito no textbox e verificamos o tamanho do nome. Se o nome for menor que 5 ou maior do
que 30 caracteres, voltamos ao textbox para que ele redigite o nome. Caso esteja correto entra no
segundo else que mostra a mensagem de dados aceitos.
DICA: O comando if encadeado s deve ser utilizado quando as condies so diferentes. No se
utiliza quando a condio com a mesma varivel. Nestes casos utiliza-se o switch.
4.2.2 Comando switch
A sintaxe bsica do comando switch :
switch(varivel)
{
case 1:
{
instruo;
break;
}
case 2:
case 3:
case 4:
{
instruo;
break;
}
default:
{
instruo
break;
}
}

Para utilizao do switch utiliza-se um bloco definido e uma condio nica.


Cada diferente valor assumido por esta condio verificada em uma instruo case, seguida do
valor comparado e terminando em dois pontos. Assim como o if, o case s necessita das chaves
quando possui mais do que uma linha de comando.
A instruo default sinaliza a instruo caso nenhum dos case anteriores retorne verdadeiro. No
exemplo, se o valor for acima de cinco entrar as instrues do default j que os case no
retornaram verdadeiro.
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 27 de 59

O switch no permite mltiplas condies nem intervalo na mesma linha, portanto quando mais de
um valor for utilizado necessrio colocar vrios case, como no exemplo onde os valores dois a
quatro executam a mesma instruo contida no valor quatro.
Outra importante considerao do switch a presena do break a cada uma das instrues case ou
default. Isto acontece porque diferente do if o case continua executando quando uma instruo j
retornou verdadeiro. O compilador do C# permite a omisso do break, mas o VS valida esta
instruo no permitindo a compilao.
Veja abaixo um exemplo comparando o tamanho do texto digitado:
Texto = textBox1.Text;
//Atribui a varivel
switch(Texto.Length)//Compara o tamanho da string
{
case 10:
case 11:
case 12:
//Os trs valores ocorrem como nica condio
{
MessageBox.Show("Acima de 10 at 12");
break;
}
case 13:
{
MessageBox.Show("Valor 13");
break;
}
default: //Caso o valor esteja diferente de 10 a 13
{
MessageBox.Show("No encontrei...");
break;
}
}

4.3 Laos
4.3.1 Comando while e do
Estes dois comandos possuem a sintaxe e funcionalidade similar, sendo o momento de comparao
a principal diferena entre eles. A sintaxe bsica da instruo while :
while(condio)
{
instrues
}

A sintaxe bsica da instruo do :


do
{
instrues
} while (condio)

Como pode ser notado entre os dois comando a diferena que no while fazemos a comparao de
condio na entrada do bloco, portanto pode acontecer de nem sempre ser executado, enquanto o
do processa a primeira execuo e a comparao validada para continuao do lao.
Por exemplo, veja os dois cdigos abaixo:
int Contador = 1;
//Varivel inicia em 1
while(Contador > 10)
//Este cdigo nunca ir rodar
{
Console.WriteLine(Rodei...while);
Contador++;
}
//Executa agora o do com a mesma condio
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 28 de 59

do
{

//Este cdigo roda a primeira vez


//Pois a comparao s est no final
Console.WriteLine(Rodei...do);
Contador++;
} while(Contador < 10);

4.3.2 Comando for


possvel utilizar o comando while e do para processamento de laos contnuos, mas neste caso
desperdiamos algumas linhas de cdigo para definir a varivel e incrementa-la. J o comando for
permite que faamos laos seqncias com poucas linhas. Sua sintaxe bsica :
for(cria e inicializa a varivel, condio, incrementa)
{
instrues
}
Veja o exemplo anterior utilizando a instruo for:
for(int Contador = 1; Contador < 10; Contador++)
{
Console.WriteLine(Rodei..{0}, Contador);
}

No exemplo criamos a variavel contador do tipo inteiro e valor inicial 1. No segundo parmetro
informamos que o lao acontece enquanto contador for menor do que 10, e na terceira instruo
somamos um a varivel.
4.3.3 Comando foreach
O comando for possui a limitao de trabalhar com uma condio pr-fixada em cdigo. Isto algumas
vezes limita as possibilidades de contar objetos ou colees onde no temos o numero exato de
ocorrncias. Quanto queremos comparar colees utilizamos o foreach, uma vez que ele faz o lao
no por comparao de valores mas sim por quantidade de itens em um conjunto, qualquer que seja
este. A sintaxe bsica do foreach :
foreach(tipo Variavel in Conjunto)
{
instrues
}
Para exemplificar a diferena entre o for e o foreach imagine uma coleo com 10 nomes criados
abaixo:
string[] Nomes = new string[10];
for(int Loop = 1; Loop < Nomes.Length; Loop++)
{
string NomeCorrente;
NomeCorrente = Nomes[Loop];
Console.WriteLine(NomeCorrente);
}
foreach(string NomeCorrente in Nomes)
{
Console.WriteLine(NomeCorrente);
}

Note que o primeiro for necessitamos utilizar um contador, comparar at quando este contador
vlido e utilizar o item array, o numero utilizado como ndice.
No segundo, utilizando o foreach, para cada string que o conjunto de strings Nomes contem
atribudo uma varivel NomeCorrente e esta impressa sem a necessidade do ndice.
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 29 de 59

Algumas consideraes sobre foreach que o tipo tem que ser o mesmo do conjunto, para cada
ndice do conjunto alimentado uma varivel temporria que aponta para o valor e automaticamente
termina ao final da coleo. Isto pode ser visto no exemplo, pois Nomes um conjunto de dez strings
e a cada diferente posio a varivel NomeCorrente ganhava o valor da seqncia. Portanto, a
varivel NomeCorrente alterou de valor dez vezes.

4.4 Desvios
Apesar de ser uma linguagem estruturada o C# possui algumas caractersticas de linguagens
estruturais como pulos de cdigo em caso de cdigos condicionais particionados. As instrues que
permitem desvios so goto, break e continue.
A sintaxe bsica das instrues de desvio so:
int Valor = int.Parse(textBox1.Text);
if(Valor == 10)
goto Escape1;
else
goto Final;
Escape1:
{
Console.WriteLine("Entrei no escape");
goto Final;
}
Final:
{
Console.WriteLine("Estou saindo");
}

No exemplo se o valor digitado for 10 desviamos a execuo para os cdigo dentro do bloco
Escape1 que redireciona para o bloco Final.
Este modelo de programao no muito utilizado por ser desestruturado, mas em certas situaes
podemos utilizar para controlar dentro de uma condicional situaes especificas. Por exemplo, em
uma instruo switch quando existem diversas condies e cada condio possui diversas linhas de
cdigo, a visualizao das condies e instrues pode ficar prejudicada pelo tamanho. Neste caso o
goto melhora a leitura do switch sem criar mtodos adicionais no sistema.
As instrues break e continue so utilizadas dentro do switch, por exemplo, para indicar o final do
case ou com o continue para que a condio seguinte tambm seja executada.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 30 de 59

5 Tratamento de Erro
5.1 Erro de Execuo sem Tratamento
Quando executamos um bloco de cdigos precisamos tomar o cuidado de no deixar o sistema
parar a execuo com cdigo de erro padro do CLR. Este tipo de mensagem no facilmente
entendida pelo usurio, alem de passar a impresso de um cdigo mal feito e instvel.
Em caso de erros no CLR mostrada uma mensagem de tratamento permitindo que o sistema
continue a ser utilizada, mas aquele mtodo ser desconsiderado, ou ento pode-se escolher fechar
a aplicao.

5.2 Try-Catch-Finally
Para controlar e melhorar utilizamos as instrues try, catch e finally. Primeiro vamos explorar o
try...catch que possui a sintaxe abaixo:
try
{
instrues
}
catch (exception Variavel)
{
}

Como exemplo, podemos fazer o teste alterando uma varivel para ocorrer um erro e trata-lo,
conforme o exemplo abaixo:
int Numero = 12345;
try
{
Numero *= 888888;
Console.WriteLine(Numero alterado.);
}
catch (Exception Erro)
{
MessageBox.Show(Ocorreu um erro na aplicao. + Erro.Message)
}

No cdigo as duas linhas dentro do bloco delimitado pelo try so executadas e em caso de erro
dispara uma mensagem com o texto do erro ocorrido.
Apesar de ser permitido utilizar um bloco de tratamento dentro de outro, o VS no permite pois o
tratamento de erro fica retrogrado, executando todos os que estejam dentro. Por outro lado a
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 31 de 59

instruo catch pode conter diversas condies, mas para entender precisamos primeiro conhecer
as classes Exception.
Em algumas linguagens, como por exemplo o VB6, os erros eram identificados pelo numero. Isto
podia ser um problema porque alguns erros eram especficos de banco dados, acesso, segurana,
disco e outros, e para descobrir precisamos comparar o numero e ler a string de retorno para tomar a
ao corretiva.
Em .NET esta problema no acontece porque cada tipo de erro possui seu prprio conjunto, ou
coleo,de atributos. Por exemplo, OverflowException, SQLDataAccessException, RankException,
SyntaxErrorException, etc.
Utilizando este modelo de erros do .NET, imagine o exemplo abaixo:
int Numero = 12345;
try
{
Numero *= 888888;
Console.WriteLine(Numero alterado.);
}
catch (OverflowException Estouro)
{
MessageBox.Show(Valor maior que o possivel.);
}
catch (Exception Erro)
{
MessageBox.Show(Ocorreu um erro na aplicao. + Erro.Message)
}

Note que o exception anterior no foi retirado, assim podemos garantir que se o erro for estouro ir
ocorrer o primeiro catch, mas caso ocorra um erro diferente de estouro o cdigo seguinte, genrico,
executado e mostra a mensagem do CLR.
5.2.1 Try-Finally
O finally tem uma funo agregada as outras instrues de tratamento de erro, sendo executada
com ou sem erro. O exemplo anterior atualizado seria:
int Numero = 12345;
try
{
Numero *= 888888;
Console.WriteLine(Numero alterado.);
}
catch (OverflowException Estouro)
{
MessageBox.Show(Valor maior que o possivel.);
}
catch (Exception Erro)
{
MessageBox.Show(Ocorreu um erro na aplicao. + Erro.Message)
}
finally
{
MessageBox.Show(Numero.ToString());
}

O cdigo encontrado no finally ir mostrar uma mensagem com o numero resultado da operao,
tendo sido multiplicado ou no.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 32 de 59

5.2.2 Throw
Ao utilizarmos cdigos em classes e termos um formulrio ou pgina web executando este cdigo
no podemos deixar um erro ocorrido na classe parar o sistema sem avisar a fonte, quem chamou a
classe. A este processo chamamos de host o sistema que utiliza a classe, e a classe chamamos de
objeto.
Nestes casos precisamos que o erro ocorrido na classe seja enviado para o host, e este que
precisar mostrar o erro conforme as regras do software. Para isso utilizamos a instruo throw. A
sintaxe desta instruo :
throw(new Exception(Mensagem de Erro))

Para exemplificar o processo, veja o exemplo abaixo de uma classe:


public class Clculos
{
public Multiplica(int N1, int N2)
{
int Resultado;
try
{
Resultado = N1 * N2;
}
catch(Exception Erro)
{
throw(new Exception(A multiplicao no foi realizada.));
}
}
}

Agora veja o exemplo de um programa que utilize a classe:


public class Teste
{
static void Main()
{
Calculos objMatematico = new Calculos();
try
{
objMatematico.Multiplica(333,444);
}
catch (Exception Erro)
{
MessageBox.Show(Erro.Message);
}
}
}

Ao chamar o cdigo da classe de clculos garantimos que os erros ocorridos sero lanados at
quem a utilizou. Isto garante que o erro seja mostrado e tratado na aplicao, por exemplo, uma
aplicao pode gravar em arquivo, outra enviar email e assim por diante. Se a classe executasse o
cdigo de erro internamento seria impraticvel os diferentes tipos de log de erro.

5.3 Checked e Unchecked


Ainda outra forma de tratamento de erro desconsiderando. Para isto pode-se utilizar o unchecked
que executa clculos matemticos e converses sem a preocupao com o cast, ou seja, se o valor
foi ou no convertido, ou checked para o efeito contrrio. O default do C# trabalhar em modo
unchecked, onde no se faz a verificao de overflow aritmtico.
A sintaxe das duas instrues idntica, mudando-se o nome:
checked
{

//ou unchecked
instrues

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 33 de 59

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 34 de 59

6 Mtodos
6.1 Definio de Mtodos
Mtodos so pores de cdigos que podem ser executados por outros cdigos. So comuns em
qualquer linguagem, disponibilizando aproveitamento de funcionalidades entre diferentes partes de
um mesmo cdigo, alem de interagirem com objetos. Alguns exemplos de mtodos o clik do boto,
o load do formulrio, etc.
A criao bsica de um mtodo segue a sintaxe:
static void NomeDoMtodo(ListaDeParametros)
{
instrues
}

Neste momento no estaremos diferenciando escopo, o que ser analisado no mdulo 7.


Mtodos estticos so aqueles que possuem a execuo independente da criao de uma classe
por outra, so mtodos que no podem ser multi-instanciados.
A palavra chave void indica que o mtodo no retorna dados, ele apenas processa. Caso o mtodo
deva retornar um valor, por exemplo, no local de void se usaria int, long, string ou qualquer outro
valor ou objeto.
A chamada de um mtodo feita por colocar o nome mais a lista de parmetros que ele contenha.
Nos exemplos abaixo isto ser demonstrado.
6.1.1 Mtodos Estticos sem Retorno
Mtodos sem retorno so utilizados para lidar com variveis compartilhadas.
O exemplo abaixo cria um mtodo Main (o primeiro a ser executado) e um mtodo Mostrar que
imprime na tela o valor corrente de uma varivel:
static void Main()
{
int Contador = 0;
Contador++;
Mostrar();
}
//Mtodo Mostrar
static void Mostrar()
{
Contador++;
Debug.Print(Contador.ToString());
}

Neste exemplo o mtodo Main cria uma varivel chamada Contador que contem um nmero inteiro.
Aps somar mais um na varivel o mtodo Main chama o mtodo Mostrar que utiliza a mesma
varivel Contador. Isto possvel porque mtodos estticos s criam e enxergam variveis do tipo
estticas.
Variveis estticas so aquelas que ao serem criadas s deixam de existir quando a classe onde
foram criadas so fechadas. Este tipo de varivel no pode ser utilizado fora da classe em que foram
criadas.
Tambm importante conhecer a instruo return que tem como funo sair do mtodo a qualquer
momento, a ser demonstrado abaixo.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 35 de 59

6.1.2 Mtodos Estticos com Retorno


Reescrevendo o cdigo anterior agora retornando um valor, o nosso exemplo ficaria:
static void Main()
{
int Contador = 0;
Contador++;
bool ValorRetorno = Mostrar();
if(ValorRetorno)
MessageBox.Show(Rodou com sucesso);
else
MessageBox.Show(Ocorreram erros...);
}
//Mtodo Mostrar
static bool Mostrar()
{
try
{
Contador++;
Debug.Print(Contador.ToString());
return true;
}
catch(Exception Erro)
{
return false;
}
}

Neste exemplo podemos notar que a funo Mostrar no mais void e sim bool, indicando que
agora ela tem como sada, ou retorno a quem a chamou, um valor verdadeiro ou falso, indicando que
o mtodo executou ou no com sucesso.
Da mesma maneira, notamos mudanas no mtodo Mostrar que dentro do try retorna um true
indicando que no ocorreu erro ou, caso ocorra erro, retornando false. Este valor permite ao mtodo
Main que fez a chamada saber se o cdigo interno da funo Mostrar executou corretamente ou no.
Note que no exemplo do mtodo foi utilizada a instruo return que tem a funo de fechar o
mtodo. Caso aps o return ainda existissem linhas de cdigo, estas seriam ignoradas, pois o
mtodo teria terminado.

6.2 Recebendo Parmetros


Agora que j abordamos e conseguimos receber um retorno de mtodos, precisamos enviar dados
ao mtodo. Nos exemplo anteriores o mtodo Mostrar utilizava uma varivel de nome Contador que
j estava criada em memria.
6.2.1 Parmetros de entrada (in)
Atualizando nosso exemplo, imagine o mesmo mtodo agora recebendo um valor para multiplicar o
contador:
static void Main()
{
int Contador = 0;
Contador++;
bool ValorRetorno = Mostrar(223);
if(ValorRetorno)
MessageBox.Show(Rodou com sucesso);
else
MessageBox.Show(Ocorreram erros...);
}
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 36 de 59

//Mtodo Mostrar
static bool Mostrar(int Multiplicador)
{
try
{
Contador++;
Contador *= Multiplicador;
Debug.Print(Contador.ToString());
return true;
}
catch(Exception Erro)
{
return false;
}
}

possvel notar que na definio do mtodo consta a lista dos parmetros que sero recebidos, no
caso apenas um. Na chamada do mtodo foi informado o valor 223 que ser utilizado para
multiplicar o contador original.
No necessrio utilizar o parmetro in para indicar que so de entrada, pois este o tipo padro
dos parmetros.
Juntando todos estes conceitos, vamos exemplificar com um formulrio e duas caixas de texto onde
sero digitados dois nmeros e os mtodos retornaram as operaes matemticas com os nmeros
digitados:
//Clique no boto
private void button3_Click(object sender, System.EventArgs e)
{
int Numero1 = int.Parse(textBox1.Text);
int Numero2 = int.Parse(textBox1.Text);
//Cria a variavel de Resultado e executa a soma
long Resultado = Soma(Numero1, Numero2);
Console.WriteLine(Resultado.ToString());
Resultado = Subtrai(Numero1, Numero2); //Executa subtrao
Console.WriteLine(Resultado.ToString());
Resultado = Multiplica(Numero1, Numero2);//Executa Multiplicao
Console.WriteLine(Resultado.ToString());
Resultado = Divide(Numero1, Numero2);
//Executa Diviso
Console.WriteLine(Resultado.ToString());
}
static long Soma(int Num1, int Num2)
{
try
{
int Resultado = Num1 + Num2;
return Resultado;
}
catch (Exception Erro)
{ return -1; }
}
static long Multiplica(int Num1, int Num2)
{
try
{
int Resultado = Num1 * Num2;
return Resultado;
}
catch (Exception Erro)
{ return -1; }
}
static long Subtrai(int Num1, int Num2)
{
try
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 37 de 59

{
int Resultado = Num1 - Num2;
return Resultado;
}
catch (Exception Erro)
{ return -1; }
}
static long Divide(int Num1, int Num2)
{
try
{
int Resultado = Num1 / Num2;
return Resultado;
}
catch (Exception Erro)
{ return -1; }
}

Cada um dos cdigos de mtodos acima recebe os dois nmeros como inteiros e dentro do
tratamento de erro faz o calculo devido. Caso ocorra erro todos os mtodos retornam 1, indicativo
de que no foi executado.
6.2.2 Parmetros de sada (out)
Parmetros de sada podem servir para acessar um banco de dados e retornar mais do que um
parmetro de retorno. Nestes casos precisamos ter uma lista de retorno. Veja o exemplo abaixo:
static void Main()
{
string retNome = ;
string retTelefone = ;
bool Retorno = Dados(100, out retNome, out retTelefone);
Console.WriteLine(retNome + + retTelefone);
}
static bool Dados(int Codigo, out string Nome, out string Telefone)
{
if(Codigo==100)
{
Nome = Marcos;
Telefone = 1234-5678;
return true;
}
else
{
Nome = Desconhecido;
Telefone = ;
return false;
}
}

Note que no Main criamos duas variveis vazias e enviamos estas duas variveis para o mtodo,
que recebe as variveis e preenche seus valores. Neste exemplo ao passar o cdigo o mtodo ir
colocar os valores para o nome e o telefone nas variveis que se chamam retNome e retTelefone do
mtodo original para este imprimir.
6.2.3 Parmetros referenciais (ref)
Outra forma de retornar valores em parmetros utilizar referencial.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 38 de 59

O padro no C# receber os dados como valor, o que significa que o parmetro de um mtodo
recebe o valor e no o ponteiro. Ao utilizar a instruo ref no lugar out estamos enviando para o
mtodo com parmetros o ponteiro de memria onde a varivel original est.
Para simplificar, um parmetro normal so duas variveis, uma original e outra recebida pelo mtodo
chamado. Quando utilizamos referencial, a varivel a mesma no mtodo original e no mtodo
chamado. Quando o mtodo chamado alterar a varivel est tambm alterando no mtodo original.
Veja no diagrama abaixo como isto pode ser representado utilizando como exemplo o ultimo cdigo
demonstrado no out:

No exemplo com in e out notamos que a varivel Nome e retNome usavam espaos em memria
diferente, individualizando os valores. J no modelo ref notamos que um nico valor em memria
utilizado nos dois mtodos. Atualizando o exemplo anterior teramos:
static void Main()
{
string Nome = ;
string Tefone = ;
bool Retorno = Dados(100, ref Nome, ref Telefone);
Console.WriteLine(Nome+ +Telefone);
}
static bool Dados(int Codigo, ref string Nome, ref string Telefone)
{
if(Codigo==100)
{
Nome = Marcos;
Telefone = 1234-5678;
return true;
}
else
{
Nome = Desconhecido;
Telefone = ;
return false;
}
}

A passagem de parmetros por valor mais utilizada pois a performance melhor, e no afeta as
variveis originais do mtodo.
6.2.4 Parmetros Mltiplos
Em algumas situaes precisamos passar um numero varivel de parmetros.
Nestes casos podemos utilizar array ou enumerador. No caso de array iremos abranger no mdulo
seguinte.
Quanto ao uso de enumeradores, como j mencionado no mdulo 3, se torna til por permitir que
seja utilizado parmetros nomeados. Quando utilizamos o mtodo normal, se um programador
passar parmetros fora de ordem no temos como detectar. Se for utilizado enumeradores, este
risco no existe. Veja o exemplo:
struct eDados
{
int Cdigo;
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 39 de 59

string Nome;
string Telefone;
}
static void Main()
{
eDados MeusDados;
MeusDados.Cdigo = 100;
bool Retorno = Dados(ref MeusDados);
Console.WriteLine(MeusDados.Nome + + MeusDados.Telefone);
}
static bool Dados(ref eDados MeusDados)
{
if(MeusDados.Codigo==100)
{
MeusDados.Nome = Marcos;
MeusDados.Telefone = 1234-5678;
return true;
}
else
{
MeusDados.Nome = Desconhecido;
MeusDados.Telefone = ;
return false;
}
}

A grande vantagem no modelo alterado acima que se o programador inverter a ordem dos dados
ao informar os parmetros no far diferena, uma vez que cada parmetro tem seu nome
especificado dentro do conjunto de dados.

6.3 Overload de Mtodos


Aps um mtodo ser criado e utilizado, a mudana pode ocasionar problemas, pois as chamadas de
um mtodo que contem quatro parmetros ser alterado para receber cinco parmetros causaria erro
nos cdigos onde eram apenas quatro parmetros.
Para isso criamos overloads que consiste em ter mais do que uma funo com o mesmo nome, mas
com os parmetros alterados. Para isto temos que conhecer o conceito de assinatura de mtodo.
Assinatura de mtodo consiste em nome do mtodo, tipo do mtodo, valor de retorno, nmero e tipo
de parmetros. Uma alterao em qualquer um destes itens alterou a forma como ele deve ser
chamado.
Pense no exemplo utilizado no out caso ele sofra alteraes:
static void Main()
{
string retNome = ;
string retTelefone = ;
bool Retorno = Dados(100, out retNome, out retTelefone);
Console.WriteLine(Nome+ +Telefone);
string retCEP = ;
Retorno = Dados(100, out retNome, out retTelefone, out CEP);
Console.WriteLine(Nome+ +Telefone);
}
static bool Dados(int Codigo, out string Nome, out string Telefone)
{
if(Codigo==100)
{
Nome = Marcos;
Telefone = 1234-5678;
return true;
}
else
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 40 de 59

{
Nome = Desconhecido;
Telefone = ;
return false;

static bool Dados(int Codigo, out string Nome, out string Telefone, out string CEP)
{
if(Codigo==100)
{
Nome = Marcos;
Telefone = 1234-5678;
CEP = 08888-999;
return true;
}
else
{
Nome = Desconhecido;
Telefone = ;
CEP = ;
return false;
}
}

Note que existem dois mtodos chamados Dados, um com trs e outro com quatro parmetros. Nas
execues no precisamos definir qual dos mtodos ser executado, pois o prprio CLR se
encarrega de escolher o mtodo que se encaixe no modelo de chamada que foi utilizado.
Com este recurso podemos ter vrios mtodos com o mesmo nome, mas com uma lista de
diferentes parmetros. Este recurso extensamente utilizado no prprio framework, visvel quando
digitamos o nome do mtodo e aparece uma lista das variaes que o mtodo possui.
Uma boa prtica ao utilizar overload que os mtodos chamem uns aos outros, por exemplo, o
mtodo que recebe quatro parmetros e o mais completo chamado pelo que recebe apenas dois
parmetros, que chama o de quatro parmetros passando dois parmetros vazios. A este processo
chamamos de mtodos recursivos, ou recursividade.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 41 de 59

7 Arrays e Parmetros
7.1 Definio
Um array no pode ser comparado a um banco de dados como muito o fazem.
Um banco de dados uma estrutura multi-tipos e bi-dimensional. Arrays so estrutura de um nico
tipo CTS e multi-dimensional.
Veja o diagrama comparativo:

No primeiro diagrama temos um conjunto de linhas com colunas predefinidas, onde para cada linha
temos trs colunas especificas e sempre preenchidas, ou seja um plano em 2D.
J o segundo diagrama mostra um conjunto de 10 linhas consecutivas onde para cada linha temos 2
conjuntos diferentes de nmeros no concorrentes em estrutura 3D. No caso o array seria definido
como 10 x 5 x 3.
7.1.1 Definindo Arrays
Para criar um array lembre-se de que s pode conter um tipo. Este deve ser definido logo na
definio, como a sintaxe abaixo:
Tipo[] NomeDaVarivel = new Tipo[Posies]

Como exemplo podemos criar um array que contenha a lista de meses:


string[] Meses = new string[12];
Meses[0] = Jan;
Meses[1] = Fev;
Meses[2] = Mar;
Meses[3] = Abr;
Meses[4] = Mai;
Meses[5] = Jun;
Meses[6] = Jul;
Meses[7] = Ago;
Meses[8] = Set;
Meses[9] = Out;
Meses[10] = Nov;
Meses[11] = Dez;
Console.WriteLine(Meses[Datetime.Now.Month-1]);

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 42 de 59

DICA: Ao criar os arrays note que definimos 12 posies, mas ao indexar utilizamos 11, uma vez que
o zero conta como posio.
Para retornar a descrio do ms desejado basta digitar o nome da varivel e a posio desejada,
como a ultima linha do cdigo de exemplo.
Para criar um array multidimensional a sintaxe similar:
Tipo[,] NomeDaVarivel = new Tipo[PosioX, PosioY, PosioZ, etc.]

Note que para cada posio existente no new deve haver uma virgula na definio inicial do tipo.
Para criarmos um array similar a uma tabela de cadastro, veja o exemplo:
string[,] Dados = new String[3,2];
Dados[0,0] = Joao;
Dados[0,1] = 223-6767;
Dados[1,0] = Joaquim;
Dados[1,1] = 223-4545;
Dados[2,0] = Maria;
Dados[2,1] = 223-1212;

Este modelo simula a tabela de cadastro onde utilizamos a primeira posio para indicar a linha e a
segunda posio para indicar as colunas. A estrutura criada graficamente representada:

7.2 Mtodos Comuns


Alguns mtodos dos arrays so importantes serem considerados, levando-se como exemplo o array
Dados[30,60]:
Mtodo
GetLength
Length
GetValue
GetType
Initialize

Exemplo
Dados.GetLength(1)
Dados.Length
Dados.GetValue(5,6)
GetType()
Initialize()

Resultado
60
1800
Nome
System.String[,]
Recria todas as posies

Outro interessante mtodo do array permite utilizar o construtor para poder criar o array no momento
de definio. O exemplo abaixo demonstra como faz-lo:
int[] Numeros = new Int[3] {10,20,30}
int[] Nmeros = new Int[3,2] {10,20,30}, {1,2,3}

Estes dois exemplo criam o array j preenchido, o primeiro com as trs posies e o segundo
exemplo de 3 x 2 posies.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 43 de 59

8 Classes Bsicas do .NET Framework


8.1 Classe AppDomain e Application
Com esta classe temos acesso a dados importantes do sistema atual.
Veja na tabela abaixo um exemplo utilizando uma aplicao:
Mtodo
AppDomain.CurrentDomain.BaseDirectory
AppDomain.CurrentDomain.FriendlyName
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

Application.CommonAppDataPath
Application.CommonAppDataRegistry
Application.AllowQuit
Application.CurrentInputLanguage
Application.StartupPath
Application.Idle

Resultado
Diretrio da aplicao
Nome do executvel
Arquivo de configurao da aplicao
Retorna o diretrio onde os programas so instalados
Retorna a chave de registry compartilhada
Define se esta aplicao pode ou no derrubada
Configurao regional do usurio
Diretrio indicado no atalho
Evento que acontece quando a aplicao est parada

Com estes dados podemos saber o diretrio onde est o executvel, o nome do sistema sendo
executado no momento e onde se encontra a configurao da aplicao.
Com estes dados em mos podemos gravar arquivos de configurao da aplicao ou ler este que
est no mesmo diretrio que o executvel.

8.2 Classe Security


A classe security importante para termos informaes sobre o usurio que est logado na
maquina. Essa informao til para saber se o nome do usurio, em aplicativos onde podemos ler
o usurio do Windows e utiliza-los mais tarde no momento dos acessos da aplicao:
Mtodo
System.Security.Principal.WindowsIdentity.GetCurrent().IsAnonymous
System.Security.Principal.WindowsIdentity.GetCurrent().IsAuthenticated
System.Security.Principal.WindowsIdentity.GetCurrent().Name
System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType

Resultado
False
True
msincic
NTLM

Estes mtodos para autenticao fornecem dados em aplicaes onde utilizaremos o usurio do
prprio Windows para controlar o acesso ao sistema.
Tambm podemos usa-los para gravar logs e acessar banco de dados quando este trabalhar em
modo de autenticao pelo sistema operacional e no por modelo proprietrio.

8.3 Classe IO
A classe IO importante para acesso a discos, diretrios, arquivos e principalmente leitura e
gravao de textos.
O exemplo abaixo demonstra como utilizar a classe de leitura e gravao de arquivos texto:
//Cria um novo arquivo texto informando o local. O true indica que para acrescentar
System.IO.StreamWriter GravaLog = new System.IO.StreamWriter(@"C:\Log.txt",true);
//Grava no arquivo uma linha com a data e hora atual
GravaLog.WriteLine(DateTime.Now.ToString());
GravaLog.Close();
//Abre o arquivo texto, a arroba serve para indicar string com caracteres especiais
System.IO.StreamReader LerLog = new System.IO.StreamReader(@"C:\Log.txt");
//Cria uma string e coloca todo o conteudo do arquivo, utilizando ReadLine podemos ler uma unica linha
string Conteudo = LerLog.ReadToEnd();
MessageBox.Show(Conteudo);
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 44 de 59

LerLog.Close();

Tambm podemos utilizar o IO para controlar diretrios e arquivos como os mtodos abaixo
demonstram:
Mtodo
System.IO.File.Delete(caminho)
System.IO.File.Copy(origem, destino)
System.IO.File.GetLastWriteTime(caminho)
System.IO.Directory.CreateDirectory(caminho)
System.IO.Directory.Delete(caminho)
System.IO.Directory.GetDirectories(caminho)
System.IO.Directory.GetFiles()

Resultado
Deleta um arquivo
Cpia de arquivos
Ultima alterao no arquivo
Cria um subdiretrio
Deleta diretrio
Array dos subdiretrios de um diretrio informado
Array dos arquivos de um diretrio informado

Com estas informaes podemos detectar alterao em um determinado arquivo de configurao,


saber a lista de arquivos e diretrios, deletar e copiar.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 45 de 59

9 Classes e Objetos
9.1 Definio de Classes e Objetos
Uma classe pode ser definida como um negativo para uma foto.
O negativo no pode ser utilizado quando queremos mostrar algo a algum, nem utilizar o negativo
como prova de algo, pois ele no considerado concreto. Ao utilizarmos o negativo para gerar uma
fotografia revelada concretizamos o objeto que chamamos de foto.
Da mesma forma, cada negativo pode gerar infinitas cpias independentes, permitindo que cada
cpia da foto seja distribuda a uma diferente pessoa. J o negativo no pode ser distribudo, nem a
foto copiada a menos que a transforme em negativo novamente.
O mesmo pode ser comparado a uma classe. Classes so bases para objetos, so virtuais. Quando
queremos utilizar uma classe precisamos instanci-la, dando-lhe um nome e utilizando esta instancia
e no a classe original.
A grande vantagem de utilizao das classes que ao inferir uma mudana na classe, todos os
objetos passam automaticamente a refletir as alteraes.
Para exemplificar uma classe pense nas variveis, uma vez que precisamos criar a varivel inteira
para poder colocar nmeros dentro dela. No podemos apenas jogar nmeros no tipo inteiro do
CTS. Veja o exemplo abaixo:
int Ano = 2004;
int = 2004;

//Funciona, uma vez que a varivel Ano do tipo inteiro


//No funciona, inteiro no pode guardar dados dentro dele

Quando utilizamos uma classe precisamos atribuir a ela um novo nome, e no utilizamos mais o
nome original (int) e sim o nome a ela atribuido (Ano). A nome atribudo chamamos de objeto.
Utilizando um exemplo real e concreto de meios de veculos podemos entender melhor os conceitos
de OOP, uma vez que um veculo do tipo automvel igual a outros automveis da mesma marca,
modelo e ano, mudando apenas os valores atribudos as caractersticas. Ou seja, um automvel
base de qualquer carro que existe, ento ao criar um novo carro podemos partir do automvel com
suas caractersticas bsicas.
O mesmo acontece com pessoas. Joo, Maria e Joaquim possuem olhos, cabelos, pernas, braos,
sabem andar, correr, comer e assim por diante. O que eles tem em comum que os trs vieram da
classe pessoa que lhes atribui estas propriedades e mtodos.
9.1.1 Abstrao e Encapsulamento
O primeiro conceito em OOP abstrao e encapsulamento. Significam que objetos so criados
para evitar duplicar esforos, sendo este o principal mrito da programao orientada a objetos.
Antes das linguagens OOP em todos os lugares onde precisasse utilizar dados do veculo era
necessrio recriar as variveis e reescrever os cdigos que controlam o veiculo.
Neste aspecto o encapsulamento ajuda porque ao utilizar a classe veculos automaticamente dentro
da classe j esto criadas as variveis que o carro utiliza, bem como as aes que ele realiza. Como
os cdigos e definies esto prontos, no necessrio recriar variveis nem reescrever mtodos,
ou seja, nos tornamos abstratos, uma vez que no precisamos nos preocupar em como fazer
determinada tarefa. Encapsulamento est intrnseco a abstrao, pois se o cdigo est pronto no
precisamos refaze-lo.
Um exemplo prtico quando utilizamos a funo MessageBox.Show() do framework. No
precisamos definir um formulrio, o cone, os botes nem o cdigo para montar toda a janela que a
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 46 de 59

mensagem demonstra. Todo o necessrio para montar uma mensagem j est encapsulado no
MessageBox, permitindo que abstraiamos o processo de criar a mensagem.
9.1.2 Herana
Conceitualmente herana quando criamos uma classe de objetos com base em uma j existente,
para reaproveitar o que a classe de objetos anterior j possui.
Um exemplo tpico de herana quando criamos uma varivel do tipo string. Os mtodos que uma
string possui no precisam ser criados a todo momento, porque quando criamos uma string
herdamos o comportamento do qual todas as strings devem ter.
No grfico abaixo veja como a classe veculos serve para herana:

Note que todos os veculos possuem caractersticas comuns, tanto atributos quanto mtodos. Mas
automveis possuem motor e r que no h nos outros tipos, assim como motocicleta possuiu motor
em tempos, o que no acontece com automvel.
Ao instanciar uma motocicleta no preciso escrever as variveis cor, marca, modelo, fabricante e
rodas, nem os mtodos andar, frear e acelerar, j que estes esto sendo herdados do objeto
veculos, bastando criar os atributos motor e tempos para ter a motocicleta completa.
9.1.3 Polimorfismo
Polimorfismo permitir que aps herdar um determinado mtodo em uma classe eu possa altera-lo.
Como em OOP os cdigos esto encapsulados, nem sempre um objeto trabalha exatamente como o
objeto original trabalha.
Por exemplo, eu herdei na bicicleta o mtodo acelerar dos veculos, mas uma bicicleta tem um
modelo de acelerao diferente dos automveis e motocicletas. Sendo assim, eu preciso mudar o
cdigo encapsulado nos veculos quando o veculo for motocicleta. Ou seja, eu preciso morfar o
mtodo para adapta-lo a uma forma diferente da qual originalmente ele deveria ter.
9.1.4 Classes Abstratas
Um classe abstrata quando criamos uma classe que no possa ser diretamente criada. Ela existe
para servir de base a outras classes e no para uso direto.
Por exemplo, no existe um veiculo, mas sim automveis, motocicletas e bicicletas. Para que no se
utilize veculos a classe abstrata. Eu posso utilizar a classe veculos como base para a classe
automveis, motocicletas e bicicletas que podem ser utilizados normalmente na aplicao, mas a
classe veculos eu no consigo utilizar na aplicao.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 47 de 59

9.1.5 Interfaces
Estas servem para definir comportamento obrigatrio sem definir o cdigo do mtodo.
Todos os veculos precisam saber andar, frear e acelerar, por isso criamos a classe abstrata
veculos. Mas alem de veculos existe uma superclasse que podemos chamar de Meios de
Locomoo, e esta inclui barcos, avies e veculos.
Neste caso no criamos uma classe chamada meios de locomoo pois a variao de atributos
muito grande entre os trs tipos mencionados. Neste caso definimos apenas os mtodos que todos
devem ter, por exemplo, ligar, desligar e acelerar.
Estas so as interfaces, so criadas para obrigar uma classe que a utilize a implementar
corretamente o mtodo. Podemos simplificar o conceito de interface por dizer que um padro de
mtodo a ser utilizado.
Veja abaixo o cdigo que gera uma interface:
interface MeiosDeLocomocao
{
bool Ligar();
bool Desligar();
int Acelerar(Int16 Intensidade);
}

A classe que utilizar esta interface ser obrigada a criar os trs mtodos acima e no pode no
mtodo acelerar utilizar um longo ao invs de um inteiro curto. Como comentado anteriormente,
obrigamos o programador a colocar estas interfaces exatamente como esto definidas.
MeiosDeLocomocao .
Representamos interfaces graficamente em UML com o smbolo

9.2 Criao e Instanciamento de Classes


A criao de uma classe segue o padro definido nos mdulos iniciais.
Como exemplo utilizaremos uma classe chamada de pessoas e a partir desta criar os integrantes de
um departamento, por exemplo. O cdigo bsico da classe :
public class Pessoas
{
public string Nome;
public string Departamento;
public int Idade;
public string Endereco;
public bool Comer(string Alimento)
{
if(Alimento.Length==0)
return false;
Console.WriteLine("Estou comendo {0}", Alimento);
return true;
}
public bool Andar(int Intensidade)
{
if(Intensidade == 0)
return false;
Console.WriteLine("Estou andando a {0} passos", Intensidade);
return true;
}
}

Analisando o cdigo acima podemos notar que pessoas possuem caractersticas como nome,
endereo, idade e departamento, assim como os mtodos andar e comer. Como os dois mtodos j
possuem cdigos de validao, utilizamos encapsulamento, pois quem utilizar a classe pessoas no
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 48 de 59

precisa digitar cdigo de validao ao andar. Tambm utilizamos abstrao por evitar que o
programador tenha que se preocupar em como feita a validao do andar e comer, isto no
importa para ele, pois j est pronto.
Para utilizar uma classe precisa instanci-la, e fazemos isto por utilizar a seguinte sintaxe bsica:
classe NomeDaInstancia = new classe();

Seguindo esta sintaxe, para utilizar a classe pessoas e criar Maria utilizamos o cdigo:
Pessoas Maria = new Pessoas();

Em seguida, com a instancia Maria de Pessoas podemos atribuir os valores e utilizar os mtodos:
Maria.Nome="Maria Silva";
Maria.Departamento="IT";
Maria.Endereco="Rua dos abrolhos";
Maria.Idade=25;
Maria.Andar(40);
Maria.Comer("Alface");

Note que no precisamos fazer nada para utilizar os mtodos e atributos, uma vez que no conceito
de objetos Maria possui tudo que a classe Pessoas possua originalmente, como mostra a figura a
seguir:

9.2.1 Propriedades e Enumeradores


Ao criar instancias e classes como o exemplo acima, notamos um inconveniente nos atributos.
Apenas definimos que os atributos so do tipo CTS desejado, mas no estamos validando o tipo de
departamento que pode ser utilizado.
A primeira forma de melhorar este processo utilizando propriedades ao invs de variveis simples.
Para isso precisamos criar uma varivel interna na classe que ir guardar o valor informado, e criar a
propriedade que mostra ou recebe este valor. Ou seja, todas as propriedades que forem criadas
precisam ter uma varivel interna para guardar seu valor, uma vez que a propriedade um mtodo.
Vamos transformar Idade em propriedade, com o resultado a seguir:
public class Pessoas
{
public string Nome;
public string Departamento;
public string Endereco;
private int pIdade;
public int Idade
{
get { return pIdade; }
set
{
if(value < 1 || value > 120)
throw(new Exception(Idade invalida);
else
pIdade = value;
}
}
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 49 de 59

public bool Comer(string Alimento)


{
if(Alimento.Length==0)
return false;
Console.WriteLine("Estou comendo {0}", Alimento);
return true;
}
public bool Andar(int Intensidade)
{
if(Intensidade == 0)
return false;
Console.WriteLine("Estou andando a {0} passos", Intensidade);
return true;
}

}
Note que agora Idade pode ser utilizado em Maria como sempre foi, mas internamente a classe
agora guarda a idade na varivel pIdade e a anterior variavel se transformou em dois mtodos,
sendo o primeiro o get, ou seja, quando perguntarmos a idade de Maria com Maria.Idade o que ir
acontecer a instruo return(pIdade). Quando alterarmos a idade de Maria com Maria.Idade=20 o
que estamos fazendo rodando um mtodo set que recebe uma varivel value, no caso com valor
20, e atribui este valor a pIdade.
Como pIdade private no aparece na lista de propriedades de Maria, existindo apenas
internamente.
Outra forma de validar dados utilizando o enum j visto anteriormente, que gera uma lista de
valores possveis. Vamos implementar enum na lista de departamentos, limitando os departamentos
que podem ser utilizados:
public enum ListaDepartamentos
{ IT, RH, Administracao, Financeiro }
public class Pessoas
{
public string Nome;
public ListaDepartamentos Departamento;
public string Endereco;

O atributo Departamento, antes do tipo string agora do tipo ListaDepartamentos, portanto, no


pode mais ser colocado nele qualquer valor, mas apenas os quatro tipos definidos. Para informar o
cdigo de Maria agora seria:
Pessoas Maria = new Pessoas();
Maria.Nome="Maria Silva";
Maria.Departamento=ListaDepartamentos.IT;

Utilizando as propriedades e enumeradores conseguimos criar uma classe mais simptica para uso,
com restries e valores simples de serem encontrados.
9.2.2 Construtores
Ainda outro facilitador a utilizao de classe so os construtores. Todas as classes possuem um
construtor padro vazio, como a seguir:
public class Pessoas
{
public Pessoas()
{
}

O mtodo que leva o mesmo nome da classe sem receber parmetros o construtor que
executado quando utilizamos a instruo Pessoas Maria = new Pessoas().
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 50 de 59

Como a classe pessoas possui quatro atributos obrigatrios, podemos reescrever o construtor para
que no momento do new j sejam informados. Portanto, o construtor passaria a ser:
public class Pessoas
{
public Pessoas(string pNome, ListaDepartamentos pDepartamento, int pIdade, string pEndereco)
{
Nome = pNome;
Departamento = pDepartamento;
Idade = pIdade;
Endereco = pEndereco;
}
public Pessoas()
{}

Com este novo construtor podemos continuar utilizando o new sem parmetros, ou ento podemos
agora construir o objeto j com os dados:
Pessoas Maria = new Pessoas(Maria, ListaDepartamentos.IT, 25, Rua dos Abrolhos);

Um bom exemplo de construtor o MessageBox.Show que possui 12 diferentes construtores com


diferentes parmetros, utilizando overload.
9.2.3 Destrutores
Assim como o construtor, tambm existem os destrutores, mtodos que so executados ao se
terminar de usar o objeto. Pode ser usado para apagar arquivos temporrios, fechar conexo e
liberar memria.
Construtores podem ser reescritos, destrutores no. O que podemos adicionar funes ao
destrutor usando o cdigo a seguir:
public class Pessoas
{
~Pessoas()
{
Console.WriteLine("Fui destruido...");
}
public Pessoas(string pNome, ListaDepartamentos pDepartamento, int pIdade, string pEndereco)

Por estranho que possa parecer, a sintaxe de um destrutor o nome da classe precedido por um
sinal til (~).
Um importante aviso sobre destrutores que o componente Garbage Collector no destri um objeto
assim que ele para de ser usado, mas sim quando a maquina requer recursos e aciona o GC. Por
isso, voc no ter como garantir o momento em que seu destrutor ir executar.

9.3 Controle de Acessibilidade


Acessibilidade ou visibilidade significa quem pode ver uma determinada varivel ou mtodo criado
dentro da classe. Os principais assessores no C# so:
Accesor Escopo visvel
private
Apenas dentro do mtodo ou da classe em que foi criado. Veja como exemplo a varivel pIdade da classe Pessoas criadas
anteriormente.
public
acessado dentro da classe e fora da classe para quem a instanciar. Veja como exemplo a variavel Nome e o mtodo
Andar.
internal Pblico dentro do mesmo assemblie compilado, mas privado para outros assemblies.

Os assessores mais utilizados so o private para definir mtodos e atributos que sero utilizados
localmente e public para os mtodos e atributos que precisam ser informados ou executados nos
objetos.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 51 de 59

9.3.1 Mtodos Estticos


Outro assessor especial o static. Este tem uma funo diferente dos anteriores pois combinado
com o public ou o private, dependendo da visibilidade desejada.
A grande diferena do static que a classe no precisa ser instanciada para que eles sejam
utilizados. Um exemplo tpico de mtodos estticos o Show do MessageBox. No precisamos
instanciar um objeto MessageBox para utilizar seu mtodo Show.
Podemos exemplificar por criar uma classe IPVA para clculos:
public class IPVA
{
static IPVA()
{
}
public static decimal CalculaIPVA(int Ano, int Fator)
{
return Ano*Fator;
}
public static decimal MultaIPVA(decimal Valor)
{
return Valor*(decimal)0.10;
}
}

Como neste caso tanto o construtor quanto os mtodos so estticos utilizamos diretamente as
operaes desejadas, como a seguir:
decimal Resultado = IPVA.MultaIPVA(3456);

DICA: A este modelo de classes chamamos de pattern Singleton.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 52 de 59

10 Herana e Polimorfismo
Retornando o exemplo de veculos definidos no mdulo anterior iremos ver como o conceito de
herana e polimorfismo pode ser bem utilizado.
Para uma classe herdar (usualmente chamada de classe concreta) o que outra classe j implementa
utilizamos o sinal dois pontos (:) e na seqncia o nome da classe que queremos herdar. Veja o
exemplo de cdigo a seguir:
interface MeiosDeLocomocao
{
bool Ligar();
bool Desligar();
int Acelerar(Int16 Intensidade);
}
abstract class Veiculos : MeiosDeLocomocao
{
public string Cor;
public string Fabricante;
public string Marca;
public string Modelo;
public int Rodas;
bool Andar()
{
return true;
}
bool Frear()
{
return true;
}
public int Acelerar(Int16 Intensidade)
{
return 0;
}
public bool Ligar()
{
return true;
}
public bool Desligar()
{
return true;
}
}
public class Automoveis : Veiculos
{
}
public class Motocicletas : Veiculos
{
}
public class Bicicletas : Veiculos
{
}

A classe Veculos implementa os mtodos da interface MeiosDeLocomocao, enquanto as classes


Automveis, Motocicletas e Bicicletas herdam a classe Veculos, no precisando implementar nada
para conter os atributos e mtodos da classe pai.
Veja na figura a seguir a utilizao simples da classe Bicicletas:

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 53 de 59

Os mtodos que a classe Veculos possua, bem como os atributos j constam no momento em que
utilizamos a classe Bicicletas.
Agora que entendemos a herana precisamos definir o que cada classe tem individualmente, alem
do que a classe pai herdada j possua. Como em nosso exemplo as classes Motocicletas e
Automoveis tinham atributos e mtodos prprios, seu cdigo seria:
public class Automoveis : Veiculos
{
public int Motor;
public bool Re(int Velocidade)
{
Console.WriteLine("Estou dando re a {0}", Velocidade);
return true;
}
}
public class Motocicletas : Veiculos
{
public int Motor;
public short Tempos;
}

Note que alem dos mtodos e treinamentos j existentes nos veculos, apareceram tambme o
mtodo Re e o atributo Motor que so prprios de automveis.

10.1 Classes e Mtodos Protegidas


Classes protegidas so aquelas que no podem ser herdadas, ou seja, so classes concretas finais.
Para isto utilizamos o assessor de proteo temos as instruo sealed para a classe e protected
para os mtodos.
A instruo sealed pode ser usada como a seguir:
sealed public class Automoveis : Veiculos
{
public int Motor;
public bool Re(int Velocidade)
{
Console.WriteLine("Estou dando re a {0}", Velocidade);
return true;
}
}
sealed public class Motocicletas : Veiculos
{
public int Motor;
public short Tempos;
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 54 de 59

Com esta alterao no permitimos que um programador crie uma classe a partir da classe
automveis e motocicletas, ou seja se eu tentar executar a instruo abaixo retornar erro:
public class Honda : Motocicletas

Assim como o sealed para proteo da herana na classe podemos fazer o mesmo protegendo os
mtodos de serem alterados por polimorfismo. Para isso utilizamos a instruo protected no mtodo
que queremos proteger, como o exemplo abaixo:
public class Automoveis : Veiculos
{
public int Motor;
protected public bool Re(int Velocidade)
{
Console.WriteLine("Estou dando re a {0}", Velocidade);
return true;
}
}

Ao utilizar o protected acima no queremos mais a classe protegida, uma vez que neste caso a
classe pode ser herdada ou utilizada como classe concreta. A diferena que o mtodo Re s ser
visto em classes herdadas.
Se no exemplo acima eu criar uma nova classe e herdar a classe Automveis o mtodo Re
aparecer, mas se eu criar um objeto utilizando a classe Automveis o mtodo Re no ir aparecer,
como o exemplo abaixo:

Note que na classe criada que herdou a classe Automveis o mtodo Re apareceu, mas apenas na
classe que herdou, no sendo visvel a objetos criados a partir da nova classe.

10.2 Polimorfismo
Utilizamos polimorfismo para alterar o mtodo como algo acontece na classe pai.
Voltando ao exemplo dos veculos, imagine que bicicleta tambm recebeu um mtodo ligar e
desligar, mas precisa mudar a forma destes acontecerem:
public abstract class Veiculos : MeiosDeLocomocao
{
public string Cor;
public string Fabricante;
public string Marca;
public string Modelo;
int Rodas;
bool Andar()
{
return true;
}
bool Frear()
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 55 de 59

{
return true;
}
public int Acelerar(Int16 Intensidade)
{
return 0;
}
public virtual bool Ligar()
{
return true;
}
public virtual bool Desligar()
{
return true;
}
}
sealed public class Bicicletas : Veiculos
{
public override bool Ligar()
{
Console.WriteLine("No possvel ligar uma bicicleta.");
return false;
}
public override bool Desligar()
{
Console.WriteLine("No possvel desligar uma bicicleta.");
return base.Desligar();
}
}

Note que os mtodos ligar e desligar receberam a palavra chave virtual que identifica aquele mtodo
como podendo ser reescrito. Na classe Bicicletas os mtodos ligar e desligar foram reescritos com a
instruo override, identificando que iro sobrepor a implementao original da classe.
A chamada base.Desligar() permite que o mtodo desligar reescrito execute o cdigo original da
classe pai, aps rodar o cdigo alterado.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 56 de 59

11 Namespace, Delegates, Operadores e Eventos


11.1 Namespace
Namespaces podem ser utilizados para organizar mtodos e classes.
Por exemplo, o cdigo abaixo cria os mtodos com diferentes namespaces:
namespace Curso
{
namespace Utilitrios
{
public class Calculos {}
public class Financeiro {}
}
namespace Dados
{
public class CarregaXML {}
public class GravaXML {}
}
}

Para utilizar as funes acima podemos utilizar duas formas. A primeira envolve colocar o aplicativo
no mesmo namespace que esto as classes ou colocar o namespace inteiro na definio do objeto:
namespace Curso.Utilitrios
{
public class Teste
{
Calculos x = new Calculos();
//Classe que esta em outro namespace, diferente da aplicao
Curso.Utilitrios.GravaXML y = new Curso.Utilitrios.GravaXML();
}
}

A segunda forma, mais utilizada definir que ir utilizar o namespace, como o exemplo a seguir
demonstra:
using Curso.Utilitrios;
using Curso.Calculos;
{
public class Teste
{
Calculos x = new Calculos();
GravaXML y = new GravaXML();
}
}

A vantagem de utilizar o primeiro mtodo de colocar a aplicao no mesmo namespace ou com ele
completo que posso ter mtodos com o mesmo nome em namespaces diferentes. J com a
utilizao do using se houver mtodos com o mesmo nome, no sero acessados corretamente.

11.2 Delegates
Algumas vezes precisamos permitir que um mesmo mtodo chamado pelo programa cliente execute
mltiplos mtodos diferentes na classe original.
Por exemplo, se existe um mtodo que disponibiliza determinado dado e faz gravao de log, e
todas as vezes em que for chamado o mtodo original este mtodo de log tambm precisa ser
executado, temos um exemplo de delegate.

www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 57 de 59

O framework composto de mltiplos delegates, como por exemplo, ao se carregar um formulrio


ocorrem os eventos Activate, Show, Load e Initialize. Bastar chamar o delegate Show para que os
quatro aconteam juntos.
Pensando em nossa classe de veculos, podemos implementar um delegate Correr que dispara o
Ligar, Desligar e Correndo de uma nica vez. Veja o cdigo atualizado:
public abstract class Veiculos : MeiosDeLocomocao
{
public delegate bool Correr();
public string Cor;
public string Fabricante;
public string Marca;

sealed public class Bicicletas : Veiculos


{
public Veiculos.Correr DelegCorrendo;
public Bicicletas()
{
DelegCorrendo = new Correr(BicCorrendo);
DelegCorrendo += new Correr(Ligar);
DelegCorrendo += new Correr(Desligar);
}
public bool BicCorrendo()
{
Console.WriteLine("Bicicleta Correndo.");
return true;
}
public override bool Ligar()
{
Console.WriteLine("No possvel ligar uma bicicleta.");
return true;
}
public override bool Desligar()
{
Console.WriteLine("No possvel desligar uma bicicleta.");
base.Desligar();
return true;
}
}

Na aplicao de formulrio apenas com o cdigo abaixo sero executados os trs cdigos includos
no delegate:
Bicicletas Aro20 = new Bicicletas();
Aro20.DelegCorrendo();

Este recurso muito utilizado quando no queremos disponibilizar o polimorfismo entre objetos,
neste caso disponibilizamos o delegate para que o programador agrupe o mtodo que ele est
criando a um mtodo que a classe pai j possui.

11.3 Operadores
Nos exemplos anteriores notamos que classes podem conter dados, mas podemos levantar uma
questo. E se eu precisar somar uma classe a outra?
Para isso podemos fazer overload tambm nos operadores padro. Por exemplo, se eu criar uma
classe de metragem e cada cmodo da casa for uma instancia, precisamos somar as diferentes
instancias para conseguir chegar ao resultado desejado.
Veja o exemplo abaixo de como isso pode ser feito:
public class Metragem
{
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 58 de 59

public decimal Largura;


public decimal Altura;
public static decimal operator+(Metragem Comodo1, Metragem Comodo2)
{
decimal ResultadoM2;
decimal M2Comodo1 = Comodo1.Altura * Comodo1.Largura;
decimal M2Comodo2 = Comodo2.Altura * Comodo2.Largura;
ResultadoM2 = M2Comodo1 + M2Comodo2;
return ResultadoM2;
}
}

Note que o mtodo de overload do operador (+) tem uma sintaxe fixa, onde ele retorna o decimal
recebendo as duas instancias desejadas na origem.
Para utilizar o exemplo acima, veja o cdigo:
Metragem Sala = new Metragem();
Metragem Quarto = new Metragem();
Sala.Altura = (decimal)2.50; Sala.Largura = (decimal)3.50;
Quarto.Altura = (decimal)3.40; Quarto.Largura = (decimal)2.30;
decimal Apartamento = Sala + Quarto;
MessageBox.Show(Apartamento.ToString());

11.4 Eventos
Eventos so importantes para definir que algo aconteceu. Como exemplo, quando executamos um
formulrio o framework nos permite utilizar um evento Load que acontece todas as vezes que o
formulrio foi lido.
O mesmo podemos fazer para que o programador que utilize uma classe saiba que determinada
ao na classe aconteceu. Por exemplo, quando o automvel andar de r automaticamente um
evento chamado DandoRe acontece na aplicao cliente.
Para definir um evento, na classe utilize a seguinte sintaxe como o exemplo a seguir:
public class Automoveis : Veiculos
{
public delegate void DarRe();
public event DarRe DandoRe;
public int Motor;
public bool Re(int Velocidade)
{
Console.WriteLine("Estou dando re a {0}", Velocidade);
DandoRe();
return true;
}
}

Note no cdigo que ligado a um delegate foi definido que o evento acontecer, portanto ao chamar a
funo Re do automvel, a aplicao envia o evento para o aplicativo que chamou o automvel e o
mtodo r.
Como o exemplo especificado um formulrio com um boto, na definio do formulrio inclumos
os comandos:
private void InitializeComponent()
{
this.Gol = new Automoveis();
Gol.DandoRe += new Automoveis.DarRe(Gol_DandoRe);

Os cdigos acima criam uma instancia do automvel e assinam o cdigo do evento, indicando que
no momento em que o mtodo DarRe for executado na classe o evento Gol_DandoRe dever
www.marcelosincic.com.br

Reproduo e distribuio livre

Verso: 2.0

www.marcelosincic.com.br

Pgina 59 de 59

acontecer no formulrio. Portanto, no momento em que algum cdigo mandar o carro andar de r o
evento acontecer automaticamente.
Abaixo veja o mtodo sendo chamado pelo boto e o evento que responde a ele:
private void button5_Click(object sender, System.EventArgs e)
{
Gol.Re(100);
}
private void Gol_DandoRe()
{
MessageBox.Show("O automovel esta dando re...");
}

www.marcelosincic.com.br

Reproduo e distribuio livre

Você também pode gostar