Você está na página 1de 77

Sumrio

Contedo Pgina
Captulo 1- .NET 1
Framework
O que ? 1
Histria 1
Verses do .NET Framework 2
Principais Recursos por verses 2
Arquitetura bsica 3
O que IL? 3
Garbage Collection 6
GAC 6
LINKS 7

Captulo 2-Microsoft 8
Visual Studio 2010
O que ? 8
Histria 8
Funcionalidades por verses 8
Como iniciar? 8
Estrutura de um projeto e tipos de 10
arquivos bsicos
Templates 11
Code Snippet 12
Ferramentas de analise de cdigo 13
Principais janelas do VS 2010 13
Debugando com VS 2010 13
IntelliTrace 14
Gerando um release 16
LINKS 16

Captulo 3-Microsoft C# 17
O que ? 17
Histria 17
Viso conceitual classes 17
Namespaces 18
Using 18
Tipos de dados bsicos 19
Tipos de valor e de referncia 20
Varveis 21
Operadores 21
Desvios condicionais 24
Switch 25
Estruturas de repetio 26
Tratamento de erro 30
Arrays e Lists 30
Windows Forms 32
Eventos 32
Guia rpido: Hello World 33
Principais componentes Windows 34
Forms
Trabalhando com arquivo texto 51
Modificadores de acesso 53
Classes 53
Propriedades e variveis 53
Construtores 54
Mtodos 56
Sobrecarga 57
Enums 59
Herana 59
Classes e mtodos estticos 60
Converses 61
Interfaces 61
ADO.net Trabalhando com 62
bancos de dados
Criao de controles 65
customizados
Generics 66
Lambda Expressions 67
Reflection 68
LINKS 71

Captulo 4 Orientao a 72
objetos
Pilares 72
Princpios 73
1 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Captulo 1 - Microsoft .NET Framework.

O que ?

Microsoft .NET componente construdo pela Microsoft, que visa uma plataforma nica para desenvolvimento e
execuo de sistemas e aplicaes. Todo e qualquer cdigo gerado para .NET, pode ser executado em qualquer dispositivo que
possua o framework de tal plataforma instalado. Dessa forma o programador deixa de escrever cdigo para um sistema ou
dispositivo especfico, e passa a escrever para a plataforma.NET.

O .net Framework projetado para atender os seguintes objetivos:

Fornecer um ambiente de programao orientada a objetos consistente, se o cdigo armazenado e executado


localmente, executado localmente, mas distribudo pela Internet ou executado remotamente.
Fornecer um ambiente de execuo que minimiza conflitos de implantao de software e controle de verses.
Fornecer um ambiente de execuo que promove a execuo segura do cdigo, incluindo cdigo criado por um
desconhecido ou por um terceiro que no seja totalmente confivel.
Fornecer um ambiente de execuo que elimina os problemas de desempenho de ambientes interpretados ou com scripts.
Tornar a experincia do desenvolvedor consistente, atravs dos diversos tipos de aplicaes, tais como aplicativos
baseados no Windows e aplicativos baseados na Web.
Construir toda a comunicao em padres da indstria para garantir que o cdigo com base no .net framework possa
interagir com qualquer outro cdigo.

Histria

A Microsoft lanou o .net Framework em 2001 com a inteno de redefinir a maneira que escrevemos programas para Windows e
tambm pra web, a iniciativa .net travou uma rdua briga com a Sun Microsystems em relao a verso da Microsoft da
linguagem java que era a mais usada para desenvolvimento de aplicativos .net quando o framework surgiu. Esta implementao
especfica do java concebida pela Microsoft foi nomeada J++ e sua biblioteca de classe WFC(Windows foundation Classes) foi
em grande parte desenhada por Ander Hejlsber um ex-funcionrio da Borland que ficou conhecido pela sua participao
nas linguagens Pascal, Turbo Pascal,Borland Pascal e Delphi. Posteriormente o Visual J + +( Visual Studio 6.0 foi o ltimo a
conter suporte a essa linguagem) foi descontinuado, Hejlsberg foi nomeado arquiteto-chefe da linguagem C # e um dos principais
desenvolvedores do .NET Framework.
2 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Verses do .net framework

Principais recursos por verso do framework

Cada verso do .net framework tem suas particularidades, porm toda verso completamente compatveis com as anteriores
minimizando assim o impacto da migrao de uma verso para outra, inclusive mdulos compilados em uma verso mais antiga
pode ser carregado em um aplicativo construdo com uma verso mais atual. Na tabela abaixo temos os principais alteraes
ocorridas em cada verso do .net framework, notem que nem sempre o CLR atualizado a cada verso do .net quer dizer que
apenas novos mdulos foram adicionados mas a forma de gerenciamento do cdigo permanece a mesma.

Verso do .NET Verso Verso do Visual Studio Descrio


Framework do CLR
1.0 1.0 Visual Studio .NET Contm a primeira verso do CLR e a primeira verso da
biblioteca de classes.
1.1 1.1 Visual Studio .NET 2003 Inclui atualizaes para o ASP.NET e pra o ADO.NET. Essa
verso foi posteriormente atualizada 2 vezes com o Service
Pack 1(SP1) e Service Pack 2(SP2) Essa verso tambm
introduziu a execuo sibe-by-side a qual habilita aplicaes
em um nico computador executar em vrias verses do CLR .
2.0 2.0 Visual Studio 2005
Introduziu uma nova verso do CLR com adies para as
bibliotecas de classes incluindo os tipos genricos, colees
genricas e acrscimos significativos para o ASP.NET. Esta
verso foi posteriormente atualizada com o SP1 e o SP2.

3.0 2.0 Visual Studio 2005 Esta verso essencialmente o .NET Framework 2.0 com a
adio do Windows Presentation Foundation (WPF), o
Windows Communications Foundation (WCF), o Windows
Workflow Foundation (WF) e o CardSpace. Posteriormente foi
atualizado com o SP1 e o SP2.

3.5 2.0 Visual Studio 2008 Acrescentou novas funcionalidades, tais como suporte a AJAX
e LINQ. A atualizao do SP1, acrescentou ao. NET
Framework, dados dinmicos, e um pequeno conjunto de
melhorias adicionais.
4 4 Visual Studio 2010 Inclui uma nova verso do CLR, bibliotecas de classes bsicas
e novas funcionalidades, tais como o Managed Extensibility
Framework (MEF) , dynamic language runtime (DLR) e code
contracts.
3 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Arquitetura bsica

O Microsoft .NET Framework composto por 2 componentes principais: o CLR(Common Language Runtime) e a biblioteca de
classes. O Common Language Runtime a base do Framework .NET. Voc pode pensar no Runtime como um agente que gere
cdigo em tempo de execuo, fornecendo principalmente servios como gerenciamento de memria, gerenciamento de segmento
e processamento remoto, ao mesmo tempo a segurana de tipos estritos e outras formas de preciso de cdigo que promovem
segurana e robustez. Na verdade, o conceito de gerenciamento de cdigo um princpio fundamental do runtime. Cdigo
rodando sobre o CLR conhecido como cdigo gerenciado, enquanto o cdigo que no roda sobre ele conhecido como cdigo
no gerenciado. A biblioteca de classes, o outro componente principal do .NET Framework, se trata de uma vasta coleo
orientada a objetos de tipos reutilizveis que voc pode usar para desenvolver aplicaes que vo desde a tradicional linha de
comando at aplicativos com interface grfica do usurio (GUI), para aplicativos com base em inovaes mais recentes fornecidas
pelo ASP.NET, como Web Forms e Servios Web XML.

Abaixo temos uma ilustrao com uma viso holstica da relao entre a biblioteca de classes, o.net framework, sua aplicao e o
sistema operacional ou o hardware.

O que IL?

Uma grande quantidade de linguagens podem ser utilizadas para construo de aplicativos baseados no .net framework , na
verdade qualquer linguagem que possua um compilador IL pode ser utilizada, como exemplo podemos citar C#, VB.NET,
DELPHI.NET e J#, apesar de o C# ter sido adotado como linguagem oficial para o .net framework. O que acontece na verdade
acontece que todo cdigo traduzido na compilao para IL que a abreviao Itermediate language, ou seja, linguagem
intermediria e essa a nica linguagem que o CLR entende sendo interpretada e gerenciada por ele em tempo de execuo e
transformando-a posteriormente em cdigo de mquina(binrio), os principais tipos de arquivos gerados por um compilador IL
variam dependendo do tipo de projeto so estes: EXE, DLL e ASPX.

Abaixo um pequeno exemplo hello world em c# e abaixo o mesmo programa em IL.

Verso C#;

using System;
namespace HelloWorldIL
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World !");
}
}
}
4 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Verso IL;

.assembly extern mscorlib {}


.assembly HelloWorldIL {}
.namespace HelloWorldIL
{
.class Program
{
.method static public void Main() cil managed
{
.entrypoint
.maxstack 8
ldstr "Hello, World !"
call void [mscorlib] System.Console::WriteLine(string)
call valuetype [mscorlib]System.ConsoleKeyInfo
[mscorlib]System.Console::ReadKey()
ret
}
}
}
5 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

A imagem abaixo demonstra o fluxo ocorrido entre a compilao e a execuo de um aplicativo .net.

Voc pode acessar o cdigo em IL de um arquivo .net compilado atravs da ferramenta IL Disassembler que normalmente pode
ser encontrado na pasta do Visual Studio 2010 no menu iniciar-> Microsoft Windows SDK Tools IL Disassemble ou no caminho:
C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\ildasm.exe

Voc pode tambm escrever um aplicativo utilizando IL diretamente, mas infelizmente o Visual Studio 2010 no oferece suporte
a essa linguagem ento um editor de texto qualquer pode ser utilizado, para compilar utilize a ferramenta ILAsm que vem junto
com o SDK do .net framework e acessvel atravs do prompt do Visual Studio e pode ser encontrado normalmente na pasta do
menu iniciar do Visual Studio->Visual Studio Tools->Visual Studio Command Prompt. Apesar desta prtica no ser muito
6 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

comum nos ajuda a entender como funcionam as coisa por baixo do cap no .net framework e tambm pode ser utilizado para
criar programas em tempo de execuo(Reflection.Emitting).

Garbage Collection

O Garbage Collection um recurso do Common Language Runtime que faz o gerenciamento automtico da memria e oferece os
seguintes benefcios:

Permite que voc desenvolva sua aplicao sem a necessidade de liberar memria.
Aloca objetos no heap gerenciado de forma eficiente.
Identifica objetos que no esto mais sendo usados, apaga-os da memria e a mantm disponvel para futuras atribuies.
Objetos gerenciados automaticamente tm o espao para seus atributos previamente alocados, assim o construtor no
precisa inicializar cada um deles.
Fornece segurana de memria, certificando-se que um objeto no pode usar o contedo de outro objeto.

Em que situaes o Garbage Collection acionado:

O sistema tem memria fsica baixa.


A memria que usada por objetos alocados no heap gerenciado ultrapassa um limite aceitvel. Este limiar
continuamente ajustado conforme o processo executado.
O mtodo GC.Collect chamado. Em quase todos os casos, voc no precisa chamar esse mtodo, porque o coletor de
lixo executado de forma contnua. Este mtodo usado principalmente para situaes nicas e testes.

Nota: Heap Gerenciado o segmento de memria para armazenar e gerenciar os objetos.

GAC

GAC a abreviaes para Global Assembly Cache que consiste em um sistema robusto e unificado servio de
gerenciamento de DLLS compartilhadas, com ele aplicaes podem usar diferentes verses da mesma DLL instalada no disco.
7 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

LINKS
Viso conceitural do .net framework - http://msdn.microsoft.com/pt-br/library/zw4w595w.aspx

Pgina oficial do .net framework - http://msdn.microsoft.com/en-us/netframework/default.aspx

Verses e dependncias do .net framework - http://msdn.microsoft.com/pt-br/library/bb822049.aspx

Instalao do .net framework 4.0 runtime - http://www.microsoft.com/download/en/details.aspx?id=17718

Como o framework .net reconhece tantas linguagens - http://www.devmedia.com.br/post-14830-Como-o-framework--NET-


reconhece-varias-linguagens-de-programacao.html

.NET Framework Class library overview - http://msdn.microsoft.com/en-us/library/hfa3fa08.aspx

Common language runtime overview- http://msdn.microsoft.com/en-us/library/ddk909ch.aspx

Entrevistas de Anders Hejlsberg sobre o .net framework -


http://www.bitwisemag.com/copy/programming/milestones/pm_dotnet.html

Artigo Wikipdia j++ - http://en.wikipedia.org/wiki/Visual_J%2B%2B

Fundamentos garbage collection - http://msdn.microsoft.com/en-us/library/ee787088.aspx

Viso geral biblioteca .net - http://msdn.microsoft.com/en-us/library/hfa3fa08.aspx

Mapa das principais classes .net framework 4.0 - http://brad_abrams.members.winisp.net/Projects/PDC2008/PDC2008-


NETFX4.pdf

Mapa de classes comuns do .net framework 3.5 - http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=19341


8 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Captulo 2 Microsoft Visual Studio

O que ?

O Microsoft Visual Studio uma IDE(integrated development enviroment) , se trata uma plataforma multi linguagem concebida
pela Microsoft que apresenta facilidades significativas para o desenvolvimento de software englobando um srie de
funcionalidades que auxiliam nas rotinas de desenvolvimento, pode ser usada para desenvolver aplicaes console ou grficas
atravs das bibliotecas Windows Forms, web sites, aplicaes web e web services.

Algumas das suas principais funcionalidades so

Um editor de cdigo com esquema de cores que visa facilitar o entendimento.


Um sistema de auto completar para nome de funes, tipos de dados, namespaces e palavras reservadas
(Intelissense).
Um compilador/interpretador de cdigo.
Em verses mais avanadas at mesmo controle de verses.
Editor grfico para criao da interface de usurio.
Refatorao de cdigo.

Dentre as linguagens suportadas de forma nativa esto: C#,VB.net,F#,XML,HTML,JavaScript e CSS.

Apesar de ser um software proprietrio, existem as verses gratuitas chamadas de express que possuem menos recursos e so
voltadas para um linguagem especfica como Visual C# Express,Visual C++ dentro outras.

Histria

A primeira verso do Visual Studio foi o Visual Studio 97 que agregou grande parte das ferramentas necessrias para o
desenvolvimento de software pela primeira vez. O Visual Studio 97 teve duas verses, Visual Studio Professional e o Visual
Studio Enterprise. As linguagem suportadas eram Visual Basic 5.0 e Visual C++ 5.0 voltados ao desenvolvimento para Windows,
J++ 1.1 para programao para JVM, Visual Fox Pro 5.0 para programao de bancos de dados e tambm foi introduzido suporte
construo de sites de contedo dinmico atravs do Active Server Page(ASP), em 2002 foi lanado o primeiro Visual Studio
voltado a programao com .net. A verso atual da IDE o Microsoft Visual Studio 2010 e esta ser a que utilizaremos como
ferramenta padro de desenvolvimento em nosso curso, as principais alteraes ocorridas nessa verso foram a reorganizao da
interface para torna-la mais simples utilizando as novas tecnologias para desenvolvimento de interface criadas pela prpria
Microsoft (WPF). Incluso do DLR - Dynamic Language Runtime no pacote de instalao que d suporte aos tipos dinmico e
metaprogramao, Suporte ao .net framework 4.0 e Suporte ao desenvolvimento de aplicativos para o Windows phone 7.

Funcionalidades por verso do Microsoft Visual Studio 2010

Como Iniciar?

Agora faremos um rpido guia de como construir uma aplicao simples no VS2010. Para comear o desenvolvimento de um
aplicativo com Visual Studio relativamente simples basta abrir o programa ir at o menu superior na opo File->new->Project.
Uma janela como a da imagem abaixo aparecer:
9 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Do lado direto temos uma lista hierrquica com o ttulo Instaled templates o que seria modelos de projetos para cada tipo de
aplicativo, os templates sero detalhados posteriormente nesse captulo. No caso est selecionada a categoria Windows e dentro
dela h subtipos como Windows Forms Applications e Class Library Application. Na parte superior temos verso do .net que
ser utilizado no projeto no caso selecionado .net framework 4. Na parte inferior temos o nome que queremos dar ao nosso
projeto, e logo abaixo o caminho no computador que os projetos e os arquivos relacionados sero salvos e abaixo o nome da
soluo que funciona como uma agregadora de contedo para podermos organizar um sistema formado de vrios projetos ser
melhor explicada posteriormente nesse captulo.

Temos ainda duas caixas de seleo a primeira indica se gostaramos de criar um diretrio para organizar fisicamente os arquivos
da soluo e o segundo indica se gostaramos de j adicionar o projeto um controle de verso.

Feitas essas configuraes iniciais podemos dar ok e ser criado um projeto de acordo com o template escolhido e este
normalmente apresentado do lado direito na janela Solution Explorer. A partir de agora tomaremos como exemplo o template
Console Application que um dos mais simples para prosseguir esse guia rpido.
10 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

A imagem abaixo mostra o que veremos aps dar ok na janela anterior:

J ser aberto o arquivo com a classe principal do projeto e o mtodo de entrada basta editar a definio do mesmo
implementando as aes que desejar e depois clicar no boto parecido com um play na parte superior da tela ao lado da palavra
debug o seu aplicativo ser executado para que o comportamento do mesmo seja analisado. Vamos supor que
tudo correu bem, o prximo ser alterar o a caixa de seleo onde est escrita a palavra Debug para Release, feito isso basta clicar
com o boto direto sobre a soluo na janela Solution Explorer, ser aberto um menu contextual escolha a opo rebuild e isto
iniciar a montagem do seu aplicativo para um arquivo executvel. Agora basta ir at o diretrio da soluo, procurar a pasta do
projeto, ConsoleApplication1->bin->release, o arquivo executvel estar l dentro, clique duas vezes no mesmo e sua aplicao
ser iniciada.

Estrutura de um projeto e tipos de arquivos bsicos

O Visual Studio tem uma organizao hierrquica que consiste basicamente em Solues, Projetos, Configuraes, itens do
projeto e itens das solues.

-Solues

Funciona como uma forma de organizar os insumos necessrios para execuo e/ou construo de um
sistema, uma soluo pode ter diretrio, projetos e qualquer outro tipo de arquivo que seja importante para o sistema, como uma
imagem ou um documento de texto, cada projeto pode gerar um executvel ou uma dll e pode ter dependncias de outros projetos,
a soluo se encarrega de organizar a ordem de build para que todas dependncias de um projeto que estejam tambm estejam
na forma de projeto sejam compiladas antes do mesmo. A soluo s existe em tempo de desenvolvimento depois de compilado
no gera uma sada significativa e vai depender de como voc organizar os arquivos gerados para realizao com sucesso do
deploy, no computador as solues ficam armazenadas em arquivos com a extenso .sln e voc pode abri-la clicando duas vezes
no arquivo, porm para copiar com sucesso uma soluo o computador deve estar configurado para mostrar arquivos oculto, pois
existe um arquivo com o mesmo nome da soluo com a extenso .suo que precisa ser copiado junto para a pasta destino.

-Projetos

O Projeto a verso em tempo de desenvolvimento de uma aplicao, nele contm todos os arquivos de cdigos
no compilados os .cs no caso do c#, todas as configuraes por exemplo, as plataformas suportada(X86,X64) e todas as
referncias externas necessrias para o seu funcionamento, na compilao ele que de fato se transforma no produto final. No
computador o projeto em c# ficam armazenados em arquivos com a extenso .csproj e voc pode abri-lo no Visual Studio
11 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

clicando sobre esse arquivo, porm na verdade ele se trata de um arquivo XML em um padro estabelecido pelo VS, voc pode
acessar e editar diretamente esse arquivo XML clicando com o boto direito sobre o arquivo e seleciona abri com... notepad.

-Propriedades

Praticamente todos os templates de projetos criam um item chamado properties onde podem ser configurados os
principais aspectos do projeto, apesar de poder ser considerado como um item do projeto merece uma ateno especial, abaixo as
principais configuraes que podem ser feitas no properties de um projeto para Windows.

Plataforma(s) em que a aplicao funcionar depois de compilada.


Verso do framework utilizada no projeto.
Verso do arquivo compilado.
Temos um espao para colocarmos recursos que ficaro embarcados no arquivo compilado.

