Escolar Documentos
Profissional Documentos
Cultura Documentos
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
Verso: 2.0
www.marcelosincic.com.br
Pgina 2 de 59
1.2
1.3
Resumo das Classes do .NET Framework ______________________ 7
1.3.1 Class Library _____________________________________________ 8
1.3.2 Classes Especializadas _____________________________________ 9
1.4
2
3.2
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
3.5
3.6
3.7
Generics _________________________________________________ 23
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
Verso: 2.0
www.marcelosincic.com.br
Pgina 3 de 59
5.2
Try-Catch-Finally __________________________________________ 30
5.2.1 Try-Finally ______________________________________________ 31
5.2.2 Throw __________________________________________________ 32
5.3
6
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
Mtodos Comuns__________________________________________ 42
8.2
8.3
Classe IO ________________________________________________ 43
www.marcelosincic.com.br
Verso: 2.0
10.2
www.marcelosincic.com.br
Pgina 4 de 59
Polimorfismo _____________________________________________ 54
Namespace _______________________________________________ 56
11.2
Delegates ________________________________________________ 56
11.3
Operadores _______________________________________________ 57
11.4
Eventos __________________________________________________ 58
www.marcelosincic.com.br
Verso: 2.0
www.marcelosincic.com.br
Pgina 5 de 59
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.
www.marcelosincic.com.br
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
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
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.
www.marcelosincic.com.br
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.
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
Pgina 9 de 59
Mdulo 8
Framework Avanado
Mdulo 7
www.marcelosincic.com.br
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
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.
Verso: 2.0
www.marcelosincic.com.br
Pgina 12 de 59
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.
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
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
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.
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
Verso: 2.0
www.marcelosincic.com.br
Pgina 16 de 59
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
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
Verso: 2.0
www.marcelosincic.com.br
[System.Windows.Forms]System.Windows.Forms.Control::set_Text(string),
Pgina 18 de 59
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
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
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
Verso: 2.0
www.marcelosincic.com.br
Pgina 20 de 59
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;
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;
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 <=
is
&&
||
?:
++
-%
>>= 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)
Verso: 2.0
www.marcelosincic.com.br
Pgina 21 de 59
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.
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
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()
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;
//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
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 .
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
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;
www.marcelosincic.com.br
Verso: 2.0
www.marcelosincic.com.br
Pgina 25 de 59
//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
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;
}
}
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
}
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
Verso: 2.0
www.marcelosincic.com.br
Pgina 28 de 59
do
{
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
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
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
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
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))
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.
//ou unchecked
instrues
www.marcelosincic.com.br
Verso: 2.0
www.marcelosincic.com.br
Pgina 33 de 59
www.marcelosincic.com.br
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 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
Verso: 2.0
www.marcelosincic.com.br
Pgina 35 de 59
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.
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
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
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
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.
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
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]
www.marcelosincic.com.br
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:
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
Verso: 2.0
www.marcelosincic.com.br
Pgina 43 de 59
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.
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
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
www.marcelosincic.com.br
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;
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
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
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
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
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:
Verso: 2.0
www.marcelosincic.com.br
Pgina 49 de 59
}
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;
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
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);
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.
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
Verso: 2.0
www.marcelosincic.com.br
Pgina 51 de 59
Como neste caso tanto o construtor quanto os mtodos so estticos utilizamos diretamente as
operaes desejadas, como a seguir:
decimal Resultado = IPVA.MultaIPVA(3456);
www.marcelosincic.com.br
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
{
}
www.marcelosincic.com.br
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.
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
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
Verso: 2.0
www.marcelosincic.com.br
Pgina 56 de 59
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
Verso: 2.0
www.marcelosincic.com.br
Pgina 57 de 59
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
Verso: 2.0
www.marcelosincic.com.br
Pgina 58 de 59
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
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