As propriedades no so salvas em um arquivo nico com uma extenso especfica, mas esto distribudas nos arquivos .csproj,
no arquivo AssembyInfo.cs e quando adicionados recursos no arquivo tambm nos arquivos .resx e no Resource.Design.cs,
como os aplicativos .net foram projetados para serem xcopy ou seja basta colocar todas dependncias em uma pasta sem precisar
de criar valores no registro, a maioria dos arquivo que gravam dados sobre aplicativos so xmls em um padro do Visual Studio e
tiveram sua extenso relacionadas com o mesmo.

-Itens do projeto

O projeto como a soluo pode ter praticamente quaisquer tipos de arquivos adicionados entre os seus itens, como
imagens e documentos de textos, mas o principal em aplicaes Windows podemos dizer que so os arquivos .cs que contm o
cdigo fonte de nossos programas, esses arquivos servem apenas para organizar o cdigo, que pode ser separado em arquivos da
forma que for mais conveniente, facilitando o controle de verso e melhorando a semntica.

Tabela de extenses bsica do Visual Studio(C#)

Extenso Do que se trata


*.sln Arquivo onde ficam armazenadas as informaes sobre as
solues do Visual Studio.
*.suo Arquivo oculto complementar da soluo precisa ser copiado
com a soluo para a pasta destino.
*.csproj Arquivo onde ficam armazenados os dados sobre os projetos
do Visual Studio.
*.cs Arquivo onde fica armazenado o cdigo no compilado do c#.
*.resx Arquivo onde ficam contidas informaes sobre os recursos de
um projeto.

TEMPLATES

Os templates so modelos pr-definidos para facilitar a incluso de um projeto, o template define quais as referncias necessrias
para um determinado tipo de projeto, por exemplo, a dll System.Windows.Forms do .net framework adicionada no template
Windows application mas no adicionada no template Console application, porm nada impede que essa dll seja adicionada
posteriormente, no template tambm esto definidos os item que sero adicionados ao projeto incialmente tomando novamente
como exemplo Windows Forms e o Console Applications no primeiro um formulrio j vem adicionado no projeto e no
segundo no. No Visual Studio 2010 os templates instalados vo depender das suas escolhas na hora da instalao, mas de
qualquer maneira voc ter uma vasta gama de templates a sua disposio, ainda h templates disponibilizado na internet por
terceiros como Applications for twitter e quando se tratar de algo muito especfico voc mesmo pode fazer os seus templates.

Intellissense

O Intellissense um recurso do Visual Studio 2010 que auxilia na construo do cdigo fonte ele tem o papel de sugerir o
complemento da palavras que estamos digitando e tambm auxiliar na resoluo de problemas, como identificar o namespace que
precisa ser importado. Ao comear escrever uma palavra aparece uma lista do que possivelmente voc pretende escrever, voc
12 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

pode navegar pela lista com as setas do teclado e encontrando a correspondncia que deseja basta dar tab para que a palavra seja
inserida no fonte.

Imagem da janela de auto complemento do intellissense

No caso de voc escrever um tipo no reconhecido aparecer um pequeno quadrado sobre ele, basta clicar com o mouse no
mesmo e selecionar a ao desejada, ao renomear algum objeto tambm aparecer o mesmo quadrado clicando nele tero as
opes para ajudar a refatorar o cdigo. Veja na imagem abaixo.

Aqui a sugesto foi apenas de adicionar o namespace que j est disponvel ao contexto atual.

Code Snippet

Os code snnipets alm de auto completar a palavra inserem o restante de cdigo que compe um comando, um exemplo o for
o auto completar ajudaria sugerindo for quando for digitado f, mas no incluiria uma espcie de esqueleto no editor com a
sintaxe bsica do comando. Toda vez que iniciar a digitao de um comando e houve uma espcie de um papel partido na frente
da sugesto de complemento conforme a imagem abaixo:

Basta apertar duas vezes o Tab que o complemento do comando ser includo, abaixo imagem com o cdigo gerado ao apertar
duas vezes o Tab.

Se voc continuar utilizar o Tab o cursor ser direcionado as partes variveis da funo que so as que esto com o fundo
amarelo na imagem acima.
13 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Ferramentas de anlise de cdigo

O Visual Studio tem algumas ferramentas que auxiliam a melhorar e manter a qualidade dos projetos uma especialmente
interessante.

-Code metrics analysis

Essa ferramenta fornece uma srie de ndices sobre a qualidade do cdigo, ajuda avaliar o trabalho feito e tambm interessante
para analisar se as mudanas feitas melhoraram ou pioram os aspectos avaliados. Ela muito simples de usar basta clicar com o
boto direito sobre a soluo ou sobre um projeto especfico e selecionar a opo Calculate Code Metrics, ser aberta uma
janela e um ndice geral atribudo para cada item, inclusive ele ajuda voc interpreta-los, possvel ir abrindo nveis at chegar
nas funes que esto piorando os indces.

Principais janelas do Visual Studio 2010

ToolBox

Concentra os itens que podemos utilizar dependendo do contexto, no desenvolvimento de aplicativos Windows estaro disponvel
na ToolBox os controles nativos para esse tipo aplicao como textbox,lable,combobox,datagrid e datetimepiker . Eventualmente
poder conter tambm controles definido pelo usurio. Pode ser acessada pelo menu:View->Toolbox ou pelo atalho Ctrl+W,X.

Solution Explorer

Essa janela apresenta uma lista hierrquica representando a soluo com todos seus itens. Pode ser acessada atravs do
menu:View->Solution Explorer ou pelo atalho Ctrl+W,S.

Server Explorer

Essa janela serve para gerenciar conexes com bancos de dados. Pode ser usada para localizar Windows Services ativos e servir
como DataSources. Pode ser acessada atravs do menu:View->Server Explorer ou pelo atalho Ctrl+W,L.

Properties

Essa janela apresenta as propriedade da maioria dos itens selecionveis no Visual Studio 2010 como controles e projetos. Pode ser
acessada clicando com o boto direito sobre o item deseja e selecionando a opo properties no menu contextual, pelo menu
principal: View->Propertie Window ou ainda pelo atalho Ctrl+W,P.

Document Outline

Essa janela apresenta uma lista hierrquica com todos os componentes contidos em um formulrio, uma tima opo para
navegar entre eles. Pode ser acessada pelo menu:View->Other Windows->Document Outline ou pelo atalho Ctrl+W,U.

Immediate

Essa s acessvel em tempo de depurao e serve para execuo de comandos, utilizando os objetos carregados no escopo em
que a aplicao foi pausada, interessante usa-la para avaliar os comportamentos individuais dos objetos. Pode ser acessada pelo
menu: Debug->Windows->Immediate ou pelo atalho Ctrl+D,I.

Debugando com Visual Studio

Para debugar o cdigo no Visual Studio, basta selecionar a opo Debug na caixa de seleo da barra de ferramentas padro e
clicar no boto Start Debugging se trata do boto do lado da caixa onde foi escolhida a opo Debug com um cone parecido com
um play ou ainda apertar o atalho F5. O programa ser executado no modo debbug. Pontos de parada podem ser adicionados ao
cdigo selecionando a linha em que deseja que ocorra a interrupo e apertando o atalho f9, uma bola vermelha ser adicionada do
lado esquerdo da linha e a mesma ter a cor do plano de fundo alterada para vermelho conforme imagem abaixo:
14 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Assim a execuo do programa ser interrompida quando chegar a este ponto uma seta amarela apontar para a linha indicando
que a execuo est parada naquele ponto conforme a imagem abaixo.

O desenvolvedor poder fazer basicamente 3 coisas a partir desse ponto, executar o prximo passo sem passar na definio do
mtodo(F10), executar o prximo passo passando por dentro da definio do mtodo(F11) ou voltar a execuo normal do
programa(F5). No Visual Studio voc pode voltar execuo do programa arrastando a seta amarela para a linha desejada.
Enquanto o programa estiver parado o desenvolvedor pode analisar os valores das variveis colocando o mouse sobre elas, em
quais condies a linha de execuo entrou ao ver por onde a seta amarela est se movendo e fazer simulaes com a Immediate
Window, dentre outras coisas ou seja analisar passo a passo o que est acontecendo com o sistema afim de solucionar problemas.
Para analisar valores de um objeto podemos utilizar a funo QuickWatch, para acessa-la s selecionar o objeto em questo e
clicar com o boto direto sobre, como na imagem abaixo:

Selecionar a opo QuickWatch, uma popup como a da imagem abaixo ser exibida mostrando as informaes do objeto:

Nela temos o nome do objeto, o valor e o tipo, no caso de objetos que tm propriedades poderamos navegar entre elas verificando
cada um de seus valores.

A execuo do programa pode ser Interrompida tambm pelo boto Break All presente na barra de ferramentas Debug, o
cone do boto tem o aspecto de um smbolo de Pause ou pelo atalho Ctrl+Alt+Break. Para encerrar o Debug e consequentemente
a execuo da aplicao basta fecha-la ou selecionar o boto Stop Debugging na barra de ferramentas Debug ou ainda acionar
o atalho Shift+F5.

IntelliTrace

Intellitrace uma nova tecnologia de rastreamento disponvel apenas para usurios do Visual Studio 2010 Ultimate.
Com o Intellitrace mensagens sobre os eventos ocorrido na aplicao so automaticamente emitidas pelo Visual
15 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Studio em segundo plano para um arquivo .iTrace, onde podem ser recuperadas e examinados para
fins de depurao. O Intellitrace altamente configurvel no que diz respeito ao tipo e quantidade
de informao que voc deseja gravar e com as configuraes padro tem muito pouco impacto sobre a performance da execuo
durante a depurao.

Habilitando o IntelliTrace

O IntelliTrace j vem habilitado por padro e os eventos do Intellitrace so registrados automaticamente. Esse evento representam
os eventos da aplicao e as gravaes dessas informaes causam um impacto to pequeno que se torna praticamente
imperceptvel na execuo do aplicativo. Voc pode tambm configurar o IntelliTrace para registrar as chamadas de funo,
informao sobre os parmetros passados e eventos disparados por componentes.

Porm registrando essas informao pode haver uma degradao da performance que por outro lado proporciona mais dados para
depurao.

Para habilitar o IntelliTrace:

1-Selecionar Tools->Options - Na lista da direita da popup que aparecer seleciona IntelliTrace e por fim marque a opo Enable
IntelliTrace.

2-Para habilitar o registro sobre chamada de funo e eventos selecione a opo IntelliTrace Events and Call Informations.

Selecionando o local para salvar os arquivos do IntelliTrace

Os arquivos do IntelliTrace podem ser salvos em disco para posterior analise. Para selecionar o local onde ficar esse arquivo
pode ser escolhido seguindo os seguintes passos:

1- Selecionar Tools->Options->Na lista da direita da popup que aparecer expanda a opo IntelliTrace.

2-Selecione Advanced.

3-Se a opo Store IntelliTrace recordings in this directory estiver desmarcada, marque-a.

4-Clique no boto Browse e selecione o caminho em seu computador.

Selecionando os eventos que o Intellitrace ir registrar.

Os tipo de eventos a serem registrados pelo IntelliTrace so altamente configurveis. Voc pode registrar todos os eventos
disponveis ou limitar o registro apenas aos tipos de eventos que lhe interessar seguindo estes passos:

1- Selecionar Tools->Options->Na lista da direita da popup que aparecer expanda a opo IntelliTrace.

2-Selecione a opo IntelliTrace Events.

3-Aparecer uma srie de tipos de eventos, basta marca-los e desmarca-los para incluir ou excluir dos tipos de eventos a serem
registrados pelo intellitrace.

Visualizando eventos do IntelliTrace durante a depurao.

Voc pode ver os eventos do IntelliTrace em tempo de depurao atravs da janela do IntelliTrace.

Os eventos s podero ser visualizados quando a aplicao estiver pausada.

Para o caminho para acessar a janela :

Debug->IntelliTrace->IntelliTrace events s disponvel durante a depurao.


16 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Gerando um release

Para gerar um release no Visual Studio 2010 basta mudar o valor da caixa de seleo Solutions Configurations na barra de
tarefas padro para release clicar com um boto direto sobre um projeto ou sobre a soluo no caso de querer compilar todos
os projetos que estiverem contidos na mesma e no menu contextual selecionar rebuild.

LINKS

Pgina oficial do Visual Studio 2010 - http://msdn.microsoft.com/en-us/vstudio/default

Histria Visual Studio - http://blogs.msdn.com/b/ricom/archive/2009/10/05/my-history-of-visual-studio-part-1.aspx

Artigo Wikipedia - http://en.wikipedia.org/wiki/Microsoft_Visual_Studio


17 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Captulo 3-Microsoft C#

O que ?

C # uma linguagem de programao multi-paradigma fortemente tipada, imperativa, declarativa, funcional, genrica, orientada
a objetos (class-based) e orientada a componentes. Ele foi desenvolvido pela Microsoft como parte da iniciativa
.net e posteriormente aprovada como padro pelo Ecma (ECMA-334) e ISO (ISO / IEC 23270). C # uma das linguagens de
programao projetadas para o Common Language Infrastructure.
C # destinado a ser uma linguagem orientada a objetos, simples, moderna e de propsito geral. A sua equipe de
desenvolvimento liderada por Anders Hejlsberg.

Histria

Durante o desenvolvimento do .net Framework as biblioteca de classes foram originalmente escrita utilizando um sistema
compilador de cdigo gerenciado chamado Simple Managed C(SMC). Em janeiro de 1999 Anders Hejlsberg formou um time para
construir uma nova linguagem por hora chamada de Cool um Acrnimo para Clique Object Oriented Language. A Microsoft
chegou a considerar deixar Cool como o nome final da linguagem, mas mudou de ideia por razes comerciais. O C# foi anunciado
oficialmente em julho de 2000 e neste momento a biblioteca de classes do ASP.net j havia sido reescrita em c#.

Viso Conceitual Classes


Iniciaremos com uma viso conceitual sobre classes, pois o C# totalmente orientado a objetos e tudo baseado em classes, o
conceito de classe basicamente a unio entre os dados e as funes em uma mesma unidade lgica. Diferente de linguagens
como o C++ voc no consegue escrever uma funo sem que a mesma esteja dentro de uma classe. As classes so utilizadas
para criar instancias, ou seja armazenar dados na memria sobre operaes e valores para que fiquem disponveis em tempo
execuo. Abaixo um exemplo de classe:

public. class MyClass


{
//No caso MyPropertie e MypropertieInt int seriam os dados da classe MyClass
private string MyPropertie;
private int MyPropertieInt;

//SetMyPropertie seria um mtodo que manipula os dados dados da prpria classe


public void SetMyPropertie(string MyPropertie) {
this.MyPropertie = MyPropertie;
}
}

A sintaxe bsica de uma classe em C#

public class [Nome da classe]{


//Variaveis
private string var1;
private string varN...;

//Contrutores
public [Nome da classe]();

//Funes
public void Method1();
public void MethodN...();
}
18 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Sintaxe para criao de Instancia em C#;

MyClass obj = new MyClass();

Posteriormente nesse captulo abordaremos as classes com mais profundidade.

Namespaces

Os Namespaces servem como uma forma de dividir os objetos em categorias, normalmente de acordo com sua natureza,
independente do projeto ou arquivo que esto.

Sintaxe bsica

namespace [NomeNameEspace]{
...//Objetos definidos no namespace
}
Namespaces podem conter outros namespace formando uma estrutura hierrquica, veja o exemplo abaixo:

namespace Animal
{
namespace Caninos
{
namespace Cachorro
{
public class Poodle
{

}
}
}
}
Isso permite ter o mesmo nome de classe em namespaces diferentes, pois o nome completo da classe consiste em cada um de seus
namespaces separados por um ponto com o nome da classe no final, tambm separado por um ponto. Sendo assim o nome
completo da classe Poodle seria Animal.Caninos.Cachorro.Poodle, esse nome no precisa ser escrito completo a toda hora
graas ao comando using que ser detalhado a seguir.

Using
Esse outro elemento bsico da sintaxe do C# ele serve para que todos os tipos definidos em um namespace fiquem disponveis
sem escrever o seu nome completo. Abaixo um exemplo:

Temos 3 classes Poodle,PastorAlemao e Canil, as duas primeiras esto no namespace Animais e a ltima est no namespace
Lugares, precisamos declarar um objeto Poodle e um PastorAlemo na classe Canil, abaixo o cdigo sem a utilizao de using:

namespace Lugares
{
public class Canil
{
Animais.Poodle Cachorro1;
Animais.PastorAlemao Cachorro2;

public Canil(Animais.Poodle Cachorro1,Animais.PastorAlemao Cachorro2) {


this.Cachorro1 = Cachorro1;
this.Cachorro2 = Cachorro2;
}

}
}

Agora com a utilizao do using:

using System;
using System.Collections.Generic;
using System.Linq;
19 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

using System.Text;
using Animais;
namespace Lugares
{
public class Canil
{
Poodle Cachorro1;
PastorAlemao Cachorro2;

public Canil(Poodle Cachorro1, PastorAlemao Cachorro2)


{
this.Cachorro1 = Cachorro1;
this.Cachorro2 = Cachorro2;
}

}
}

Observe os outros namespaces antes de Animais, so onde esto os tipos fundamentais do framework e por padro so
adicionados ao criar uma classe.

Tipos de dados bsicos

C# uma linguagem fortemente tipada. Cada varivel e constante tem um tipo explcito. Cada assinatura do mtodo Especifica
um tipo para cada parmetro de entrada e o valor de retorno. A.NET Framework class library define um conjunto de tipos
numricos internos, como tambm os tipos mais complexos que representam uma ampla variedade de construes lgicas, como,
por exemplo, sistema de arquivos, conexes de rede, colees e matrizes de objetos e as datas. Um programa C# tpico usa tipos
da biblioteca de classes bem como tipos definidos pelo usurio que modelam os conceitos que so especficos para o domnio do
problema do programa.

As informaes armazenadas em um tipo podem incluir o seguinte:

O espao de armazenamento que necessita de uma varivel do tipo.


Os valores mximo e mnimo que ele pode representar.
Os membros (mtodos, campos, eventos e assim por diante) que ele contm.
O tipo base que ela herda.
O local de memria onde as variveis sero alocadas em tempo de execuo.
Os tipos de operaes que so permitidos.

O compilador usa informaes do tipo para verificar se todas as operaes que so executadas em seu cdigo so seguras. Por
exemplo, se voc declarar uma varivel do tipo int, o compilador permite usar a varivel em operaes de soma e subtrao. Se
voc tentar executar essas mesmas operaes em uma varivel do tipo bool, o compilador gera um erro.

Abaixo exemplo de cdigo que geraria um erro no compilador

static void Main(string[] args)


{
int a = 5;
int b = a + 2; //OK

bool test = true;

// Error. Operator '+' cannot be applied to operands of type 'int'


and 'bool'.
int c = a + test;
}

O operador + no pode ser aplicado entre um int e um bool;


20 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Especificaes dos principais tipos em C#.

Tipos inteiros
Tipo Abrangncia Tamanho em bits
sbyte -128 to 127 8
byte 0 to 255 8
char U+0000 to U+ffff 16
short -32,768 to 32,767 16
ushort 0 to 65,535 16

int -2,147,483,648 to 2,147,483,647 32

uint 0 to 4,294,967,295 32

-9,223,372,036,854,775,808 to
long 64
9,223,372,036,854,775,807

ulong 0 to 18,446,744,073,709,551,615 64

Tipos de ponto flutuante e decimal


Tamanho
Abrangncia
Tipo Preciso em bits
float 1.5e45 to 3.4e38 7 dgitos 32
double 5.0e324 to 1.7e308 15-16dgitos 64
28 28 0 to 28
decimal (-7.9 x 10 to 7.9 x 10 ) / (10 ) 28-29 dgitos significantes 128

Outros tipos de dados importantes


Tipo Descrio
string Representa uma cadeia de caracteres
DateTime Representa um espao de tempo e contm uma srie de funes para lidar com datas

Tipos de valor e de referncia

Os tipos de valor so aqueles tipos que a varivel fica diretamente ligada ao valor atribudo a mesma, e quando passado como
parmetro para alguma funo na verdade copiado para o escopo da funo, o que faz que alteraes feitas nos valores dentro
dela no reflitam no valor original da varivel, a menos que ela seja atribuda novamente no escopo em que foi declarada. J com
tipo de referncia o que ocorre que a varivel esta relacionada a um ponteiro para o espao de memria onde o valor da mesma
est armazenado, ento quando ela passada como parmetro para uma funo a referncia passada e as alteraes de valores
so feitas diretamente no espao de memria que guarda o valor da varivel alterando assim o valor da mesma no escopo original,
porm isso s ocorre quando a palavra reservada ref colocada na assinatura da funo. Abaixo um exemplo para ficar mais
fcil entender o que isso representa.

class Program
{
static void Main(string[] args)
{
string a = "5";
21 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

string b = "2";

String a2="5";
String b2 = "2";

Console.WriteLine("TIPOS DE VALOR...\r\n\r\n");
Console.WriteLine(string.Format("Valores de a e b no escopo que foram definidos a:{0}
b:{1}\r\n",a,b));
Swap(ref a,ref b);
Console.WriteLine(string.Format("Valores de a e b no escopo que foram definidos
continuam os mesmos a:{0} b:{1}\r\n",a2,b2));

Console.WriteLine("TIPOS DE REFERNCIA...\r\n\r\n");
Console.WriteLine(string.Format("Valores de a e b no escopo que foram definidos a:{0}
b:{1}\r\n",a2,b2));
Swap(ref a2,ref b2);
Console.WriteLine(string.Format("Valores de a e b no escopo que foram definidos mudam
a:{0} b:{1}\r\n",a2,b2));
Console.ReadKey();
}
public static void Swap(ref String a,ref String b)
{
string c;
c = a;
a = b;
b = c;
Console.WriteLine(string.Format("Valores de a e b no escopo da funo a:{0}
b:{1}\r\n",a,b));
}

Escrevam esse cdigo em um projeto do tipo Console Application do Visual Studio e percebam que os valores de a e b foram
alterados dentro da funo, mas na classe main permaneceram os mesmos, j de a2 e b2 tiveram os seus valores alterados tambm
no escopo principal. Dos tipos apresentados nas tabelas acima apenas DateTime de referncia os demais so de valor, porm
todos os tipos citados tem um correspondente de referncia que fazem parte do .net Framework.

Variveis

Variveis so simplesmente locais de armazenamento de dados. Voc pode armazenar e recuperar os dados atravs de um nome
atribudo varivel. Quando criamos uma varivel precisamos dizer o tipo de dado a ser armazenado na mesma e atribuir-lhe um
nome, a sintaxe para isso em C# a seguinte:

[Tipos] [Nome Da Varivel];

Exemplo:

int Numero;
As variveis assim como as funes s podem ser definidas dentro de uma classe.

Operadores

Em C #, um operador um elemento do programa que aplicada a um ou mais operaes em uma expresso ou


declarao. Operadores que levam um operando, como o operador de incremento (+ +), so referidos como operadores
unrios. Operadores que usam dois operandos, como operadores aritmticos (+,-,*,/), so referidos como operadores binrios. O
operador condicional (?:), leva trs operandos e o nico operador ternrio em C #.

Um operando pode ser uma expresso vlida de qualquer tamanho, e pode ser composto por qualquer numero de outras
expresses. Em uma expresso que contenha mltiplos operadores, a ordem na qual os operadores sero aplicados determinada
pela ordem de precedncia do operador, associatividade e posicionamento de parnteses.
22 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Cada operador tem uma precedncia definida. Em uma expresso que contenham mltiplos operadores com ordem de precedncia
diferentes, a precedncia dos operadores determina a ordem que os operadores sero executados. Por exemplo, a expresso
seguinte atribui o valor 3 para n1.

n1 = 11 - 2 * 4;

A multiplicao executada primeiro, pois tem precedncia sobre a subtrao.

As tabelas a seguir separam os operadores em categorias baseadas no tipo de operaes que realizam. As
categorias esto listadas em ordem de precedncia.

Operaes primrias

Expresso Descrio
x.y Acesso de associado
f(x) Invocao de mtodos e delegates
a[x] Array and indexer access
x++ Ps-incremento
x-- Ps-decremento
new T(...) Criao de objetos e delegates
new T(...){...} Criao de objeto com inicializador.
new {...} Inicializador de objeto annimo.
new T[...] Criao de array
typeof(T) Obtm o Sytem.Type para T
checked(x) Executa a expresso em um contexto checado
unchecked(x) Executa a expresso em um contexto no checado
default (T) Obtm o valor default para T
delegate {} Funo annima(Mtodo annimo)

Operadores unrios

Expresso Descrio
+x Identidade
-x Negao
!x Negao lgica
~x Negao bit bit
++x Pr-Incremento
--x Pr-decremento
(T)x Converso explicita para o tipo T

Operadores multiplicativos

Expresso Descrio
* Multiplicao
/ Diviso
% Resto

Operadores Aditivos

Expresso Descrio
x+y Adio, concatenao de string, combinao de delegate.
x-y Subtrao remoo de delegate.

Operadores de troca
23 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Expresso Descrio
x << y Troca direita
x >> y Troca esquerda

Operadores relacionais e de tipo

Expresso Descrio
x<y Menor
x>y Maior
x <= y Menor ou igual
x >= y Maior ou igual
x is T Retorna se x do tipo T.
x as T Retorna x tipado como T ou nulo se no for possvel.

Operadores de igualdade

Expresso Descrio
x == y Igual
x != y Diferente

Operadores lgicos,condicionais e para tratamento de valores nulos

Categoria Expresso Descrio


Logical AND x&y AND bit bit inteiro, AND lgico booleano
Logical XOR x^y XOR bit bit inteiro, XOR lgico booleano
Logical OR x|y OR bit bit inteiro, OR lgico booleano
Conditional AND x && y Retorna verdadeiro para x e y verdadeiros.
Conditional OR x || y Verdadeiro se x ou y verdadeiros.
Null coalescing x ?? y Retorna y se x for nulo, caso contrrio x
Conditional x ?: y : z Retorna y para x verdadeiro, caso contrrio z

Operadores de atribuio e annimos

Expresso Descrio
= Atribuio
x op= y Compound assignment. Supports these operators: +=, -=, *=, /=, %=, &=, |=, !=, <<=, >>=
(T x) => y Funo annima (lambda expression.)

Alguns exemplos com operadores

//Operador de negacao(-) inverte o sinal do nmero


int Identidade = 1;
Console.WriteLine(-Identidade);
//Sada "-1"
Identidade = -1;
Console.WriteLine(-Identidade);
//Sada "1"
int Negacao = 1;

//Operador de pr-incremento(++)
int PreIncremento = 1;
PreIncremento = ++PreIncremento;
Console.WriteLine(PreIncremento);
24 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

//Sada "2"

//Operador ps-incremento
int PosIncremento = 1;
PosIncremento = PosIncremento++;
Console.WriteLine(PosIncremento);
//Sada "1", pois primeiro ele atribui o valor a varivel e depois incrementa o valor.

bool NegacaoLogica = true;


Console.WriteLine(!NegacaoLogica);
//Sada "false"
NegacaoLogica = false;
Console.WriteLine(!NegacaoLogica);
//Sada "true", pois negar uma negao a torna em uma afirmao.

//Algumas operaes aritmtica


int n1=4, n2 = 2;

Console.WriteLine(n1 + n2);
//Sada "6", 4+2

Console.WriteLine(n1 * n2);
//Sada "8", 4*2

Console.WriteLine(n1 / n2);
//Sada "2", 4/2

Console.WriteLine(n1 - n2);
//Sada "2", 4-2

Console.ReadKey();

Desvios condicionais

A instruo if usada para realizar desvios condicionais no C#. Com ele o fluxo de execuo pode ser alterado de acordo com o
retorno de expresses booleanas, a sintaxe do comando a seguinte:

if( [Expresso booleana]){

Trecho de cdigo...

Voc pode definir o segmento else para um if que serve como fluxo alternativo caso a condio testada seja falsa.

if( [Expresso booleana]){

Trecho de cdigo...

}else{

Trecho de cdigo...

Voc pode ainda testar vrias condies em uma mesma instruo if adicionando segmentos else if, a execuo
passar na primeira e somente na primeira condio verdadeira do if se houver.

if( [Expresso booleana]){

Trecho de cdigo...

}else if([Expresso booleana]){


25 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Trecho de cdigo...

Exemplos utilizando if:

bool Validado = true;


//Quando se tratar de um booleano no precisa fazer comparao porque ele mesmo j um
valor booleano
if (Validado)
{
Console.WriteLine("Ok!");
}

string strRetorno = "Sucesso";


//Outros tipos de dados precisam de uma expresso booleano escrita.
//Obs: O == um operador de comparao, que retorna true caso os valores sejam iguais
caso contrrio false
if (strRetorno == "Sucesso")
{
Console.WriteLine("Misso comprida");
}
else {
Console.WriteLine("Tente novamente");
}
//Aqui temos um if sem delimitadores "{}", essa sintaxe pode ser utilizada quando formos
executar apenas uma instruo.
//Obs: o != o inverso do == e retorna true para valores diferente caso contrrio
false.
if (strRetorno != "Sucesso")
Console.WriteLine("Tente novamente");
else
Console.WriteLine("Sucesso");

DateTime Dt = DateTime.Now;

if (Dt.Hour < 8)
Console.WriteLine("Est muito cedo....");
else if (Dt.Hour == 8)
Console.WriteLine("Em cima da hora....");
else
Console.WriteLine("Atrasado!");
Switch

O comando switch serve para definirmos aes a serem executadas dependendo do valor de uma varivel ou de uma expresso,
muito utilizado com enumeraes e quando temos um rol de valores conhecidos que a varivel ou a expresso pode assumir.

A sintaxe bsica para o switch a seguinte

switch([Nome da varivel]){

case [possvel valor 1]

[Aes a serem executadas];

break;//Termina a execuo da instruo switch

....

case[Possvel valor n]

[Aes a serem executadas];

break;//Termina a execuo da instruo switch


26 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

default://Opcional

[Ao padro para caso o valor no esteja definido em nenhum dos Cases];

break;

int caseSwitch = 1;
switch (caseSwitch)
{
case 1:
Console.WriteLine("Case 1");
break;
case 2:
Console.WriteLine("Case 2");
break;
default:
Console.WriteLine("Default case");
break;
}

int switchExpression = 3;
switch (switchExpression)
{
// Uma seo de instrues podem ser iniciadas por mais de um valor no caso 0 e 1
case 0:
case 1:
Console.WriteLine("Case 0 or 1");
// para cada case necessrio um break, um return ou um goto.
break;
case 2:
Console.WriteLine("Case 2");
break;
// O cdigo da linha abaixo causa um alerta na compilao, pois nunca ser
executada pelo fato de estar depois do break;
Console.WriteLine("Cdigo irrelevante");
// 7 - 4 abaixo o case est em funo de um expresso matemtica 7-4 ento quando
o valor da varivel for 3 essa condio ser satisfeita.
case 7 - 4:
Console.WriteLine("Case 3");
break;
// Se o valor da vriavel no estiver entre 0, 1, 2, or 3, o cdigo definido no
rtulo default ser executado.
default:
Console.WriteLine("Default case (Opcional)");
break;
}
Estruturas de repetio

Estruturas de repetio so instrues que de acordo com uma condio, executam uma sequncia de aes repetidas um
determinado nmero de vezes. Estruturas de repetio tambm so conhecidas como loops.

As principais instrues para execuo de Loop so: while,do,for e foreach, vamos analisar cada uma separadamente.

WHILE

Um loop while verifica uma condio e em seguida executa um bloco de cdigo enquanto a condio avaliada for verdadeira. A
sua sintaxe a seguinte:

while ([Expresso booleana]) {

[Conjunto de instrues]
27 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Ao terminar a execuo das instrues dentro do bloco definido para o while a expresso booleana verificada novamente e caso
seja verdadeira o conjunto de instrues executado novamente esse ciclo se repete at que o valor da expresso avaliada no
segmento while seja falsa. No while se na primeira verificao o valor avaliado for falso o bloco de cdigo no executado nem
uma vez.

Exemplo:

//Declarao de uma varivel


int i = 0;

//Segmento while, nesse caso verifica se o valor da vriavel i menor que 10.
//O bloco de cdigo ser executado enquanto essa expresso for verdadeira
while (i<10)
{
//Conjunto de instrues a serem executadas

//Escreve o valor de i no console


Console.WriteLine(1);

//Soma 1 ao valor de i a cada execuo do bloco de cdigo.


i++;
}
//Espera que uma tecla seja digitada para encerrar a execuo do programa.
Console.ReadKey();

DO

O loop do se comporta como o loop while, porm garantido que o bloco de cdigo seja executado ao menos uma vez, pois a
expresso booleana avaliada depois da execuo do bloco de cdigo.

A sintaxe a seguinte:

do{

[Conjunto de instrues]

}while([Expresso booleana]);

Exemplo:

//Declarao de uma varivel


int i = 0;

do
{
//Conjunto de instrues a serem executadas.
//A diferena que mesmo que neste ponto o valor de i seja maior que 10
//Esse bloco de cdigo ser executado ao menos 1 vez.

//Escreve o valor de i no console


Console.WriteLine(1);

//Soma 1 ao valor de i a cada execuo do bloco de cdigo.


i++;
}
while (i < 10);//Segmento while, nesse caso verifica se o valor da vriavel i menor
que 10.
//O bloco de cdigo ser executado enquanto essa expresso for verdadeira

//Espera que uma tecla seja digitada para encerrar a execuo do programa.
Console.ReadKey();
28 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

FOR

O Loop for tambm executa um bloco de cdigo em funo de uma expresso booleana, com a diferena de possuir em sua
sintaxe a possibilidade de incluir um inicializador e um modificador para uma varivel que existir somente em seu escopo. Essa
instruo largamente utilizada para varrer listas, pois sua sintaxe garante uma semntica melhor em relao ao while quando
necessrio ter um contador das iteraes ocorridas no loop.

Sintaxe:

for([Inicializador de varivel];[Expresso booleana];[Modificador da varivel]){

[Conjunto de instrues]

Exemplos:

//Declarando um array de inteiros, e j inicializando com valores.


int[] valores = new int[]{1,2,3,4,5,6,7,8,9,10};

/*No segmento for esta sendo feita inicializao de uma vriavel i que ser incrementada
com mais 1
a cada iterao ocorrida, enquanto o valor da vriavel seja menor que o tamanho da
colao de inteiros obtida atravs da propriedade length do valor.
importante lembrar que o ultimo ndice da lista sempre o tamanho da mesma menos 1,
pois a primeira posio 0 e no 1.*/
for (int i = 0; i < valores.Length; i++)
{
//Escreve o valor que est na posio "i" da lista a cada iterao sendo que o "i"
vai sendo incrementado a cada iterao.
//Todos os valores da lista sero escritos na tela em ordem crescente.
Console.WriteLine(valores[i]);
}

Console.WriteLine("Ordem decrescente");
/*Podemos tambm escreve-los de forma decrescente.
Fazendo algumas alteraes no nosso segmento for.
- Iniciando a vriavel i com a ultima posio do array em vez da primeira "0", a
melhor formam de fazer isso
atribuindo o valor da propriedade length -1 ao seu valor.
- Invertendo o sinal da expresso booleana de < para >= e substituindo a propriedade
length pela constante 0.
- Por fim substituindo o operador unrio de incremento(++) para o de decremento(--).
*/

for (int i = valores.Length-1; i >=0; i--)


{
//Escreve o valor que est na posio "i" da lista a cada iterao sendo que o "i"
vai sendo decrementado a cada iterao.
//Todos os valores da lista sero escritos na tela em ordem decrescente.
Console.WriteLine(valores[i]);
}

//Espera que uma tecla seja digitada para encerrar a execuo do programa.
Console.ReadKey();

FOREACH

Este um tipo de loop especfico da linguagem C# que veio como uma forma de varrer colees mais eficientemente. Com
foreach no necessrio verificar se o nmero de iteraes menor que o nmero de item em uma coleo e nem acessar o item
da coleo atravs do ndice em funo da varivel do for, pois no foreach ocorre uma iterao para cada item da lista e uma
29 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

varivel assume o valor deste item, qualquer objeto que herde da interface IEnumerable pode ser utilizado como fonte de dados
em um foreach. Listas sero exploradas com mais profundidade neste captulo.

foreach ([Declarao da varivel] in [Coleo a ser varrida]){

[Conjunto de instrues]

Exemplo:

//Declarando um array de inteiros, e j inicializando com valores.


int[] valores = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

/*Agora faremos a mesma coisa que nos dois exemplos utilizando for, ou seja mostraremos
os valores do array
* em ordem crescente e decrescente s que utilizando o foreach.*/

/*No segmento foreach temos a declarao de uma vriavel que assumira o valor de um item
da lista de cada vez
* Reparem que o tipo da vriavel devem representar o tipo que a lista rene no caso
int. Depois a palavra reservada in
* que deve ser sucedida pela lista a ser varrida.
*/
foreach (int item in valores)
{
Console.WriteLine(item);
}

/*Agora em ordem decrescente


Basta utilizar o mtodo reverse disponvel para qualquer tipo de array, que a ordem dos
valores na lista ser invertida completamente.
Como os valores esto organizados em forma crescente nesse exemplo, ao inverter sero
apresentados de forma decrescente.
*/
foreach (int item in valores.Reverse())
{
Console.WriteLine(item);
}

//Espera que uma tecla seja digitada para encerrar a execuo do programa.
Console.ReadKey();

BREAK

O comando break pode ser utilizado dentro do bloco de cdigo de qualquer Loop apresentado anteriormente e causa uma
interrupo imediata das iteraes. Pode ser utilizado para quando estamos procurando a primeira ocorrncia de um valor
especfico, abaixo um exemplo.

//Declarando um array de inteiros, e j inicializando com valores.


int[] valores = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

foreach (int item in valores)


{
if (item == 3)
{
Console.WriteLine(item);
//Ao encontrar a primeira ocorrncia do valor 3 o mesmo ser escrito na tela e a
execuo do Loop ser interrompida.
break;
30 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

}
}

Tratamento de erro

O C# implementa uma funcionalidade do framework para tratamento de erros, que consiste na possibilidade de executar uma ao
que trata um exceo gerada pelo programa, de modo que no ocorra uma interrupo na execuo, esse tratamento feito atravs
da instruo try, cuja sintaxe bsica a seguinte:

try{

[Conjunto de instrues que podem lanar uma exceo]

}catch([Tipo de exceo] [Nome da varivel](Opcional declarao da varivel)){

[Conjunto de instruo que gerencia a exceo ocorrida]

Exemplo:

int[] vals=new int[]{0,1,2,3,4,5,6,7,8,9};

try
{
/*Nesse caso ocorrer um erro, pois iniciei o contador do for em 1 o que vai causar
uma tentativa de acesso uma posio que no existe na lista a posio 10 e
apesar da lista
ter 10 valores os ndices vo de 0 a 9, isso provocar o lanamento de uma
exceo no sistema.

*/
for (int i = 1; i < vals.Length+1; i++)
{
Console.WriteLine(vals[i]);
}
}
//O Bloco catch escrever a mensagem de erro retornada no console e evitar que a
execuo do programa seja interrompida.
catch (Exception ex) {
Console.WriteLine(ex.Message);
}
Console.ReadKey();

Arrays e Lists

Muitas vezes no desenvolvimento de aplicaes necessitamos de agrupar determinados tipos de dados em colees, para efeitos de
comparao, ordenao, dentre outros. Em C# possvel fazer esse agrupamento de duas formas.

Atravs de Arrays e Lists, a diferena fundamental entre ambo que o Array precisa ter o seu tamanho definido na sua
inicializao, j as Lists podem crescer indefinidamente. As Lists tambm oferecem mais recursos para tratamento das colees
como consequncia consumem mais processamento. As List foram implementadas sobre o conceito de tipos genricos que sero
detalhados posteriormente nesse captulo, por hora vamos analisar a sintaxe, a utilizao em um contexto e a interoperabilidade
entre ambos.

Arrays

Um Array pode ser composto por vrias dimenses, porm o mais comum o unidimensional cuja sintaxe a seguinte:

[tipo de dado][] [Nome da varivel];


31 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Exemplo Array de inteiros:

int[] Inteiros;

Ou seja basta adicionar um par de colchetes ao lado do tipo da varivel e este passa a representar uma lista unidimensional
daquele mesmo tipo.

Para declarao de um Array multidimensional basta colocar uma vrgula separando as dimenses, por exemplo, a declarao de
um array bidimensional de inteiros ficaria assim:

int[,] MatrizInteiros;

O acesso aos itens dos vetores se d atravs de ndices, sendo cada ndice a posio de uma unidade na matriz, a coleo de
ndices comea em 0 e termina no tamanho do vetor -1, o ndice do ltimo elemento de um vetor de tamanho n igual a n-1.

Existem algumas maneiras de se inicializar um vetor abaixo exemplos comentados.

// Declarao e inicializao de um Array unidimensional de 5 posies.


int[] array1 = new int[5];

// Declarao e inicializao de um Array unidimensional de 5 posies,


// mas nesse caso o nmero de posies definido pelo nmero de valores definido entre as
chaves na sintaxe de inicializao.
int[] array2 = new int[] { 1, 3, 5, 7, 9 };

// Sintaxe alternativa
int[] array3 = { 1, 2, 3, 4, 5, 6 };

// Declarao e inicializao de um Array bidimensional, sem atribuio de valores.


int[,] multiDimensionalArray1 = new int[2, 3];

// Declarao e inicializao de um Array bidimensional, com atribuio de valores.


int[,] multiDimensionalArray2 = { { 1, 2, 3 }, { 4, 5, 6 } };

Para acessar o elemento de valor 3 do array array2 a sintaxe seria a seguinte:

int Elemento = array2[1];

Para atribuir um novo valor a esta mesma posio a sintaxe seria a seguinte:
int Elemento=20;
array2[1]=Elemento;

Para acessar o elemento de valor 5 do array multidimensional multiDimensionalArray2 a sintaxe seria a seguinte:
int elemento= multiDimensionalArray2[1,1];

Para atribuir um novo valor a esta mesma posio a sintaxe seria a seguinte:
int Elemento=20;
array2[1,1]=Elemento;

Lists

Os Lists so listas genricas unidimensionais que assumem um determinado tipo. No precisam ter seu tamanho especificado na
inicializao. A List prov algumas funcionalidades a mais que o Array como o mtodo Find, que serve para encontrar
ocorrncias de um determinado valor na lista. Para utilizao do List o namespace System.Collections.Generic do assembly
mscorlib.dll deve estar acessvel.

A sintaxe bsica a seguinte:

List<[Tipo de dado]> [Nome da varivel];

Exemplo List de inteiros:


32 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

List<int> lst = new List<int>();

A incluso de um elemento na lista pode ser feito atravs do mtodo Add. Cuja sintaxe a seguinte:

int Elemento=10;
lst.Add(Elemento);

A sintaxe de acesso e atribuio de elementos idntica de Arrays unidimensionais.

Interoperabilidade
Uma lista pode ser transformada em um Array atravs do mtodo ToArray(), exemplo abaixo:
int[] Myarray;
List<int> MyList = new List<int>();
Myarray = MyList.ToArray();

Um Array pode ser transformado em List atravs do mtodo ToList(),exemplo abaixo:


List<int> MyList;
int[] Myarray=new int[10];

MyList = Myarray.ToList();

Todos os itens de um Array podem ser inserido em uma lista atravs do mtodo AddRange([Fonte de dados enumervel]) da
classe List, Exemplo abaixo:
List<int> MyList=new List<int>();
int[] Myarray=new int[10];

MyList.AddRange(Myarray);

Tabela com os principais mtodos comuns Arrays e Lists.

Nome do mtodo Descrio


Reverse() Inverte a ordem dos elementos na lista.
First() Retorna o primeiro elemento da lista.
OrderBy(Predicate) Ordena os valores da lista de acordo com o valor passado com
parmetro.
Max() Retorna o elemento de valor mximo pela ordem de
precedncia.
Min() Retorna o elemento de valor mnimo pela ordem de
precedncia.

Windows Forms

Windows Forms um conjunto de bibliotecas que fornecem funcionalidades para desenvolvimento de aplicaes desktop que
utilizem interaes atravs de janelas no padro Windows. As principais funcionalidades esto na biblioteca
System.WindowsForms.dll. Nesse tpico iremos abordar os principais componentes do Windows forms.

Eventos

A orientao a eventos um dos paradigmas da linguagem C#, isso quer dizer que os componentes executam as suas aes atravs
de eventos. Por exemplo, um componente do tipo boto tem o evento Click, esse evento ser relacionado com um ou mais
mtodos e quando o mesmo ocorrer as instrues contidas nesses mtodos sero executadas.
33 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Guia rpido hello World em Windows forms

Vamos fazer passo a passo a criao de um aplicativo Windows forms simples. O famoso Hello World.

Abra o Microsoft Visual Studio 2010.

V at o menu:File->New->Project.

A janela abaixo aparecer:

Escolha a categoria Windows e dentro dela escolha Windows Forms Application.

Seleciona o nome do projeto na caixa de texto rotulada Name.

Clique em Ok.

O form principal do projeto aparecer.

Abra a toolbox e arraste um controle do tipo Button para o form.

Clique no controle que acabou de adicionar com o boto direito e escolha a opo Properties.

Na janela que aparecer selecione o item text e mude o valor de button1 para Saudar, conforme imagem abaixo:

Agora clique na imagem de um raio no topo da janela properties.


34 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Uma lista dos eventos existente para o boto ser exibida, d um duplo clique no evento Click.

Voc ser redirecionado ao arquivo de cdigo onde j ter um mtodo criado e relacionado ao evento Click, coloque o trecho de
cdigo a seguir entre as chaves do mtodo.

//Aqui temos uma chamado ao mtodo show da classe MessageBox , este mtodo exibe uma caixa de dialogo com o texto passado
como parmetro ele.

MessageBox.Show("Hello World");

Agora basta apertar F5 para rodar o aplicativo.

Clique no boto do formulrio para visualizar a caixa de dialogo.

Principais componentes

Form

O form o elemento fundamental das aplicaes Windows forms e pode hospedar uma srie de outros controles.

O form pode receber as interaes do usurio atravs do mouse ou atravs do teclado, e tambm apresentar dados atravs dos
controles hospedados. Aplicaes mais complexas podem necessitar de uma srie de forms para cumprir seu objetivo. Sempre que
voc criar um projeto do tipo Windows forms um form com o nome form1.cs adicionado, voc pode mudar o nome clicando
sobre ele e apertando a tecla F2, se tudo correr bem todas as referncias para o mesmo tambm sero alteradas. Voc pode
adicionar outros forms ao seu projeto clicando sobre ele com o boto direito, escolhendo a opo new->item no menu contextual.
A janela abaixo aparecer:
35 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Selecione o item Windows Form, mude o nome na caixa de texto abaixo da lista conforme desejado. E clique no boto Add.
36 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

O formulrio pode ser customizado atravs de suas propriedades para altera-las acesse a janela properties, abaixo uma tabela
com as mais importantes e suas respectivas descries:

Propriedade Descrio
(Name) O nome do objeto form.
Backcolor Cor de fundo do formulrio.
BackgroundImage Indica uma imagem para o plano de fundo do formulrio.
Determina como a imagem defina na propriedade BackGroundImage ser apresentada.
BackgroundImage1Layout
ControlBox Determina quando o form tem um ControBox.
Cursor Aparncia do cursor do mouse quando estiver sobre o form.
Enabled Determina se o form est habilitado, se estiver falso todos os controle hospedados tambm ficaro
desabilitados
Font Atribui a font padro para textos do form.

ForeColor Determina uma cor de primeiro plano padro, ser utilizada para todos controle caso no seja
atribuda separadamente.

FormBorderStyle Indica a aparncia e o comportamento das bordas do form.

HelpButton Indica quando o Form tem um boto de ajuda.


Icon Indica o cone a ser apresentado no topo do form.
Location Determina o posicionamento do form na tela quando a propriedade StarPosition est com o valor
Manual.

MaximizeBox Indica se o form tem a opo de maximizar.


MaximumSize Determina o tamanho mximo que o form pode assumir.

MinimizeBox Indica se o form tem a opo de minimizar.


MinimumSize Determina o tamanho mnimo que o form pode assumir.

Opacity Representa o nvel de transparncia do formulrio, quando maior mais transparente.

Size Atribui e recupera o tamanho inicial do form


StartPosition Posio do Form na sua primeira apario.

Text Determina o texto que aparece no topo do forn.


TopMost Determina se o formulrio aparece na frente de todas as outras aplicaes.

Visible Determina se o formulrio esta visvel.


Windowstate Determina o estado inicial do formulrio: Maximizado, Minimizado, etc.

Alterando o formulrio inicial de um projeto

Esse o primeiro form aberto ao executarmos um projeto, para alterar qual ser esse formulrio necessrio abrir o arquivo
program.cs e mudar a instncia de form passada para o mtodo Run([Instncia form]) da classe application . Se o form criado
junto com o projeto no tiver sido renomeado estar assim:
37 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Application.Run(new Form1());

Caso contrrio no lugar de Form1 estar o nome atual do Form que foi criado junto com o projeto. Altere para o nome do
formulrio que deseja que seja inicializado.

Prtica;

Crie 2 formulrios.

Os requisitos do primeiro so:

1. O ttulo deve ser formulrio 1.


2. O formulrio deve abrir maximizado.
3. O formulrio no pode ser minimizado.
4. O formulrio deve ser parcialmente transparente.
5. O formulrio deve aparecer acima de todas as outras telas abertas.
6. O formulrio deve abrir junto canto superior direito da tela.

Os requisitos do segundo so:

1. O ttulo deve ser formulrio 2


2. O formulrio deve abrir no centro da tela.
3. A cor de fundo do formulrio deve ser vermelha.
4. O Formulrio deve apesentar um cone ao lado do texto.
5. O formulrio no pode ser redimensionado.
6. O Formulrio no pode ser minimizado.

Controles containers

Os controles do tipo contineres foram concebidos para reunir uma srie de outros controles. Com eles possvel criar subdivises
lgicas e fsicas no form que agrupam outros controles. Por exemplo, voc pode colocar uma srie de opes correlatas dentro de
um groupbox onde somente uma pode ser escolhida. Quando um controle do tipo container hospeda outros controles, algumas
propriedades do mesmo podem impactar em todos os seus filhos, por exemplo, se a propriedade Enable for atribuda como false
todos os controles dentro do continer tambm ficaro desabilitados, assim como se a propriedade Visible for falsa, todos os itens
tambm ficaro invisveis.

Para adicionar controles a um container basta arrasta-los da ToolBox para o mesmo.

Existem propriedades de layout dos itens que tem relao com seu container. Por exemplo, a propriedade Anchor presente em
todos os controles Windows Forms. Essa propriedade determina quais distncias entre as extremidades do controle item e seu
container sero mantidas quando o container for redimensionado. Observe as imagens abaixo para que esse conceito fique mais
claro.

Temos um boto dentro de um groupbox na imagem abaixo.


38 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Quando a propriedade Anchor est atribuda da seguinte maneira:

O boto manter o seu posicionamento em relao ao seu canto superior direto. Ento vamos observar o que acontece quando
redimensionamos o groupbox:

O boto mantm a mesma distncia entre o seu canto superior esquerdo e o canto superior esquerdo do container. Agora vamos
mudar a propriedade Anchor do boto conforma imagem abaixo:

Ao redimensionarmos o grupo ser mantida a distncia entre o canto inferior direito do boto e o canto inferior direito do
container. Observe na imagem abaixo:

Execute esses mesmos passos no seu Visual Studio 2010 para ver tudo acontecendo, lembrando que o posicionamento do boto
no foi alterado manualmente em nenhum momento.

A propriedade Dock tambm est fortemente relacionada com o container pai do controle. Atravs dela voc pode manter um
controle fixado em uma das extremidades do container ou ainda preenchendo todo o espao do mesmo.

Exemplo:

Abaixo temos um label fixado no topo do container.


39 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Sendo assim o mesmo acompanhar qualquer redimensionamento ocorrido no container para que continue preenchendo toda sua
parte superior, observe na imagem abaixo:

Temos os seguintes containers disponveis em Windows forms:

GroupBox
Panel
FlowLayoutPanel
TableLayoutPanel
TabControl
SplitContainer

Vamos analisar cada um separadamente:

GroupBox

O GroupBox um controle container que aparece no form com um ttulo e rodeado por uma linha. Ele no prove barras de
rolagens diferindo do controle Panel. O uso mais comum do GroupBox para hospedar RadioButons que representam opes
exclusivas. Por exemplo, um GroupBox com ttulo Sexo, hospedando dois rdio buttons com os rtulos Masculino e
Feminino.

Tabela com as principais propriedades do GruopBox:

Propriedade Descrio
Text Representa o ttulo do GroupBox

Panel

O Panel cria uma subseo do form e pode hospedar outros controles. O mesmo pode ser visualmente indistinguvel do resto do
form, embora possa ser configurado para apresentar bordas ao seu redor. O Panel d suporte a barras de rolagem e estando a
propriedade AutoScroll com o valor true as mesmas apareceram de acordo com a necessidade.
40 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Tabela com as principais propriedades do controle Panel.

Propriedade Descrio
AutoScroll Indica se barras de rolagem apareceram automaticamente caso
algum controle contido no Panel estiver ultrapassando seus
limites.
BorderStyle Define se o Panel ser circundado por bordas e qual ser o
estilo das mesmas.

FlowLayoutPanel

O FlowLayoutPanel uma especificao do controle Panel e assim como ele serve para criao de uma subseo no formulrio,
porm a principal diferena entre eles que o FlowLayoutPanel reposiciona e redimensiona automaticamente os controles
adicionados em seus itens durante o design e a execuo, dessa forma ajusta-os em um fluxo continuo. Para que as barras de
rolagem apaream automaticamente a propriedade AutorScroll tambm deve ter o valor true. Por padro a direo do fluxo do
FlowLayoutPanel da direita para a esquerda e do topo para a base, mas isso pode ser alterado atravs da propriedade
FlowDirection. Uma nova linha criada sempre que o limite horizontal atingido isso se a propriedade WrapContent estiver
com o valor verdadeiro, porm voc pode fazer as quebras de linha manualmente setando esta mesma propriedade para falso e
utilizando o mtodo SetFlowBreak que recebe como parmetro o controle filho em que a quebra de linha acontece por exemplo:

flowLayoutPanel1.SetFlowBreak(btn, true);
Sendo flowLayoutPanel1 o nome do nosso FlowLayoutPanel e btn o nome de um boto hospedado por ele.

Tabela dos mtodos e propriedades principais do FlowLayoutPanel:

Propriedade Descrio
AutoScroll Indica se barras de rolagem apareceram automaticamente caso
algum controle contido no Panel estiver ultrapassando seus
limites.
BorderStyle Define se o Panel ser circundado por bordas e qual ser o
estilo das mesmas.
FlowDirection Define a ordem do fluxo dos componentes dentro do Panel
WrapContents Indica se as quebras de linha acontecem automaticamente
quando os componentes ultrapassam as extremidades do Panel
SetFlowBrake Mtodo, Seta manualmente em qual componente acontece a
quebra de linha.
GetFlowBrake Mtodo, Retorna se o componente tem uma quebra de linha
atribuda a ele.

TableLayoutPanel

Como o FlowLayoutPanel o TableLayoutPanel uma especializao da classe Panel . O TableLayoutPanel essencialmente uma
tabela que prov clulas que hospedam controles individualmente. Como os outros Panels possui suporte a barras de rolagem
automaticamente quando a propriedade AutoScroll est com valor verdadeiro. Durante o Design basta voc arrastar os controles
para as clulas para inclui-los na tabela. Somente um controle permitido por clula, porm para designs mais complexo voc
pode colocar um container na mesma e dentro do dele incluir outros elementos.

Voc pode editar as linhas e as colunas da tabela atravs das propriedades Rows e Columns respectivamente.

A tabela abaixo demonstra as principais propriedades de um TableLayoutPanel

Propriedade Descrio
AutoScroll Indica se barras de rolagem apareceram automaticamente caso
algum controle contido no Panel estiver ultrapassando seus
limites.
CellBordeStyle Define se as clulas sero circundadas por bordas e qual ser o
estilo das mesmas.
Column Count Define a quantidade colunas na tabela
Columns Apresenta uma coleo editvel das colunas da tabela, onde
41 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

podemos configurar o tamanho das mesmas em valor absoluto


e percentagem por exemplo.
ColumnStyles Representa uma coleo de estilos das colunas da tabela.
Disponvel somente em Runtime.
GrowStyle Determina como acontece o crescimento da tabela medida
que novos controles so adicionados, os possveis valores so:
AddColumns,
AddRows, or FixedSize
RowCount Define a quantidade de linhas da tabela
Rows Apresenta uma coleo editvel das linhas da tabela, onde
podemos configurar o tamanho das mesmas em valor absoluto
e percentagem por exemplo.
RowStyles Representa uma coleo de estilos das linhas da tabela.
Disponvel somente em Runtime.

TabControl

O TabControl permite que voc agrupe controles em abas, o TabControl funciona com um container de tabPages, sendo que cada
uma dela pode ter seus prprio controle filhos. O usurio navega entre as pginas clicando nas abas rotuladas do TabControl. A
propriedade mais importante do TabControl a TabPages. Cada TabPages tem sua prpria gama de propriedades voc pode
acessa-las assim como em qualquer outro controle selecionando-as e acessando a janela properties. Para gerenciar as TabPages de
um TabControl basta acessar a propriedade TabPages que o gerenciador abaixo ser aberto:

Nele voc pode adicionar ou remover TabPages assim como ordena-los e alterar suas propriedades sendo que as principais delas
so Text que representa o ttulo da aba, AutoScroll que funciona da mesma forma que nos Panels e BorderStyle que indica se ter
uma borda circundando e qual o estilo da mesma.
42 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Tabela com as principais propriedade de um TabControl.

Propriedade Descrio
Appereance Propriedade do TabControl; Determina o estilo visual do
TabControl.
Alignment Determina se as abas aparecero em cima, em baixo, direito
ou esquerda do TabControl.
Multline Propriedade do TabControl; Indica se mais uma linha de abas
pode existir na TabControl.
TabPages Propriedade do TabControl; Coleo das TabPages, voc pode
edita-las nessa propriedade.
AutoScroll Propriedade da TablePage; Indica quando as barras de rolagem
aparecem automaticamente de acordo com a necessidade.
BorderStyle Propriedade da TablePage; Determina se a aba ser circundada
por borda e qual ser o estilo da mesma.
Text Propriedade da TablePage; Representa o ttulo da aba.

SplitContainer

O SplitContainer cria uma subseo do form onde h dois Panel separados por um divisor que pode ser movido em tempo de
execuo pelo usurio. Quando o tamanho de um Panel diminui o outro aumenta para preencher o espao. O uso mais comum
desse componente na criao de Windows forms divididos. O SplitContainer expes as propriedade do Panel1 e Panel2,
individualmente ambos so iguais um Panel normal, porm o SplitContainer tem suas propriedades especficas. A orientao de
um SplitContainer pode ser horizontal e vertical para alterar isso utilize a propriedade orientation.

Abaixo uma tabela com as principais propriedades do SplitContainer

Propriedade Descrio
BorderStyle Determina se o SplitterContainer ser circundada por borda e
se sim, qual ser o estilo da mesma.
Fixed Panel Essa propriedade indica qual Panel do SplitContainer ser
fixado no tamanho essa propriedade assume os valores Panel1,
Panel2 e none.
IsSplitterFixed Determina se a posio do divisor poder ser reajustada pelo
usurio em tempo de execuo.
Orientation Determina se o divisor se movimentar horizontalmente ou
verticalmente.
Panel1 Expes as propriedades do primeiro Painel do SplitContainer
Panel2Collapsed Retorna se o segundo painel do SplitContainer est recolhido.
Panel2MinSize Determina o tamanho mnimo que o segundo painel do
SplitContainer pode assumir.
SplitterDistance Representa a distancia do divisor em relao extremidade
esquerda ou da extremidade superior dependendo da orientao
SplitterWidth Representa a largura do divisor.

Viso geral dos controles em Windows Forms

Controles so componentes que combinam interface grfica com funcionalidade pr-estabelecidas. So unidade de cdigo
concebidas para atender uma grande gama de tarefas particulares. Por Exemplo, o controle TextBox tem por objetivo exibir texto
e receber entrada de dados na forma texto do usurio, ele prov propriedades, mtodos e eventos que facilitam essa tarefa. Todos
os controles tem a classe base Control como ancestral comum a qual compartilha uma sria de propriedade em relao a
tamanho, localizao e outros aspectos gerais dos controles.

A tabela abaixo demonstra as principais propriedades da classe Control, s quais so comuns a todos os controles Windows
Forms.

Propriedade Descrio
Anchor Determina como o controle fica amarrado ao container que foi adicionado.
BackColor Determina a cor de fundo do controle.
43 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

BackgroundImage Determina uma imagem para servir com plano de fundo do controle.
Indica quando o controle executa mtodos de validaes, esses mtodos servem para verificar
CausesValidation se a entrada de dados do usurio est de acordo com as regras de negcio.
ContainsFocus Indica quando o foco esta no prprio controle ou um em dos seus filhos.
Controls Retorna uma coleo dos controles filhos.
Cursor Determina o aspecto do cursor quando o mouse passar sobre o controle.
Determina se o controle est fixado em uma das extremidades do container pai ou preenchendo
Dock o mesmo.
Enabled Determina se o controle est habilitado e funcional.
Font Determina a fonte que ser utilizada para escrever eventuais textos do controle.
ForeColor Determina a cor do primeiro plano do controle, borda, textos entre outros.
HasChildren Determina se o controle possui controles filhos.
Height Representa a altura do controle em pixels.
Location Representa a localizao do controle em relao ao container.
MaximumSize Representa o tamanho mximo que o controle pode assumir.
MinimumSize Representa o tamanho mnimo que o controle pode assumir.
Atribui um nome ao controle para ser acessvel via cdigo, s pode ser atribuda durante o
Name design.
Parent Retorna o form pai ou o container que o controle est contido.
Region Atribui ou retorna a regio Windows associada com o controle.
Size Representa o tamanho do controle em pixel.
Representa a ordem de precedncia do controle quando a tecla Tab for utilizada para navegar
TabIndex controle a controle.
Tag Serve para o programador associar algum dado ao controle para auxilia-lo na programao.
Atribui ou retorna o texto associado com o controle, o texto pode ou no aparecer na
Text representao visual do controle depende de como o mesmo foi definido.
Atribui ou retorna a visibilidade do controle quando estiver como false o controle s aparece
Visible durante o design estando invisvel na execuo.
Width Atribui ou retorna a largura do controle em pixels.

Button

Um dos controles mais comuns o Button, o controle essencial que prov interao de comando entre o usurio e a interface
grfica. O boto pode exibir um texto curto a fim de identifica-lo e responder a clicks efetuados pelo usurio. O boto assume um
visual diferenciado quando clicado e fornece um manipulador de evento para que o desenvolvedor escreva o cdigo desejado. O
controle Button expe uma srie de propriedade que permite que voc customize a aparncia e o comportamento do mesmo. A
tabela abaixo demonstra as principais Propriedades de um boto.

Propriedade Descrio
AutoEllipsis Habilita a manipulao automtica textos que excedam a largura do boto.
DialogResult Atribui um DialogResult ao boto, exemplo: DialogResult.Ok, DialogResult.Cancel.
FlatAppearance Determina como o boto parecer quando a propriedade FlatStyle estiver com valor verdadeiro
Quando o valor est verdadeiro o padro deixa de acompanhar a aparncia padro do Windows
FlatStyle e passa a respeitar o que desenvolvedor define no FlatAppearance
Text Atribui o texto que aparece no boto.
TextAlign Determina como o texto apresentado no boto.

Interceptando um clique: Para escrever o cdigo que ser executado quando o clique do boto ocorrer voc pode clicar duas vezes
sobre o boto durante o design e o cdigo da janela abrir com um mtodo cujo nome formado por:

[nome do boto]_Click

Basta escrever a implementao do mtodo entre as chaves que delimitam seu escopo.
44 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Outra maneira de fazer a mesma coisa acessar a lista de eventos na aba properties, clicando no cone de um pequeno raio e
dando um duplo clique sobre o evento click, especificado na lista de eventos que aparecer conforme imagem abaixo.

Exemplo

1. Crie um novo projeto Windows Forms, arraste um controle Button da ToolBox para o formulrio padro.
2. Altere o valor da propriedade Name para btnMudaCor.
3. Altere o valor da propriedade Text para Mudar cor de fundo.
4. Abra a lista de eventos do boto e d um duplo click no evento Click.
5. Dentro do mtodo criado no segmento de cdigo com o nome btnMudaCor_Click coloque o cdigo abaixo.
//A classe random serve para gerao de nmero aleatrio,
//nesse caso utilizaremos para criar uma cor passando a quantidade de
vermelho,azul e vermelho que a compes aleatriamente
Random rn =new Random();

//A palavra this se refere a prpria classe onde o mtodo esta definido como no
caso form.
//Estamos mudando a cor de fundo do mesmo.
//A classe Color so abstraes de cores no .net framework, podem criar um cor
pelo mtodo RGB conforme abaixo.
//O mtodo Next da classe Random gera o nmero aleatrio pegamos o resto da
diviso deste nmero por 255.
//Pois assim nunca ultrapassar o valor mximo que o parmetro aceita.
this.BackColor = Color.FromArgb(rn.Next() % 255, rn.Next() % 255, rn.Next() %
255);
6. Aperte F5 para roda a aplicao.

TextBox

TextBox o principal controle utilizado para recebimento de entrada de dados do usurio na forma textual . Ele fornece a
possibilidade de receber e exibir texto para usurio. Voc pode criar caixas de texto que mostram texto em mltiplas linhas, voc
pode tambm criar caixas de texto que aceitam a entrada de senhas e omitem o contedo apresentando apenas um caractere
escolhido pelo desenvolvedor, por exemplo, um *. As principais propriedades do mesmo esto expostas na tabela abaixo:
45 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Propriedade Descrio
Hospeda uma coleo de strings utilizadas para Auto Complemento quando
AutoCompleteMode estiver com valor diferente de none e o
AutoCompleteCustomSource AutoCompleteSource estiver com valor custom.
AutoCompleteMode Atribui a forma do auto completar, os possveis valores so: Normal,Upper e Lower
Determina a fonte de dados utilizada para realizar o auto complemento, pode ser uma
srie de fontes de dados preestabelecidas pelo sistema ou uma customizada definida
AutoCompleteSource pelo desenvolvedor.
Determina a forma como os caracteres ficaro na caixa de texto, os valores so:Upper-
Todos em maisculo, Lower-Todos em minsculo e Normal-Permanece como o
CharacterCasing usurio digitar.
Representa uma coleo de strings que refletem o valor da caixa de texto separado em
Lines linhas, s significante quando a propriedade MuliLine estiver com valor verdadeiro.
MaxLength Determina o nmero mximo de caracteres que o TextBox pode aceitar.
MultiLine Determina se a caixa de texto aceita o caractere de quebra de linha.
Quando um caractere definido nesse campo, todo caractere digitado pelo usurio
substitudo pelo mesmo na apresentao, porm via cdigo o valor da propriedade
PasswordChar Text traz a string real digitada. Amplamente utilizado para senhas.
Determina quando uma caixa de texto no pode ter seu texto editado servindo apenas
para apresentao, o foco ainda passa no campo e o usurio pode copiar o texto
ReadOnly atravs da seleo do mesmo.
Indica se barras de rolagem aparecero na caixa de texto caso mltiplas linhas forem
ScrollBars aceitas.
Text Uma string representando o texto contido na caixa de texto.
Determina se o texto atual deve ser substitudo pelo caractere de senha padro do
UseSystemPasswordChar sistema na exibio.
Indica quando as palavras so automaticamente direcionadas para outra linha quando
ultrapassam a largura do textbox e a propriedade multiline estiver com o valor
WordWrap verdadeiro.

Exemplo

1. Crie um novo projeto Windows Forms, arraste um controle TextBox da ToolBox para o formulrio padro.
2. Altere a propriedade Name do TextBox para txtMensagem.
3. Arraste um controle Button da ToolBox para o formulrio padro.
4. Altere a propriedade Name do Button para btnExibir e a propriedade Text para Exibir.
5. Crie uma varivel do tipo string no formulrio chamada Mensagem e inicialize-a. Cdigo abaixo:
string Mensagem= string.empty;
6. Agora volte para o editor visual do form e selecione o TextBox, v at a janela de propriedade e acesse a lista de eventos,
d um duplo clique no evento TextChanged.
7. No mtodo criado no cdigo do form com o nome txtMensagem_TextChanged escreva o cdigo abaixo:
Mensagem = txtMensagem.Text;
8. Agora acesse a lista de eventos do boto e d um duplo clique do evento Click, no mtodo criado no cdigo do form
coloque o cdigo abaixo:
MessageBox.Show(Mensagem);

9. Rode o programa, altere o texto do TextBox e veja que o texto da caixa de dialogo aberta ao clicar do boto estar
sempre igual ao da caixa de texto.

Label

O label o principal controle utilizado para apresentao de textos no editveis na tela, largamente utilizado para identificar
outros componentes. As suas principais propriedades so a Text que representa o texto que ser apresentado por ele e TextAlign
que representa como o texto ser apresentado.
46 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

CheckBox

O CheckBox um controle muito familiar aos usurios. Ele permite que o usurio marque uma caixa combinada com um texto,
que indica concordncia ou rejeio da opo apresentada. Os CheckBoxes diferem dos RadioButtons uma vez que no trabalham
de forma exclusiva ou seja a escolha de uma opo no rejeita as demais.

Principais propriedades de um CheckBox

Propriedade Descrio
Determina se o CheckBox ser
automaticamente marcado
quando o usurio clicar no texto
AutoCheck que o identifica.
Determina se o CheckBox est
Checked marcado
Determina o estado da marcao
do CheckBox,
Indeterminate,Checked ou
CheckState UnChecked
Representa o texto que identifica
Text o CheckBox para o usurio
Determina se o CheckBox aceita
ThreeState dois ou trs estado de marcao.

Exemplo

1)Crie um novo projeto Windows Forms, arraste da ToolBox um Label para o formulrio padro.

2)Altere a propriedade Name para lblIngredientes e a propriedade Text para Ingredientes.

3)Arraste 4 CheckBoxes para o formulrio e altere as propriedades dos mesmos conforme a tabela abaixo:

Propriedade Name Propriedade Text


Primeiro chkCarneSeca Carne seca
Segundo chkCatupiry Catupiry
Terceiro chkBacon Bacon
Quarto chkPalmito Palmito

4)Arraste um boto para o formulrio coloque o valor da propriedade name para btnMostraEscolha e a Text para Mostrar
Escolha.

5)Acerte o layout para ficar parecido com o da imagem abaixo.


47 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

6)Crie uma varivel na classe do tipo List<string> chamada ingredientes e inicialize-a sintaxe abaixo.

List<string> Ingredientes;

7)Agora v at a lista de eventos de cada um dos CheckBoxes e d um duplo clique no evento CheckedChanged.

8)Agora implemente a definio de cada um dos mtodos criados de acordo com a tabela abaixo;

Mtodo Definio
chkCarneSeca_CheckedChanged if (chkCarneSeca.Checked) {

if(!Ingredientes.Contains(chkCarneSeca.Text))
{

Ingredientes.Add(chkCarneSeca.Text);
}
}
else {

Ingredientes.Remove(chkCarneSeca.Text);
}

chkBacon_CheckedChanged if (chkBacon.Checked)
{
if
(!Ingredientes.Contains(chkBacon.Text))
{

Ingredientes.Add(chkBacon.Text);
}
}
else
{

Ingredientes.Remove(chkBacon.Text);
}

chkCatupiry_CheckedChanged if (chkCatupiry.Checked)
{
if
(!Ingredientes.Contains(chkCatupiry.Text))
{

Ingredientes.Add(chkCatupiry.Text);
}
}
else
{

Ingredientes.Remove(chkCatupiry.Text);
}

chkPalmito_CheckedChanged if (chkPalmito.Checked)
{
if
(!Ingredientes.Contains(chkPalmito.Text))
{

Ingredientes.Add(chkPalmito.Text);
}
}
else
{

Ingredientes.Remove(chkPalmito.Text);
}
48 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

9) Agora acesse a lista de eventos do btnMostraEscolha, e d um duplo clique sobre o evento Click, coloque o cdigo abaixo em
sua definio.

MessageBox.Show("Ingredientes:\r\n"+ string.Join("\r\n", Ingredientes.ToArray()));

10)Aperte F5 para rodar a aplicao.

Radio Button

O RadioButton utilizado para representar uma opo exclusiva para o usurio. Abaixo um exemplo simples com um GroupBox
com o ttulo sexo e o usurio pode escolher entre masculino e feminino mas nunca ambos.

Propriedade Descrio
Indica se o Radio button esta
Checked marcado.
Representa o texto que identifica
Text a opo par ao usurio.

Exemplo

1)Utilize o mesmo formulrio do exemplo anterior.

2)Arraste um GroupBox para o formulrio e mude a propriedade Name para grpBorda e a propriedade Text para borda.

3)Arraste 2 RadioButtons para dentro do GroupBox. Altere as propriedades de ambos conforme a tabela abaixo.

Propriedade Name Propriedade Text Propriedade Checked


Primeiro rdbCheddar Cheddar true
Segundo rdbMussarela Mussarela false

4)Deixe o design parecido com o da imagem abaixo.

1) Acesse a lista de eventos dos RadioButton e d um duplo clique no evento CheckChanged.


2) Crie uma varivel do tipo string chama borda e inicialize-a, sintaxe abaixo.

string borda = "Cheddar";


3) Escreva a definio dos mtodos criados de acordo com a tabela abaixo.
Mtodo Definio
rdbCheddar_CheckedChanged if (rdbCheddar.Checked)
borda = rdbCheddar.Text;

rdbMussarela_CheckedChanged if (rdbMussarela.Checked)
borda = rdbMussarela.Text;
49 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

9)Altere a definio do mtodo btnMostrarIngredientes_Click colocando o cdigo abaixo.


MessageBox.Show("Ingredientes:\r\n"+ string.Join("\r\n", Ingredientes.ToArray())+"\r\n
Borda:\r\n"+borda);

10)Aperte F5 para rodar a aplicao.

Masked TextBox

O MaskedTextBox um TextBox modificado que permite a definio de um padro para aceitar ou rejeitar uma entrada de dados
do usurio. A propriedade Mask fornece a possibilidade de especificar os caracteres opcionais e obrigatrios, especificar tambm
quais caracteres so letras ou nmeros e aplicar uma formatao para exibio de string. A tabela abaixo mostra as principais
propriedades do MaskedTextBox:

Propriedade Descrio
AllowPromptAsInput Determina se o caractere utilizado como prompt aceito como entrada de dados
Determina se somente caracteres da tabela AscII sero aceitos como entrada de
AsciiOnly dados
Determina se um sinal sonoro ser emitido quando o usurio digitar um caractere
BeepOnError invlido para a posio da mscara.
Determina quais os caracteres sero movido para o ClipBoard quando o texto for
CutCopyMaskFormat recortado ou copiado.
Determina se os caracteres prompt sero omitidos quando o foco sair do
HidePromptOnLeave MaskedTextBox
InsertKeyMode Atribui ou retorna a forma de insero.
Mask Determina a mscara de entrada de dados.
PromptChar Determina o caractere para prompt, ou seja, posies editveis da mscara.
Determina se a entrada de dados ser interrompida ao primeiro caractere invlido
RejectInputOnFirstFailure digitado pelo usurio.
Determina se a entrada de dados ser interrompida quando o usurio digitar um
ResetOnPrompt caractere utilizado com prompt.
Determina se a entrada de dados ser interrompida quando o usurio digita um
ResetOnSpace espao.
Determina como a propriedade Text ser retorna, somente com os caracteres literais,
incluindo os caracteres de formatao, ou includo os caracteres de formatao e os
TextMaskFormat caracteres prompt.

A Propriedade Mask

A propriedade mais importante de um MaskedTextBox a propriedade Mask, a qual habilita a definio de uma string que
representa o formato requerido para entrada de dados do usurios. Abaixo os caracteres chaves que podem ser utilizados para
criao de uma mscara e seus significados nesse contexto.

Elemento da mscara Descrio


Representa um dgito obrigatrio
0 de 0-9
Representa um dgito opcional de
9 0-9
Representa um dgito opcional de
0-9 ou um espao.+ e tambm
# so aceitos.
Representa uma letra obrigatria,
maiscula (A-Z) ou minscula
L (a-z)
50 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Representa uma letra opcional,


maiscula (A-Z) ou minscula
? (a-z).
Representa um caractere
obrigatrio de qualquer natureza
se o Ascii only estiver com valor
& verdadeiro funcionar como o L.
Representa um caractere opcional
de qualquer natureza se o Ascii
only estiver com valor verdadeiro
C funcionar como o &.
Representa um caractere alfa
numrico opcional, Se a
propriedade Ascii estiver com
valor verdadeiro s aceitar
A, a valores entre a-z e A-Z.
Separador decimal, esse caractere
ser substitudo de acordo com a
. culture definida para o campo.
Separador de milhar, ser
substitudo pelo separador de
milhar definido no culture para
, o MaskedTextBox.
Separador de tempo, ser
substitudo pelo separador de
tempo do culture definido para
: o MaskedTextBox.
Separador de data, ser
substitudo pelo separador de
data do culture definido para o
/ MaskedTextBox.
Smbolo de moeda, ser
substitudo pelo smbolo de
moeda do culture definido para
$ o MaskedTextBox.
Shift down, transforma os
caracteres da esquerda em
< minsculo.
Shift up, transforma os caracteres
> da direita em maisculo.
Desabilita Shift Down ou Shift
| Up anteriores.
Transforma em caractere que
esto nessa lista em parte literal
\ da string.
Aparecem como eles mesmos no
texto, mas no podem ser
Todos outros caracteres movidos ou apagados.

Exemplo

1)Crie um novo projeto Windows Forms, arraste um controle MaskedTextBox da ToolBox para o formulrio padro.

2)Altere a propriedade Name do MaskedTextBox para txtMensagem.

3)Arraste um controle Button da ToolBox para o formulrio padro.

4)Altere a propriedade Name do Button para btnExibir e a propriedade Text para Exibir.

5)Altere a propriedade Mask do MaskedTextBox para 999.999.999-9.

6)Crie uma varivel do tipo string no formulrio chamada Mensagem e inicialize-a. Cdigo abaixo:
51 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

string Mensagem= string.empty;


7)Agora volte para o editor visual do form e selecione o MaskedTextBox, v at a janela de propriedade e acesse a lista de
eventos, d um duplo clique no evento TextChanged.
8)No mtodo criado no cdigo do form com o nome txtMensagem_TextChanged escreva o cdigo abaixo:
Mensagem = txtMensagem.Text;
9)Agora acesse a lista de eventos do boto e d um duplo clique do evento Click, no mtodo criado no cdigo do form coloque
o cdigo abaixo:

MessageBox.Show(Mensagem);

10)Rode o programa, altere a propriedade TextMaskFormat do MaskedTextBox para cada um dos valores possveis e veja o que
acontece quando o dialogo com a mensagem exibida, faa a mesma coisa para a CutCopyMaskFormat e copie cole em um editor
de texto o contedo do MaskedTextBox, veja as diferenas.

Trabalhando com arquivo texto

Com o .net Framework j temos disponvel implementaes para realizar as operaes mais comuns com arquivos, essas
implementaes esto no namespace System.IO.O namespace System.IO contm tipos que permitem leitura e escrita em arquivos
e streams de dados e tipo que fornecem as funcionalidades bsica de suporte a diretrios e arquivos.

Tabela com as classes que vamos utilizar nesse tpico e uma descrio sobre suas funcionalidades.

Classe Descrio
File Fornece mtodos estticos para criao, cpia, deleo,
movimentao e abertura de arquivos.

FileStream Fornece um fluxo sobre o arquivo, suportando operaes


sncronas e assncronas de leitura e escrita.

StreamWriter um escritor de texto para streams em um enconding em


particular.
StreamReader um leitor de texto para streams em um enconding em
particular.

Criar um arquivo

Para criar um arquivo podemos utilizar o mtodo esttico Create da classe File que recebe como parmetro uma string indicando o
caminho onde o arquivo ser criado. Sintaxe:

File.Create("C:\\MyText.txt");
Ateno se um arquivo com mesmo nome j existir no mesmo local o mesmo ser sobrescrito por um arquivo em branco.

Escrever em um arquivo

Para escrever em um arquivo texto precisamos de uma instancia da classe FileStream a maneira mais fcil de se fazer isso
passando o caminho do arquivo como parmetro e tambm o FileMode OpenOrCreate que cria o arquivo se no existir e abre ele
no modo adio se existir ou seja no apaga os dados e acrescenta o que escrevermos.

FileStream fs = new FileStream("C:\\MyText.txt", FileMode.OpenOrCreate);

Feito isso podemos usar a classe StreamWritter que facilita na hora de escrever no arquivo, uma instncia tambm precisa ser
criada, como parmetro passamos a instncia da classe FileStream que criamos acima com o nome fs fica assim o cdigo:
StreamWriter St=new StreamWriter(fs);
Agora podemos usar os mtodos Write e WriteLine passando o texto que ser escrito, a diferena entre os dois que o segundo j
adiciona uma quebra de linha ao acabar de escrever o texto passado como parmetro veremos um exemplo utilizando cada um dos
mtodos.
52 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

St.WriteLine("Qualquer texto pode ser escrito aqui.");


St.WriteLine("Qualquer texto pode ser escrito aqui.");
/*
No arquivo ficaria assim
*
* Qualquer texto pode ser escrito aqui.
* Qualquer texto pode ser escrito aqui.
*
*/

St.Write("Qualquer texto pode ser escrito aqui.");


St.Write("Qualquer texto pode ser escrito aqui.");

/*
No arquivo ficaria assim
*
* Qualquer texto pode ser escrito aqui. Qualquer texto pode ser escrito aqui.
*
*/

Ao acabar de realizar as operaes feche o StreamWritter e o FileStream para liberar o arquivo.


St.Close();
fs.Close();

Ler de um arquivo

A primeira parte continua igual criar uma instncia do FileStream no mode OpenOrCreate.

FileStream fs = new FileStream("C:\\MyText.txt", FileMode.OpenOrCreate);


S que agora instanciaremos uma classe de leitura a StreamReader.

StreamReader sr = new StreamReader(fs);


E usaremos os mtodos Read e ReadLine;

/*
No mtodo Read necessrio passar como parmetro um array de char que ser populado
com os caracteres lido
* os outros 2 parmetros so posio inicial da leitura em ndice e a quantidade de
caracteres a serem lidos.
*/
char[] buffer=new char[20];
sr.Read(buffer, 0, 20);

/*
O ReadLine l uma linha de cada vez e retorna os caracteres,
* em uma string, mas antes necessrio verificar se a string no chegou ao fim.
*/
string str;
if(!sr.EndOfStream)
str = sr.ReadLine();

Feche o StreamReader e o FileStream para liberar o arquivo.


sr.Close();
fs.Close();

Apagar um arquivo

Para apagar o arquivo usamos o mtodo esttico Delete da classe File.

File.Delete("C\\MyText.txt");
53 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Prtica salvando em arquivo texto

Crie uma tela de cadastro de clientes com os campos: cdigo, nome e documento.

O usurio pode salvar os dados digitados clicando em salvar.

Quando ele digitar um cdigo j existente tem que recuperar os dados do cliente.

Modificadores de acesso.

Os modificadores de acessos so palavras reservadas utilizadas para definir a acessibilidade de um membro. Existem quatro deles:

public
protected
internal
private

public Acesso irrestrito, qualquer elemento da aplicao pode acessar o recurso.

protected - Disponvel para quem define e seus herdeiros.

internal Disponvel para todos os membros definidos no mesmo namespace.

private Disponvel somente ao prprio objeto que define.

Os modificadores de visibilidade podem acompanhar: Classes, Mtodos, Atributos, Propriedades, Interface, Enums e construtores.
Ateno, quando nenhum modificador definido considerado o mais restritivo, ou seja, private.

Classes
Uma classe uma unidade lgica que rene as propriedades, ou seja, as caractersticas sobre ela mesma e as suas aes
representadas pelos mtodos que sero abordados com maior profundidade nesse captulo. Uma classe descreve os servios
providos por seus objetos e quais informaes eles podem armazenar. Em C# todas as aes so baseadas em classes de maneira
que no podemos definir um mtodo fora do escopo de uma classe. Uma declarao de classe ou estrutura como um desenho
que usado para criar instncias ou objetos em tempo de execuo. Se voc definir uma classe ou estrutura chamada Pessoa,
Pessoa o nome do tipo. Se voc declara e inicializa uma varivel p tipo Pessoa, p considerado um objeto ou instncia de
Pessoa. Uma classe pode ter basicamente construtores, propriedade e mtodos, cada um desses itens ser abordado separadamente
sem seguida.

A sintaxe bsica para criao de uma classe em c# a seguinte.

[Modificador de visibilidade] class [Nome da classe]{


//Definio da classe
}
Tudo que est entre as duas chaves que delimitam o escopo da classe fazem parte da mesma.

Propriedades e variveis
Propriedades e variveis da classe so dados armazenados pela classe e a diferena entre ambas que as variveis normalmente
so utilizadas para processamentos internos da classe enquanto as propriedades so utilizadas para expor suas caractersticas
outros objetos, em C# entendido como propriedade dados que faam uso de getters e setters para que outros objetos acessem
suas informaes, uma varivel com modificador pblico no considerada uma propriedade, pois os outros objetos tem acesso
direta a mesma e isso no desejvel. J com getter e setter por mais que aparentemente o acesso direto o valor passa por um
tratamento antes
.
A sintaxe bsica de uma propriedade :

[Modificador de visibilidade] [Tipo] [Nome da propriedade]{


//Ao menos um dos modificadores abaixo necessrio, mas no obrigatrio ter ambos ao mesmo tempo.

//O get significa que outros objetos podero visualizar o valor da propriedade
get;

//O set significa que outros objetos podero atribuir o valor da propriedade
54 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

set;

}
Exemplo de propriedade
public string Nome
{
get;
set;
}

Exemplos
class Pessoa {

//Varivel privada somente a prpria classe tem acesso a ela.


int Idade;

//Propriedade com get e set, outros objetos podem atribuir e visualizar seu valor.
public string Nome
{
get;
set;
}

string _Nome;
/*O valor recebido em uma varivel pode ser tratado assim como o valor retornado expandido
os modificadores get e set.
Normalmente quando precisamos fazer algum tipo de tratamento criamos uma varivel
privada e encapsulamos em uma propriedade
* quando o valor atribudo ou solicitado fazemos as modificaes necessrias antes e
dentro da classe utilizamos a varivel privada.
*/
public string NomeTratado {
get {
return _nome.ToUpper();
}
set {
//O value assume o valor atribudo a vriavel, e tambm o tipo da mesma
_nome = value.ToLower();
}
}

private string _nomeReadOnly;


private string _nomeWriteOnly;
//Outros exemplos
//Quando definidos somente um operador de acesso precisamos definir o corpo do mesmo.
public string NomeReadOnly
{
get {
return _nomeReadOnly;
}
}

public string NomeWriteOnly


{
set {
_nomeWriteOnly = value;
}
}
}

Construtores
Construtor uma espcie de mtodos especial que no precisa ser invocados explicitamente, pois isso ocorre quando realizamos a
criao de um objeto do tipo da classe, eles devem ter o mesmo nome da classe, no possuir um tipo de retorno definido, uma
mesma classe pode ter vrios construtores, com tanto que cada um receba parmetros diferentes, os construtores so amplamente
utilizados para inicializao das propriedades e variveis da classe. A sintaxe bsica de um construtor :
55 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

[Modificador de visibilidade] [nome da classe]([parmetros(opcional)]{


//Definio do construtor.
}

Exemplo:
class Pessoa {
string _nome;
string _cpf;

public string Nome {


get {
return _nome;
}
set {
_nome = value;
}
}

public string Cpf


{
get
{
return _cpf;
}
set
{
_cpf = value;
}
}
/*
Esse primeiro construtor no recebe nenhum parmetro e s inicializa as variveis
com um valor vazio.
*/
public Pessoa() {
_nome = string.Empty;
_cpf = string.Empty;
}
/*
Esse segundo construtor inicia a vriavel Nome com o valor passado como parmetro.
Um construtor pode chamar outro, aqui est chamando o construtor default, que
inicializa as variveis com valor vazio antes de atribuir valor ao nome, a parte onde
est escrito ":this()" que indica que o construtor default deve ser chamado.
*/
public Pessoa(string Nome):this() {
this._nome = Nome;
}

/*
Esse terceiro construtor inicia a vriavel Cpf e repassa a tarefa de iniciar a vriavel
nome
* ao construtor que j sabe como fazer isso, dessa forma evitamos duplicar um cdigo que
faz a mesma coisa.
* Nesse caso o que acontece, o terceiro construtor chama o segundo que chama o primeiro,
ento primeiro as variveis
* so atribudas para valor vazio, depois a vriavel nome atribuda e por ltimo a
vriavel _cpf atribuda.
*/
public Pessoa(string Nome, string Cpf):this(Nome) {
this._cpf = Cpf;
}
}
class Program
{
static void Main(string[] args)
{
//Declarao de uma vriavel pessoa.
56 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Pessoa pess;

//Criao do objeto atravs do construtor default


//O que define o construtor que ser chamado os parmetros passado na hora da criao.
//Como no passei nenhum ser chamado o construtor default.
pess = new Pessoa();
MostraNomeCpf(pess.Nome, pess.Cpf);
//Sada = Nome:Vazio;CPF:Vazio

//Como passei uma string o segundo construtor ser chamado.


pess = new Pessoa("Joaquin");
MostraNomeCpf(pess.Nome, pess.Cpf);
//Sada = Nome:Joaquin;CPF:Vazio

//Como passei 2 strings o terceiro construtor ser chamado.


pess = new Pessoa("Joaquin","35783627860");
MostraNomeCpf(pess.Nome, pess.Cpf);
//Sada = Nome:Joaquin;CPF:35783627860

Console.ReadKey();
}
static void MostraNomeCpf(string nome, string cpf) {
if(nome==string.Empty)
nome="Vazio";
if(cpf==string.Empty)
cpf="Vazio";
Console.WriteLine("Nome:{0}; CPF:{1}", nome, cpf);
}
}
Mtodos
Um mtodo um bloco de cdigo que contm uma srie de instrues. O programa executa as instrues quando chamamos o
mtodo e especificamos argumentos, em C# todas as instrues so executadas por mtodos. O mtodo Main o ponto de entrada
para cada aplicativo C# e ele chamado pelo CLR (Common Language Runtime) quando o programa iniciado.
Assinatura de mtodos
Mtodos so declarados em uma classe ou struct, especificando-se o nvel de acesso como public ou private, modificadores
opcionais como abstract ou sealed, o valor de retorno e o nome do mtodo. Essas partes juntos so o assinatura do mtodo.

Observao:
Um tipo de retorno de um mtodo no parte da assinatura do mesmo para fins de sobrecarga. No entanto, ele parte da
assinatura do mtodo ao determinar a compatibilidade entre um delegate e o mtodo que ele aponta.

Os parmetros do mtodo so colocados entre parnteses e so separados por vrgulas. Parnteses vazios indicam que o mtodo
no requer parmetros.

Sintaxe do mtodo:

[Modificador de visibilidade] [Modificador opcional] [Nome do mtodo]([Lista de parmetros]){


//Definio
}
Exemplo:
//O mtodo abaixo no retorna nenhum valor, est acessvel a qualquer elemento e recebe uma string
como parmetro
public void Pessoa(string Nome) {
//Definio
}

Parmetros
Os parmetros so valores que o mtodo necessita para realizar suas operaes, ao declarar o mtodo devem ser especificados
entre os parnteses com o tipo explicito.

Exemplo:
//O mtodo abaixo aceita um inteiro e uma string como parmetros, que necessariamente precisam ser
passados na chamada.
public void ExcutaAcao(int inteiro, string texto) {

}
57 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

A maneira mais comum de passar os parmetros na chamada como no cdigo abaixo, respeitando a ordem em que foram
definidos.
pess.ExcutaAcao(1, "a");

Mas em C# os parmetros podem ser passados fora de ordem, porm dessa manei precisa ser especificado o nome do parmetro
seguido do valor desejado, exemplo:
pess.ExcutaAcao(texto: "a", inteiro: 1);

Os valores passados como parmetros recebem o nome de argumentos.

Retorno
O retorno do mtodo o tipo de dado que o mesmo devolve ao terminar seu processamento, quando definimos um tipo de retorno
no mtodo o compilador exige um cdigo que garanta o retorno de dados com tipo compatvel, a palavra reservada void
utilizada em mtodos que no precisam retornar nenhuma informao. A palavra chave para retorno de dados return a
execuo do mtodo interrompida quando a execuo passar por um return.

Exemplos
//Esse mtodo no retorna nenhuma informao chamada
public void ExcutaAcao(int inteiro, string texto) {
//Definio
}
//Esse mtodo retorna uma string concatenando os dois parmetros
public string ExcutaAcao(int inteiro, string texto)
{
return texto + inteiro.ToString();
}
Sobrecarga
Sobrecarga de mtodo a possibilidade de termos mtodos diferentes com o mesmo nome diferindo apenas em seus parmetros,
Isso possvel porque o mtodo identificado na chamada no s pelo seu nome, mas tambm pelos argumentos recebidos. Esse
recurso nos ajuda a manter a semntica do cdigo.

Exemplo
class Pessoa2 {

public string FormataDados(string Nome) {


return "Nome:" + Nome;
}
public string FormataDados(string Nome, string Cpf) {
return "Nome:" + Nome + " Cpf:" + Cpf;
}
}

class Program
{
static void Main(string[] args)
{
Console.WriteLine(new Pessoa2().FormataDados("Vinicius"));
//Sada = Nome:Vinicius

Console.WriteLine(new Pessoa2().FormataDados("Vinicius", "01234567890"));


//Sada=Nome:Vinicius Cpf:01234567890
}
Parmetros opcionais
Em C# podemos ter parmetros opcionais nos mtodos, isso significa que na chamada no necessrio passar todos os parmetros
definidos na assinatura do mtodo, isso possvel definindo um valor padro para o parmetro o qual usado no caso de no ser
especificado na chamada. Isso pode ser til quando precisamos acrescentar um novo parmetro em um mtodo usado muitas vezes
na aplicao e desejamos que ele continuasse funcionando da mesma maneira de antes onde j foi utilizado.

Exemplo
//Nesse caso se o cpf no for especificado na chamada.
//O nome ser exibido e no lugar do Cpf a palavra "Vazio" aparecer.
public string FormataDados(string Nome, string Cpf="") {
if (Cpf == "")
Cpf = "Vazio";
return "Nome:" + Nome + " Cpf:" + Cpf;
}
58 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Parmetros de sada e por referncia


Os parmetros de sada so uma forma de um mtodo retornar mais valores alm do seu retorno, h situaes em que, por
exemplo, precisamos converter um valor sem retornar exceo, podemos usar o retorno do mtodo para dizer se a converso foi
um sucesso e um parmetro de sada com o valor do convertido. Os parmetros de sada so identificados pela palavra reservada
out precedendo o tipo do parmetro, um parmetro de sada s pode receber como parmetro um varivel de tipo compatvel e
nunca um valor literal, a palavra reservada out tambm tem que preceder o argumento na chamada, o mtodo obrigado pelo
compilador a atribuir um valor ao argumento. Passagem por referncia quando passamos a instncia diretamente para o mtodo
que consegue fazer modificaes na mesma que refletem no escopo em que foi definida, quando no fazemos isso e alteramos
instncia dentro do mtodo isso no reflete no escopo em que ela foi definida.
Exemplos
class Program2
{
static void Main(string[] args)
{
//Parmetro por referncia
PessoaSimp pess = new PessoaSimp();
pess.Nome = "Nome escopo classe";
pess.CPF = "Cpf escopo classe";

Console.WriteLine("Classe");
pess.ExibeDados();
//Saida = Nome:Nome escopo classe Cpf:Cpf escopo classe

Console.WriteLine("Mtodo");
AlteraPessoa(pess);
//Saida = Nome:Nome escopo mtodo Cpf:Cpf escopo mtodo

Console.WriteLine("Classe");
pess.ExibeDados();
//Saida = Nome:Nome escopo classe Cpf:Cpf escopo classe

Console.WriteLine("Mtodo");
AlteraPessoa(ref pess);
//Saida = Nome:Nome escopo mtodo Cpf:Cpf escopo mtodo

Console.WriteLine("Classe");
pess.ExibeDados();
//Saida = Nome:Nome escopo mtodo Cpf:Cpf escopo mtodo

//Parmetro de sada
int val;

if (StringToInt("1",out val))
Console.WriteLine("Converso bem sucedida valor={0}", val);
else
Console.WriteLine("Converso falhou");

Console.ReadKey();

}
static void AlteraPessoa(PessoaSimp pess) {
pess = new PessoaSimp();
pess.Nome = "Nome escopo mtodo";
pess.CPF = "Cpf escopo mtodo";
pess.ExibeDados();
}
static void AlteraPessoa(ref PessoaSimp pess) {
pess = new PessoaSimp();
pess.Nome = "Nome escopo mtodo";
pess.CPF = "Cpf escopo mtodo";
pess.ExibeDados();
}
59 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Enums

A palavra-chave enum usada para declarar uma enumerao, um tipo distinto que consiste em um conjunto de constantes
nomeadas denominada lista de enumerador. Geralmente melhor definir um enum dentro de um namespace para que todas as
classes no namespace possam acess-lo com igual convenincia. No entanto, um enum tambm pode ser aninhado dentro de uma
classe ou struct. As constantes tm um valor numrico relacionado. Por padro iniciando em 0 e aumentando em 1 a cada uma.
Mas esse valor tambm pode ser atribudo explicitamente.

Sintaxe bsica de um enum:

Enum{[Constantes separadas por vrgula]};

Exemplo de um enumerador com os dias da semana.


enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

Enumeradores podem usar os inicializadores para substituir os valores padres, conforme mostrado no exemplo a seguir.

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

Utilizando um enum

enum DiasDaSemana {

Segunda,
Tera,
Quarta,
Quinta,
Sexta
}

static string AnalisaDiaSemana(DiasDaSemana Ds) {


switch (Ds)
{
case DiasDaSemana.Segunda:
return "Ta comeando...";
case DiasDaSemana.Tera:
return "Fora...";
case DiasDaSemana.Quarta:
return "Estamos na metade...";
case DiasDaSemana.Quinta:
return "Vespera de sexta...";
case DiasDaSemana.Sexta:
return "AwwwwwwwwwwwwwIeeeeeee";
default:
return "Final de semana";
}
}
O mtodo retorna um texto em funo do valor do enum recebido como parmetro.

Herana

A herana, juntamente com o encapsulamento, polimorfismo e abstrao, uma das quatro principais caractersticas (ou pilares)
da programao orientada a objeto. A herana permite que voc crie novas classes para reutilizar, estender e modificar o
comportamento que est definido nas outras classes. A classe cujos membros so herdados chamada de classe base, e a classe
que herda a esses membros chamada de classe derivada. Uma classe derivada pode ter apenas uma classe base direta. No
entanto, a herana transitiva se ClassC derivada da ClassB e ClassB derivada da ClassA, ClassC herda os membros
declarados em ClassB e ClassA.
60 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Conceitualmente, uma classe derivada uma especializao da classe base. Por exemplo, se voc tiver uma classe base Animal,
voc pode ter uma classe derivada que denominada Mamferos e outra classe derivada que denominada Rpteis. Tanto os
mamferos quanto rpteis so animais, mas cada classe derivada representa especializaes diferentes da classe base.

Quando voc definir uma classe para derivar de outra classe, a classe derivada implicitamente obtm todos os membros da classe
base, exceto para os construtores e destrutores. A classe derivada, assim, pode reutilizar o cdigo da classe base sem ter que
rescrever. Na classe derivada, voc pode adicionar mais membros. Dessa forma, a classe derivada estende a funcionalidade da
classe base.

Em C# para que uma classe herde de outra deve ser adicionado aps o nome da mesma : seguido do nome da classe base.

Exemplo abaixo.

class Animais
{
//Definio
}

class Mamiferos : Animais {


//Definio
}
Nesse caso mamferos passa a ser um animal e possuir todos os elementos da classe base que as restries de visibilidade
permitam.

Classe e mtodos estticos


Uma classe esttica basicamente a mesma coisa que uma classe no esttica, mas h uma diferena: uma classe esttica no
pode ser instanciada. Em outras palavras, voc no pode usar a Palavra-chave new para criar uma varivel do tipo da classe. Como
no h nenhuma varivel de instncia, voc acessa os membros de uma classe esttica usando o nome da classe propriamente
dito. Por exemplo, se voc tiver uma classe esttica denominada UtilityClass contendo um mtodo pblico chamado MethodA,
voc chama o mtodo conforme o exemplo abaixo:
UtilityClass.MethodA();

Uma classe esttica pode ser usada como um recipiente conveniente para conjuntos de mtodos que s operam nos parmetros de
entrada e no precisar obter ou definir quaisquer campos internos de instncia. Por exemplo, a biblioteca de classes do .NET
Framework contm a classe esttica System.Math que contm mtodos que executam operaes matemticas, sem a necessidade
de armazenar ou recuperar dados exclusivos de uma determinada instncia da classe Math. Ou seja, basta utilizar os membros da
classe especificando o nome da classe e o nome do mtodo, conforme mostrado no exemplo a seguir.

double dub = -3.14;

Console.WriteLine(Math.Abs(dub));

Console.WriteLine(Math.Floor(dub));

Console.WriteLine(Math.Round(Math.Abs(dub)));

// Output:
// 3.14
// -4
// 3
Uma classe esttica no pode conter variveis de instancia nem mtodos no estticos. Sintaxe para declarao de uma classe
esttica.

[Modificador de visibilidade] static class [Nome da classe]{


//Definio
}

Exemplo:
public static class Matematica {
//Definio
}
61 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Uma classe no esttica tambm pode conter mtodos estticos contanto que no acessem variveis de instancia nem mtodo no
estticos. A sintaxe para criao de um mtodo esttico a mesma de um mtodo no esttico a diferena a adio da palavra-
chave static antes do tipo de retorno do mtodo. Exemplo abaixo:
public static int Soma(int n1,int n2){
//Definio
}

Converses
Em C# com algumas excees todas as converses devem ser explicitas. Quase todos os tipo elementares oferecem mtodos para
converso o Parse e o TryParse. Vamos realizar converses para os tipos mais comuns.

//string para inteiro


string IntStr = "1";
//S devemos usar o parse se tivermos certeza que o valor da string representa um nmero
inteiro.
//Pois se no representar uma exceo ser lanada.
int Inteiro = int.Parse(IntStr);
//Quando no temos certeza se o valor da string um inteiro melhor utilizar o
TryParse.
//Retorna um booleano indicando se a converso foi um sucesso.
bool Sucesso = int.TryParse(IntStr,out Inteiro);

//string para double


string DoubStr = "1,1";
double db = double.Parse(DoubStr);
Sucesso = double.TryParse(DoubStr, out db);

//string para float


string FloatStr = "1,1";
float fl = float.Parse(FloatStr);
Sucesso = float.TryParse(FloatStr, out fl);

//string para decimal


string decStr = "1,1";
decimal dc = decimal.Parse(decStr);
Sucesso = decimal.TryParse(decStr, out dc);

//string para DateTime


string DtStr = "10/01/2011";
DateTime dt = DateTime.Parse(DtStr);
Sucesso = DateTime.TryParse(DtStr, out dt);
Outra forma de converso a conhecida como cast ele usado para converter um tipo da classe base para qualquer tipo
derivado, o tipo object, por exemplo, pode ser castado para qualquer outro tipo em C# pois todos derivam dele. Mas ateno se
o tipo que estiver na varivel no for o mesmo que estamos tentando converter, uma exceo ser lanada, a sintaxe do cast a
seguinte:

([nome do tipo)[nome da varivel];

Exemplo
object val = 1;
int intval = (int)val;

//A linha abaixo causa uma exceo.


string strval = (string)val;

Interfaces
A interface uma espcie de contrato sobre as funcionalidades que os objetos que derivados dela devem ter. Ela no apresenta a
implementao das funcionalidades apenas as assinaturas, mas garante que as classe derivadas as implementaro. A sintaxe para
criao de interfaces a seguinte:

[Modificador de visibilidade] interface [Nome da interface]{


//Definio
}
Nas interfaces definimos apenas assinaturas de mtodos que os tipos derivados devero ter, no precisamos definir o modificador
de visibilidade, pois se est na interface o mtodo deve ter acessibilidade irrestrita.
62 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Exemplo
public interface IAnimais {
void Repirar();
string GetNome();
void SetNome(string Nome);
}

Classe derivada
public class Mamiferos : IAnimais {

public void Repirar()


{
throw new NotImplementedException();
}

public string GetNome()


{
throw new NotImplementedException();
}

public void SetNome(string Nome)


{
throw new NotImplementedException();
}
}

ADO.net
O ADO.net um conjunto de classe voltadas ao acesso de dados, ele fornece cdigos consistente de acesso aos dados em fontes
como o Microsoft SQL Server e XML, bem como a fontes de dados expostas atravs de OLE DB e ODBC. Aplicaes cliente
pode utilizar o ADO.NET para conectar-se a essas fontes de dados e recuperar, manipular e atualizar os dados que elas contm.
O ADO.net contm objetos bases sobre os quais implementaes especficas para cada SGDB so feitas. Abaixo as classes que
utilizaremos para acessar dados nos exemplos da apostila.
Objeto Descrio
DbConnection Encapsula uma conexo com banco de dados
DbCommand Encapsula um comando SQL
DataTable Representa um conjunto de dados em formato tabular.
DbDataAdapter Executa comandos e preenche dados.
DbParameter Encapsula um parmetro de instruo SQL

Acessando um banco de dados.


Vamos realizar as operaes bsicas com banco de dados nesse tpico, para os exemplos nos conectaremos em um banco Sql
Server.

Estabelecendo uma conexo com o banco de dados


Existe mais de uma maneira de estabelecer a conexo com um banco de dados em C# vamos aprender atravs da utilizao da
classe de conexo especfica para o SGBD que utilizamos, os bancos mais utilizados tem uma implementao prpria sobre o
ADO.net como SQL Server, MySql, Oracel, Firebird, DB2 entre outros, mas tambm possvel acessar atravs de classe
genricas para bancos de dados OLE ou por ODBC. Se existir uma implementao especifica para o banco que ir utilizar nas
suas aplicaes recomendado que a utilize, ela provavelmente saber trabalhar melhor com aspectos especficos da distribuio.
No exemplo abaixo utilizaremos a classe SqlConnection que a derivada para Sql server da DbConnection do ADO.NET para
qualquer outro banco de dados a sintaxe deve ser parecida. Devemos passar a string de conexo com parmetros para o construtor
da classe, assim j termos os dados necessrios para que o sistema conecte no banco de dados, cada banco de dados interpreta a
string de conexo de uma forma, na seo de links temos um site com uma srie de exemplo de strings de conexo para os mais
diversos bancos nas mais diversas situaes.

SqlConnection Conn = new SqlConnection("Data Source=myServerAddress;Initial


Catalog=myDataBase;User Id=myUsername;Password=myPassword;");

No cdigo acima criamos a conexo, porm s saberemos se est funcionamos quando tentarmos abrir a mesma atravs do
mtodo Open ou executar um comando com DataAdapter.
Conn.Open();
63 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Exemplo de mtodo para testar a conexo:


public string testConnect(string Connect)
{
string Mensagem;
try
{

GetConnection().Open();
Mensagem = "Conectado com sucesso";
}
catch (Exception e)
{
Mensagem = e.Message;

return Mensagem;
}

Executando uma query


Para executar um comando usamos uma derivada da classe dbCommand, para essa classe devemos passar o comando em forma
textual, uma instncia da conexo e tambm o tipo do comando, no caso CommandText, veja no exemplo abaixo.
//Criamos um objeto DataTable onde o resultado do select ser armazenado
System.Data.DataTable tb = new System.Data.DataTable();
//Criamos uma instncia da conexo para o servidor onde o comando ser executado, no
precisa ser aberta quando utilizamos o DataAdapter.
SqlConnection mycon = new SqlConnection("Data Source=myServerAddress;Initial
Catalog=myDataBase;User Id=myUsername;Password=myPassword;");
//Criamos um objeto SqlCommand passando o instruo sql e a conexo para o server
SqlCommand Cmd = new SqlCommand("select * from clientes", mycon);

//Aqui criamos um objeto DataAdpter passando o comando com parmetro.


SqlDataAdapter da = new SqlDataAdapter(Cmd);
//Aqui chamamos o comando fill que responsvel por executar o comando e preencher o
DataTable com os resultado obtidos
da.Fill(tb);
//Fechamos a conexo
mycon.Close();
//Retornamos o DataTable preenchido para ser utilizado conforme necessrio.
return tb;

Recuperando os dados do DataTable


O DataTable representa um conjunto de dados em formatos tabulares, por tanto linhas e colunas as linhas esto disponveis,
atravs da propriedade Rows voc acessa cada linha individualmente atravs de um ndice ,por exemplo, Rows[0] acessaria a
primeira linha de um DataTable, cada linha do DataTable consiste em um DataRow que se trata de uma coleo de colunas que
tambm pode ser acessadas por ndice ou pelo nome delas no select ,por exemplo, Rows[0][0] ou ainda Rows[0][id_cliente].
Vamos ver no exemplo como converteramos o resultado da query executada anteriormente em uma lista de objetos do tipo
cliente.

public class Cliente {


public string nome{ get; set; }
public DateTime DataPrimeiraCompra { get; set; }
}
public class ClienteControl {

public List<Cliente> DtToList(DataTable dt) {


List<Cliente> lst = new List<Cliente>();
Cliente cli;

//Fazemos um for para passar a cada linha do DataTable e alimentaremos um objeto


cliente com os dados.
for (int i = 0; i < dt.Rows.Count; i++) {
//Essa uma forma simplificada de inicializar um objeto.
//Melhora a semntica do cdigo.
cli = new Cliente()
{
64 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

nome = dt.Rows[i]["nome"].ToString(),
DataPrimeiraCompra =
DateTime.Parse(dt.Rows[i]["data_ult_compra"].ToString())
};
//Adiciona na lista de cliente perceba que a vriavel a mesma, mas a cada
iterao criada uma nova instncia.
lst.Add(cli);
}
return lst;
}
}
Executando comandos diferentes de consulta
Para executar outros comandos que no sejam consultas, como inserts,deletes e updates, o processo o mesmo que executar uma
query as nicas diferenas que no vamos utilizar um DataAdpter e executaremos o comando atravs do mtodo da classe
DbCommand ExecuteNonQuery(). Veja abaixo um exemplo.
DbConnection Conn = new SqlConnection();
DbCommand Cmd = new SqlCommand("delete from clientes",(SqlConnection)Conn);
Cmd.CommandType = CommandType.Text;

//Aqui precisamos abrir a conexo antes


Conn.Open();
Cmd.Connection = Conn;
Cmd.CommandText = Cmd.CommandText;
Cmd.ExecuteNonQuery();
Conn.Close();
Passagem de parmetros
Quando vamos utilizar um comando que necessita de parmetro o ideal no utilizar a concatenao de string, pois os dados
podem estar em formatos diferente na aplicao e no banco de dados, alm de abrir uma vulnerabilidade para injeo de comando
sql na aplicao. A melhor maneira de se fazer acessar a lista de parmetros da classe derivada de DbCommand de acordo com o
SGBD que estiver utilizando no caso do SqlServer temos as seguinte sobrecargas:

Parameters.Add([SqlParameter]);
Parameters.Add([Nome do parmetro(string),[SqlDbType(enum)]);
Parameters.Add([Nome do parmetro(string),[SqlDbType(enum)],[Tamanho (para tipos que se aplica)]);
Parameters.Add([Nome do parmetro(string),[SqlDbType(enum)],[Tamanho (para tipos que se aplica)],[Coluna utilizada
como fonte de dados]);
Para especificarmos o valor dos parmetros acessamos a propriedade Value, pode ser diretamente ao utilizar o mtodo Add sem
necessidade de criar um objeto SqlParameter antes.
Exemplo:

Cmd.Parameters.Add("nome", SqlDbType.VarChar, 5).Value="Jhony";

Passando parmetro para um comando Texto


DataTable dt = new DataTable();
SqlConnection Conn = new SqlConnection"Server=myServerAddress;Database=
myDataBase;Uid=MyUser;Pwd=MyPwd;");
SqlCommand cmd = new SqlCommand("select * from clientes_tbl where
id_usuarios=@id_usuarios",Conn);
cmd.Parameters.Add("@id_usuarios", SqlDbType.Int).Value = 1;
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
foreach (DataRow item in dt.Rows)
{
Console.WriteLine(item[2].ToString());
}
Console.ReadKey();

Passando parmetro para uma procedure


DataTable dt2 = new DataTable();
SqlConnection Conn2 = new SqlConnection("Server=myServerAddress;Database=
myDataBase;Uid=MyUser;Pwd=MyPwd;");
SqlCommand cmd2 = new SqlCommand("sp_write_clientes", Conn);
cmd2.Parameters.Add("@id_clientes", SqlDbType.Int).Value = 1;
cmd2.Parameters.Add("@nome", SqlDbType.Int).Value = "Joo";
Conn.Open();
65 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

cmd2.ExecuteNonQuery();

Prtica de cadastro salvando em banco de dados


Crie uma tela de cadastro de clientes com os campos cdigo, nome e documento. O usurio pode salvar os dados digitados
clicando em salvar. Quando ele digitar um cdigo j existente tem que recuperar os dados do cliente.

Criao de controles customizados


O .net oferece uma vasta gama de controles para as mais variadas situaes, porm existem momento em que uma necessidade
especfica no pode ser suprida por nenhum desses controle nesse momento que entram os controles definidos pelo usurio.
Tipos de controles customizados
Controles composto, so a forma mais simples de criar um controle customizado, consiste em reunir
controles existentes para criar um novo controle.
Controle estendido, so controles que herdam de um controle como TextBox e Button e estendem suas
funcionalidades.
Para adicionar um controle customizado em seu projeto clique com o boto direito sobre ele na Solution Explorer e escolha no
menu contextual a opo new->Item, selecione a categoria Windows Forms e depois User Control.
Imagem abaixo. Mude o nome como quiser e clique em Add.

Vamos fazer um exemplo de cada tipo de controle.

Controle composto.
1- Em um projeto Windows Forms adicione um User Control.
2- Mude o nome para Cronometro e clique em Add.
3- Um painel que representa a rea do controle aparecer.
4- Arraste um label e um boto para o mesmo.
5- Renomeie o label para lblSegundo e coloque propriedade Text com o valor 0.
6- Renomeie o boto para btnIniciar e mude o texto para Iniciar.
7- Deixe o layout do controle parecido com a imagem abaixo:

8-
9- Arraste um controle do tipo timer para o form.
10- Mude a propriedade interval para 1000.
11- Exiba o cdigo do Controle e crie uma varvel do tipo inteiro com o nome Segundos e inicialize-a com 0.
12- V at a lista de eventos do Timer e d um duplo clique no evento Tick.
13- Dentro do mtodo criado coloque o cdigo abaixo:
Segundos++;
lblTempo.Text = Segundos.ToString();
12-Agora crie o evento Click do boto e coloque o cdigo abaixo:
timer1.Start();
13-Recompile seu projeto.
66 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

14-Se tudo correu certo v at a ToolBox, o seu controle customizado estar logo no comeo com o nome que voc atribuiu ao
mesmo arraste para um form execute; Clique no boto iniciar para ver o resultado.

Controle estendido
1 Em um projeto Windows Forms clique com o boto direito New->Item->Code->Class.
2-Coloque o nome TextBoxCustom.
3-Adicione uma herana para a classe TextBox e coloque o modificador publico sintaxe abaixo:
public class TextBoxCustom:TextBox
4-Crie um construtor default mude a cor de fundo e a cor da letra, as propriedades fazem parte da sua classe agora por conta da
herana ento basta usar o this, sintaxe abaixo:
public TextBoxCustom()
{
this.BackColor = Color.Black;
this.ForeColor = Color.White;
}
5-Recompile o projeto.
6-V at a ToolBox, na mesma seo onde se encontra o Cronometro teremos o TextBoxCustom, arraste-o para o form e mude a
propriedade Text para perceber as customizaes.

Generics
Os Generics foram adicionados verso 2.0 da linguagem C# e do Common Language Runtime (CLR). Generics introduzem no
.NET Framework o conceito de parmetros de tipos, que tornam possveis a estruturao de classes e mtodos que adiam a
especificao de um ou mais tipos at que a classe ou mtodo seja declarada e instanciada pelo cdigo do cliente. Por exemplo,
usando um parmetro de tipo genrico T voc pode escrever uma nica classe que outro cdigo do cliente poder usar sem
aumentar o custo ou risco de converses (cast) em tempo de execuo (runtime) ou operaes de boxing, conforme mostrado
abaixo:

// Declara a classe genrica


public class GenericList<T>
{
void Add(T input) { }
}
class TestGenericList
{
private class ExampleClass { }
static void Main()
{
// Declara uma lista do tipo int.
GenericList<int> list1 = new GenericList<int>();

// Declara uma lista do tipo string.


GenericList<string> list2 = new GenericList<string>();

// Declara uma lista de um tipo definido pelo usurio.


GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
}
}

Viso genrica

Usar tipos genricos para maximizar reutilizao de cdigo, segurana de tipo, e desempenho.
O uso mais comum de generics para criar classes coleo.
A biblioteca de classes do .NET Framework contm vrias novas classes de colees genricas no
namespace System.Collections.Generic. Eles devem ser usados sempre que possvel, em vez de classes como ArrayList do
namespace System.Collections.
Voc pode criar suas prprias interfaces genricas, classes, mtodos, eventos e delegates.
Classes genricas podem ser utilizadas para permitir acesso aos mtodos usando tipos de dados especficos.
Informaes sobre os tipos que so usados em um tipo de dados genricos podem ser obtidas em tempo de execuo
usando reflexo.

Por exemplo, podemos fazer um mtodo que converte qualquer string para um enum com o tipo correto.

public static T StringToEnum<T>(char value) where T : struct,IConvertible


67 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

{
try
{
return (T)Enum.Parse(typeof(T), value.ToString());
}
catch (Exception e)
{
string msg = e.Message;
return Activator.CreateInstance<T>();
}
}

Lambda Expression

Uma expresso lambda uma funo annima que pode conter expresses e instrues, e pode ser usada para criar ponteiros de
funo ou tipos de rvores de expresso. Todas as expresses lambda usam o operador lambda = >, que lido como "vai para". O
lado esquerdo do operador lambda especifica os parmetros de entrada (se houver) e o direito contm a expresso ou o bloco de
instrues a expresso lambda x => x * x lido " x recebe x vezes x. " Esta expresso pode ser atribuda a um ponteiro de funo
da seguinte maneira:

delegate int del(int i);


static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
Para criar um tipo de rvore de expresso:

Expression<del> myET = x => x * x;

As expresses lambdas so muito uteis ao trabalharmos com colees, pois podemos passar uma expresso Lambda para os
mtodos que filtram e ordenam a coleo veja alguns exemplos abaixo.

class Pessoa {
public string Nome { get; set; }
public int Idade { get; set; }
public Pessoa() {
Nome = "NomePadrao";
Idade = 12;
}
public object[] RetornaDados() {
return new object[] { Nome, Idade };
}
}
class Program
{
static void Main(string[] args)
{
List<Pessoa> lstpess = new List<Pessoa>();
lstpess.Add(new Pessoa() { Nome = "joo", Idade = 18 });
lstpess.Add(new Pessoa() { Nome = "joozin", Idade = 12 });
lstpess.Add(new Pessoa() { Nome = "joozo", Idade = 18 });
lstpess.Add(new Pessoa() { Nome = "robert", Idade = 15 });
lstpess.Add(new Pessoa() { Nome = "hebert", Idade = 18 });
lstpess.Add(new Pessoa() { Nome = "kenko", Idade = 21 });
lstpess.Add(new Pessoa() { Nome = "louis", Idade = 18 });
lstpess.Add(new Pessoa() { Nome = "hermes", Idade = 56 });

List<Pessoa> ListaFiltrada;

//Retorna todas pessoas com nome joozin


ListaFiltrada=lstpess.FindAll(p => p.Nome == "joozin");
68 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

//Retorna todos maiores de 18 anos


ListaFiltrada=lstpess.FindAll(p => p.Idade > 18);

//Retorna os maiores de 18 anos que tenham o nome comeado em j.


ListaFiltrada=lstpess.FindAll(p => p.Nome.Substring(0, 1) == "j" && p.Idade > 18);

List<Pessoa> ListaOrdenada;

//Retorna lista ordenada por nome


ListaOrdenada=ListaFiltrada.OrderBy(p => p.Nome).ToList<Pessoa>();
//Retorna lista ordenada por ano de nascimento
ListaOrdenada = ListaFiltrada.OrderBy(p => DateTime.Now.Year-p.Idade).ToList<Pessoa>();
}
}
Reflection
Reflection habilidade dos objetos observarem a sua prpria estrutura e tambm a de outros objetos em tempo de execuo, com
reflection podem ser criadas instncia de tipos dinamicamente, carregar mdulo compilados e seus tipos, varrer propriedades das
classes e atribuir valor a elas, varrer mtodos do objeto e invoc-los entre outras coisas, tudo isso de maneira dinmica. As
principais funes de reflection esto no namespace System.Reflection.

Principais classes com uma breve descrio.

Classe Descrio
Type Essa a classe fundamental do namespace reflection ela abstrai
as principais informaes que so relevantes a respeito de um
determinado tipo.
PropertyInfo Rene informaes sobre uma propriedade como nome e o tipo
da mesma.
Activator Utilizado para criao de instncias dinamicamente.
Assembly Rene informaes sobre um mdulo Assembly, como os tipos
contidos no mesmo.

Vamos ver na prtica como realizar as tarefas mais comuns com Reflection;

Varrer as propriedade de uma classe e atribuir-lhes valores

static void VarrePropriedade() {


Pessoa pess = new Pessoa();

//Todos os objetos tem o mtodo GetType() pois o mesmo est definido na classe elementar
object.
//O GetType retorna uma Type que tem o mtodo GetProperties() que retorna uma lista com
informaes sobre as propriedades da classe.
PropertyInfo[] PropI = pess.GetType().GetProperties();
int Contador=10;

//Nesse foreach escrevemos o nome e o tipo da propriedade na tela, e atribumos um valor


para cada
// verificando pelo nome da mesma.
foreach (PropertyInfo item in PropI)
{
Console.WriteLine(item.Name);
Console.WriteLine(item.PropertyType.ToString());

if (item.Name == "Nome")
item.SetValue(pess, "Nome" + Contador.ToString(), null);
else
item.SetValue(pess, Contador, null);
Contador++;
}

//Nesse for exibiremos o valor de todas as propriedades da classe.


foreach (PropertyInfo item in PropI)
{
69 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Console.WriteLine(item.GetValue(pess, null));
}
}
Criar a instncia de um tipo annimo

//O mtodo abaixo cria uma instncia do tipo definido na hora da chamada, na definio no se sabe
qual tipo ser criado.
static T CriaInstanciaAnonima<T>() {
return Activator.CreateInstance<T>();
}
Carrega dinamicamente um tipo contido em outro assembly

Essa eu considero a funcionalidade mais importante. Porm mais complexo de ser feito por tanto vamos passo a passo.

1-)Crie um projeto do tipo Class Library com o nome Abstraes.

2-)Delete a classe de nome class1.cs que criada por padro.

3-)Adicione uma Interface de nome IReflexaoDb.

4-)Adicione a assinatura de mtodo abaixo na interface:

object[] RetornaDados();
5-)Adicione um novo projeto ClassLibrary com o nome BusinessLayer.

6-)Altere o nome da classe padro de Class1 para Clientes.

7-)Clique com o boto direito sobre o projeto selecione Add Reference->Aba projects->Abstracoes->Ok.

8-)No arquivo da classe Clientes coloque no incio o comando abaixo:

Using Abstracoes

9-)Adicione a herana de IReflexaoDb para Clientes.

10-)Adicione 2 propriedade do tipo string na classe Clientes Nome e Cpf.

11-)Adicione um construtor default para incializar a varivel.

Cdigo:

public Clientes() {
Nome = "nome padro";
Cpf = "Cpf padro";
}

12-)Implemente o mtodo da Interface na classe Clientes cdigo abaixo:

public object[] RetornaDados()


{
return new object[]{Nome,Cpf};
}
13-)Compile os dois projetos em release.

14-)Copie as duas dlls geradas para um lugar fcil de encontrar.

15-)Crie um projeto do tipo Windows Forms chame de VisualizadorReflexao.

16-)Arraste um TextBox para tela e chame-o de txtCaminho.

17-)Arraste um Button e chame-o de btnAbrir, mude a propriedade text para Localizar DLL e a propriedade ReadOnly para
true.

18-)Arraste um novo TextBox para tela e chame-o de txtExibicao, mude a propriedade MultLine para true.
70 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

19-)Deixe o design da tela parecido com o da imagem abaixo.

20-)Clique com o boto direito sobre o projeto Add Reference->Aba projetos->Abstracoes.

21-)Crie o evento Click do boto e coloque o cdigo abaixo na sua definio.

OpenFileDialog ofp =new OpenFileDialog();


ofp.Multiselect=false;
ofp.Filter="Arquivos IL|*.dll";
if(ofp.ShowDialog()==System.Windows.Forms.DialogResult.OK){
Assembly asm = null;
try
{
asm = Assembly.LoadFrom(ofp.FileName);
txtCaminho.Text = ofp.FileName;
}
catch
{

MessageBox.Show("Arquivo invlido");
return;
}
foreach(Type item in asm.GetTypes()){
if(item.GetInterface("IReflexaoDb")!=null){

string str = string.Empty;


foreach (object values in
((IReflexaoDb)Activator.CreateInstance(item)).RetornaDados())
{
str += values.ToString() + "\r\n";
}
txtExibicao.Text = str;
}
}

}
22-)Rode o programa clique no boto e v at a pasta onde voc havia guardado a DLL BusinessLayer compilada clique sobre ela,
o programa carregar a DLL dinamicamente e exibir os valores do mtodo RetornaDados de todos as classes derivadas de
IReflexaoDb, no caso somente a classe Clientes, notem que no temos uma referncia DLL onde a classe clientes est definida e
nem conhecemos o tipo clientes durante o desenvolvimento, a aplicao s saber disso no momento que usurio selecionar a
DLL onde os tipos esto contidos. Dessa forma a nossa aplicao exibe os dados de qualquer derivada da interface IReflexaoDb,
desde que indiquemos o caminho do mdulo onde ela est contida.

Varrer os mtodos e invoc-los dinamicamente

class Pessoa {
public string Nome { get; set; }
public int Idade { get; set; }
public Pessoa() {
71 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Nome = "NomePadrao";
Idade = 12;
}
public object[] RetornaDados() {
return new object[] { Nome, Idade };
}
}

static void VarrerMetodos() {


Pessoa pess = new Pessoa();
MethodInfo[] MetInf = pess.GetType().GetMethods();

foreach (MethodInfo item in MetInf)


{
if (item.Name == "RetornaDados")
{
foreach (object item2 in (object[])item.Invoke(pess, null))
{
Console.WriteLine(item2.ToString());
}
}
}

Console.ReadKey();
}

LINKS

Artigo Wikipedia em ingls sobre o C# - http://en.wikipedia.org/wiki/C_Sharp_(programming_language)

Site ECMA sobre a padronizao C# - http://www.ecma-international.org/publications/standards/Ecma-334.htm

Namespace Programming Guide C# MSDN - http://msdn.microsoft.com/pt-br/library/0d941h9d.aspx

Classes e estrutura C# - http://msdn.microsoft.com/pt-br/library/ms173109.aspx

Manual de referncia do C# msdn - http://msdn.microsoft.com/pt-br/library/618ayhy6.aspx

Um pequeno curso gratuito de C# - http://www.oficinadanet.com.br/artigo/825/curso_de_c_sharp_licao_1_iniciando

Operadores C# MSDN - http://msdn.microsoft.com/pt-br/library/ms173145.aspx

ConnectionsStrings - http://www.connectionstrings.com/
72 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Captulo 4-Orientao a objetos


A orientao a objetos uma forma de se pensar em desenvolvimento de sistemas desde a sua modelagem at em sua concepo,
como um agrupamento de objetos independentes anlogos ao mundo real se comunicando em forma de mensagens. A anlise de
projeto orientada a objetos visa definir o melhor conjunto de objetos para descrever um sistema de software. O funcionamento
desse sistema se d pelo relacionamento entre esses objetos. A programao orientada a objetos esta fundamentada em quatro
pilares sem os quais no se caracteriza. Vamos analisar cada um deles abaixo.

Herana
Consiste na possibilidade de classes compartilharem propriedades e mtodos atravs da relao de herana. utilizada com a
inteno de evitar a repetio de cdigo.
Exemplo
public class Pessoa
{
public string Nome { get; set; }

//Mtodo retorna dados marcado como virtual isso significa que pode ser sobrescrito pelas
derivadas
public virtual List<object> RetornarDados()
{
List<object> lst = new List<object>();
lst.Add(Nome);
return lst;
}
}
//A classe Cliente j tem a propriedade Nome e o mtodo RetornaDados, pois herda da classe
Pessoa
public class Cliente : Pessoa
{
public DateTime UltimaCompra { get; set; }

//A classe Cliente estende a classe pessoa adicionando na lista a propriedade UltimaCompra
alm do que j havia
// sido adicionado pela classe base
public override List<object> RetornarDados()
{
List<object> lst = base.RetornarDados();
lst.Add(UltimaCompra);
return lst;
}
}
//A classe fornecedor j tem a propriedade Nome e o mtodo RetornaDados, pois herda da classe
Pessoa
public class Fornecedor:Pessoa
{
public string Categoria { get; set; }

//A classe Fornecedor estende a classe pessoa adicionando na lista a propriedade Categoria
alm do que j havia
// sido adicionado pela classe base
public override List<object> RetornarDados()
{
List<object> lst = base.RetornarDados();
lst.Add(Categoria);
return lst;
}
}

Abstrao
Consiste em concentrar nos aspectos essenciais de um contexto qualquer, ignorando caractersticas menos importantes ou
acidentais. Em modelagem orientada a objetos, uma classe uma abstrao de entidades existentes no domnio do sistema de
software. Por exemplo, vamos abstrair uma pessoa temos uma srie de caractersticas e aes que podem ser abstradas, mas
temos que escolher somente as que so significativas para o sistema.
73 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

Encapsulamento
Consiste na separao dos aspectos internos e externos de um objeto. Este mecanismo utilizado amplamente para impedir o
acesso direto ao estado do objeto(seus atributos), disponibilizando aos outros objetos apenas os mtodos que fazem a acesso a
esses objetos, no caso do C# os getters e setters que no deixam de ser mtodos, apesar de na chamada ser parecida com o acesso
a um atributo. Exemplo voc no precisa conhecer a composio qumica e nem como produzido um remdio para toma-lo, voc
apenas sabe o que ele se prope a fazer e no se preocupa como ele faz isso.

Polimorfismo
Permite que uma mesma declarao de objeto contenha uma instncia de uma classe derivada da mesma, sendo assim esse mesmo
objeto se comporta de maneiras diferentes dependendo da instncia passada a ele. Alguns autores consideram a sobrecarga de
mtodos como uma forma de polimorfismo.
Exemplo
Vamos utilizar as classes Cliente e Fornecedor do exemplo de herana, se declararmos um objeto pessoa e atribuir a ele uma
instancia de Cliente o mtodo RetornaDados se comportar de uma maneira se for uma instancia de Fornecedor se comportar de
outro acompanhe no cdigo abaixo:
static void Main(string[] args)
{
Pessoa pess;

pess = new Cliente();


pess.Nome = "jo";
//Como o objeto foi declarado com o tipo genrico para acessarmos membros da
especializao
//precisamos realizar um CAST.
((Cliente)pess).UltimaCompra = DateTime.Now;
//Cliente
ExibeDados(pess.RetornarDados());
/*Saida: jo
* Hora atual: exemplo 23/08/2011 09:04
*/

pess = new Fornecedor();


pess.Nome = "jo";
((Fornecedor)pess).Categoria = "Farmaceutico";
//Fornecedor
ExibeDados(pess.RetornarDados());
/*Saida: jo
* Farmaceutico
*/
Console.ReadKey();

}
static void ExibeDados(List<object> values) {
foreach (object item in values)
{
Console.WriteLine(item.ToString());
}
}

Princpios
A programao orientada a objetos tem seus pilares e no pode existir sem os mesmos, mas existem princpios que apesar de no
fazer parte da sua concepo so extremamente importantes e desejveis em sistema bem desenhados. Abaixo comentaremos
sobre alguns dos mais importantes.

SOLID
Essa sigla um acrnimo para a palavra inglesa solid, que significa slido, solidez. Cada letra representa um acrnimo de um
princpio, ou seja, temos um acrnimo de acrnimos. Esse conjunto o resultado de estudos e experincias de vrios
desenvolvedores e foi primeiramente catalogado por Rober Uncle bob Martin(veja sesso de links) em seu livro Applying
Principle and Patterns. Vamos conhecer cada princpio.

S - Single responsibility principle (SRP)


Este o principio da responsabilidade nica, que recomenda que uma classe s deva ter um motivo para sofrer alguma alterao.
Sendo assim, podemos resumir que uma classe qualquer em seu sistema deva ter uma tarefa nica e especfica. Isso, contudo, no
quer dizer que se tenha apenas um nico mtodo, mas que todos os mtodos criados trabalhem juntos em um nico objetivo,
74 Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#

atender a responsabilidade da classe. Outros autores tambm chamam este princpio de coeso. Para entendermos o seu
significado vamos imaginar um cenrio que todos conhecem. Digamos que voc possui uma classe que represente uma nota fiscal,
a classe Nota-Fiscal. E voc a codificou de tal forma que ela mesma, alm de conter seus itens, seus clculos, tambm sabe como
se salvar e se recuperar do banco de dados at mesmo sabe se exportar nos mais diversos formatos. Se pararmos para pensar,
temos uma srie de responsabilidades agregadas que no deveriam ser da nota fiscal. Reparem que temos mais de um motivo para
alterar a classe, por exemplo se mais um tipo de exportao aparecer teremos que refatorar nossa classe. O Ideal seriamos ter por
exemplo um objeto exportador e ainda objetos especficos para cada formato de arquivo, deveramos separar os mtodos de
gravao criar uma classe especifica para realizar as aes no banco

O -Open closed principle(OCP)


Este princpios muito importante para se obter um bom design de software. Ele determina que suas classes(Classe de negcios,
servios etc.) devem ser abertas para extenso e fechadas para modificao. A ideia aqui que voc nunca altere uma classe que
esteja em pleno funcionamento (salvo mudana de requisitos nela prpria), mas sim, que possa estend-la para ser reutilizada em
outros cenrios. Isto para evitar que bugs sejam adicionados ao que j est funcionando. Imagine que em um sistema seja
necessrio processar alguns pedidos de compra. Para isso ento voc desenvolve uma classe Pedido e uma classe
ValidadorPedido. A classe ValidadorPedido responsvel por validar um pedido, indicando que o mesmo pode ser processado ou
no. Por isso nela temos um mtodo Validar. Nele esto todas as validaes que um pedido, de acordo com a regra de negcio,
pode sofrer. Caso algo no esteja correto isso registrado em uma propriedade erros que se trata de uma string em forma de texto
e o estado do pedido ento armazenado na propriedade EstaValido. Dessa forma caso uma nova regra de negcio aparecesse
teramos que alterar o Mtodo Validar que est funcionando para adicionar a nova regra, o que fere o principio OCP o ideal seria
termos uma interface que representa uma regra de validao com mtodo Validar retornando uma string, na classe
ValidadorPedido teramos uma coleo de derivadas dessa interface e o Mtodo Validar percorria cada uma dela chamando seu
mtodo validar. Sendo assim ao surgir uma nova regra criamos uma nova classe derivada da interface que representa uma regra de
validao e adicionaramos lista da ValidadorPedido, assim adicionamos uma nova regra com menos risco de criar um bug.

L- Liskov Substitution Principle(LSP)


Este princpio diz que, se voc possui um mtodo ou funo que utiliza outra classe, caso voc passe para esse mtodo uma
derivao dessa mesma classe, esse mtodo dever continuar a funcionar conforme o esperado. Por Exemplo, voc possui um
mtodo Impresso. Imprimir que deve listar os dados de uma Pessoa, supondo que a pessoa s tenha como propriedade Nome ser
isso que imprimir, agora se tivermos uma especializao dessa classe chamada PessoaJurica que tambm tem a propriedade
CNPJ, se chamarmos o mtodo imprimir passando uma pessoa jurdica ele continuar a imprimir o nome da pessoa, mas esse
resultado no corresponde a todos os dados de uma PessoaJuridica que tambm tem um CNPJ. Para adaptar esse cenrio
precisamos criar um mtodo na classe Pessoa chamado retorna dados que pode ser sobrescrito pelas suas derivadas que retorna
uma lista de string que representa os dados a serem impressos incluindo nessa lista somente o Nome e na classe PessoaJuridica
sobrescreveramos esse mtodo adicionando tambm o CNPJ. No mtodo Impresso.Imprimir chamamos esse mtodo da classe
pessoa e varremos a lista imprimindo todas as informaes.

I-Interface segregation principle(ISP)


Este princpio est relacionado ao primeiro, SRP. Aqui o dito que no devemos obrigar uma classe a implementar mtodos de
uma interface que ele no necessita. Isso cabe tambm a classes abstratas. Vamos imaginar que temos uma classe IObjetoNegcio
que tem o mtodo HouveAlteracao, todos nosso objetos necessitam desse comportamento? Essa interface est muito genrica
seria melhor dividi-la melhor em mdulos.

D-Dependency inversion principle(DIP)


A definio formal desse principio diz que mdulo de alto nvel no podem depender de mdulo inferiores, mas que devem
depender de abstraes. E que abstraes no devem depender de detalhes, mas os detalhes que devem depender de abstraes.
Vamos colocar tudo isso em uma linguagem mais objetiva: quando suas classes precisam de referncias de outras classes, que
essas sejam interfaces. A ideia isolar nossa classe atrs de uma cerca bem definida. Essa cerca a abstrao na qual a classe
depende. Estando presa a uma abstrao e no a algo concreto, caso a implementao da abstrao sofra alteraes, a classes no
sofrer nada.

Principios adicionais
Dry-Dont repeat yourself
No se repita. Duplicar uma lgica pelo sistema prejudica sua manuteno e estabilidade, porque caso voc precise
ajustar essa lgica que est duplicada, e esquecer algum ponto, seus sistema ter duas resposta diferentes para a mesma lgica.

Kiss-Keep it simple stupid.


Keep it simple stupid Mantenha isso simples, idiota. O que esse princpio sugere , codifique o cdigo mais
simples que resolva o problema. Cdigo simples no significa cdigo ruim, mas sim, simples mesmo. Um exemplo banal que se
voc precisar percorrer uma lista do primeiro ao quarto elemento, o que voc usa? Um comando For correto? Sim, mas tem gente
que vai utilizar um while, para essa mesma tarefa. Porque complicar? E assim tambm para as demais rotinas de seu sistema, seja
prtico e simples, no complique o cdigo (e seu entendimento) com desculpas de desempenho e processamento, a no ser claro,
que o desempenho seja significativamente diferente.

Você também pode gostar