Você está na página 1de 77

Sumrio Contedo

Captulo 1- .NET Framework


O que ? Histria Verses do .NET Framework Principais Recursos por verses Arquitetura bsica O que IL? Garbage Collection GAC LINKS

Pgina
1 1 1 2 2 3 3 6 6 7

Captulo 2-Microsoft Visual Studio 2010


O que ? Histria Funcionalidades por verses Como iniciar? Estrutura de um projeto e tipos de arquivos bsicos Templates Code Snippet Ferramentas de analise de cdigo Principais janelas do VS 2010 Debugando com VS 2010 IntelliTrace Gerando um release LINKS

8 8 8 8 8 10 11 12 13 13 13 14 16 16 17 17 17 17 18 18 19 20 21 21 24 25 26 30 30 32 32 33 34

Captulo 3-Microsoft C#
O que ? Histria Viso conceitual classes Namespaces Using Tipos de dados bsicos Tipos de valor e de referncia Varveis Operadores Desvios condicionais Switch Estruturas de repetio Tratamento de erro Arrays e Lists Windows Forms Eventos Guia rpido: Hello World Principais componentes Windows

Forms Trabalhando com arquivo texto Modificadores de acesso Classes Propriedades e variveis Construtores Mtodos Sobrecarga Enums Herana Classes e mtodos estticos Converses Interfaces ADO.net Trabalhando com bancos de dados Criao de controles customizados Generics Lambda Expressions Reflection LINKS

51 53 53 53 54 56 57 59 59 60 61 61 62 65 66 67 68 71 72

Captulo 4 Orientao a objetos


Pilares Princpios

72 73

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.

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 Framework 1.0 1.1

Verso do CLR 1.0 1.1

Verso do Visual Studio Visual Studio .NET Visual Studio .NET 2003

Descrio Contm a primeira verso do CLR e a primeira verso da biblioteca de classes. 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 . 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.

2.0

2.0

Visual Studio 2005

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. 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. 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.5

2.0

Visual Studio 2008

Visual Studio 2010

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 !"); } } }

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 } } }

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

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 diferen tes verses da mesma DLL instalada no disco.

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--NETreconhece-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/PDC2008NETFX4.pdf Mapa de classes comuns do .net framework 3.5 - http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=19341

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:

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


*.sln *.suo *.csproj *.cs *.resx

Do que se trata
Arquivo onde ficam armazenadas as informaes sobre as solues do Visual Studio. Arquivo oculto complementar da soluo precisa ser copiado com a soluo para a pasta destino. Arquivo onde ficam armazenados os dados sobre os projetos do Visual Studio. Arquivo onde fica armazenado o cdigo no compilado do c#. 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 names pace 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 sbyte byte char short ushort int uint Abrangncia -128 to 127 0 to 255 U+0000 to U+ffff -32,768 to 32,767 0 to 65,535 -2,147,483,648 to 2,147,483,647 0 to 4,294,967,295 Tamanho em bits 8 8 16 16 16 32 32

long

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

64

ulong

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

64

Tipos de ponto flutuante e decimal Tipo float double decimal Abrangncia 1.5e45 to 3.4e38 5.0e324 to 1.7e308 (-7.9 x 10 to 7.9 x 10 ) / (10
28 28 0 to 28

Preciso 7 dgitos 15-16dgitos ) 28-29 dgitos significantes

Tamanho em bits 32 64 128

Outros tipos de dados importantes Tipo string DateTime Descrio Representa uma cadeia de caracteres 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 x.y f(x) a[x] x++ x-new T(...) new T(...){...} new {...} new T[...] typeof(T) checked(x) unchecked(x) default (T) delegate {} Descrio Acesso de associado Invocao de mtodos e delegates Array and indexer access Ps-incremento Ps-decremento Criao de objetos e delegates Criao de objeto com inicializador. Inicializador de objeto annimo. Criao de array Obtm o Sytem.Type para T Executa a expresso em um contexto checado Executa a expresso em um contexto no checado Obtm o valor default para T Funo annima(Mtodo annimo)

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

Operadores multiplicativos
Expresso * / % Descrio Multiplicao Diviso Resto

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

Operadores de troca

23

Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#


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

Operadores relacionais e de tipo


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

Operadores de igualdade
Expresso x == y x != y Descrio Igual Diferente

Operadores lgicos,condicionais e para tratamento de valores nulos


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

Operadores de atribuio e annimos


Expresso = x op= y (T x) => y Descrio Atribuio Compound assignment. Supports these operators: +=, -=, *=, /=, %=, &=, |=, !=, <<=, >>= 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 matem tica 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 Reverse() First() OrderBy(Predicate) Max() Min() Descrio Inverte a ordem dos elementos na lista. Retorna o primeiro elemento da lista. Ordena os valores da lista de acordo com o valor passado com parmetro. Retorna o elemento de valor mximo pela ordem de precedncia. 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 (Name) Backcolor BackgroundImage BackgroundImage1Layout ControlBox Cursor Enabled Font Descrio O nome do objeto form. Cor de fundo do formulrio. Indica uma imagem para o plano de fundo do formulrio. Determina como a imagem defina na propriedade BackGroundImage ser apresentada. Determina quando o form tem um ControBox. Aparncia do cursor do mouse quando estiver sobre o form. Determina se o form est habilitado, se estiver falso todos os controle hospedados tambm ficaro desabilitados 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 HelpButton Icon Location

Indica a aparncia e o comportamento das bordas do form. Indica quando o Form tem um boto de ajuda. Indica o cone a ser apresentado no topo do form. Determina o posicionamento do form na tela quando a propriedade StarPosition est com o valor Manual. Indica se o form tem a opo de maximizar. Determina o tamanho mximo que o form pode assumir. Indica se o form tem a opo de minimizar. Determina o tamanho mnimo que o form pode assumir. Representa o nvel de transparncia do formulrio, quando maior mais transparente.

MaximizeBox MaximumSize MinimizeBox MinimumSize Opacity

Size StartPosition Text TopMost Visible Windowstate

Atribui e recupera o tamanho inicial do form Posio do Form na sua primeira apario. Determina o texto que aparece no topo do forn. Determina se o formulrio aparece na frente de todas as outras aplicaes. Determina se o formulrio esta visvel. 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. 2. 3. 4. 5. 6. O ttulo deve ser formulrio 1. O formulrio deve abrir maximizado. O formulrio no pode ser minimizado. O formulrio deve ser parcialmente transparente. O formulrio deve aparecer acima de todas as outras telas abertas. O formulrio deve abrir junto canto superior direito da tela.

Os requisitos do segundo so: 1. 2. 3. 4. 5. 6. O ttulo deve ser formulrio 2 O formulrio deve abrir no centro da tela. A cor de fundo do formulrio deve ser vermelha. O Formulrio deve apesentar um cone ao lado do texto. O formulrio no pode ser redimensionado. 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 Text Descrio 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 AutoScroll Descrio Indica se barras de rolagem apareceram automaticamente caso algum controle contido no Panel estiver ultrapassando seus limites. Define se o Panel ser circundado por bordas e qual ser o estilo das mesmas.

BorderStyle

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 estive r 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 AutoScroll Descrio Indica se barras de rolagem apareceram automaticamente caso algum controle contido no Panel estiver ultrapassando seus limites. Define se o Panel ser circundado por bordas e qual ser o estilo das mesmas. Define a ordem do fluxo dos componentes dentro do Panel Indica se as quebras de linha acontecem automaticamente quando os componentes ultrapassam as extremidades do Panel Mtodo, Seta manualmente em qual componente acontece a quebra de linha. Mtodo, Retorna se o componente tem uma quebra de linha atribuda a ele.

BorderStyle FlowDirection WrapContents SetFlowBrake GetFlowBrake

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 val or 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 AutoScroll Descrio Indica se barras de rolagem apareceram automaticamente caso algum controle contido no Panel estiver ultrapassando seus limites. Define se as clulas sero circundadas por bordas e qual ser o estilo das mesmas. Define a quantidade colunas na tabela Apresenta uma coleo editvel das colunas da tabela, onde

CellBordeStyle Column Count Columns

41

Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#


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

ColumnStyles GrowStyle

RowCount Rows

RowStyles

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 Appereance Alignment Multline TabPages AutoScroll BorderStyle Text Descrio Propriedade do TabControl; Determina o estilo visual do TabControl. Determina se as abas aparecero em cima, em baixo, direito ou esquerda do TabControl. Propriedade do TabControl; Indica se mais uma linha de abas pode existir na TabControl. Propriedade do TabControl; Coleo das TabPages, voc pode edita-las nessa propriedade. Propriedade da TablePage; Indica quando as barras de rolagem aparecem automaticamente de acordo com a necessidade. Propriedade da TablePage; Determina se a aba ser circundada por borda e qual ser o estilo da mesma. 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 BorderStyle Fixed Panel Descrio Determina se o SplitterContainer ser circundada por borda e se sim, qual ser o estilo da mesma. Essa propriedade indica qual Panel do SplitContainer ser fixado no tamanho essa propriedade assume os valores Panel1, Panel2 e none. Determina se a posio do divisor poder ser reajustada pelo usurio em tempo de execuo. Determina se o divisor se movimentar horizontalmente ou verticalmente. Expes as propriedades do primeiro Painel do SplitContainer Retorna se o segundo painel do SplitContainer est recolhido. Determina o tamanho mnimo que o segundo painel do SplitContainer pode assumir. Representa a distancia do divisor em relao extremidade esquerda ou da extremidade superior dependendo da orientao Representa a largura do divisor.

IsSplitterFixed Orientation Panel1 Panel2Collapsed Panel2MinSize SplitterDistance SplitterWidth

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 Anchor BackColor Descrio Determina como o controle fica amarrado ao container que foi adicionado. Determina a cor de fundo do controle.

43

Apostila: Desenvolvimento de aplicaes comerciais com Microsoft C#


BackgroundImage CausesValidation ContainsFocus Controls Cursor Dock Enabled Font ForeColor HasChildren Height Location MaximumSize MinimumSize Name Parent Region Size TabIndex Tag Text Visible Width Determina uma imagem para servir com plano de fundo do controle. Indica quando o controle executa mtodos de validaes, esses mtodos servem para verificar se a entrada de dados do usurio est de acordo com as regras de negcio. Indica quando o foco esta no prprio controle ou um em dos seus filhos. Retorna uma coleo dos controles filhos. 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 o mesmo. Determina se o controle est habilitado e funcional. Determina a fonte que ser utilizada para escrever eventuais textos do controle. Determina a cor do primeiro plano do controle, borda, textos entre outros. Determina se o controle possui controles filhos. Representa a altura do controle em pixels. Representa a localizao do controle em relao ao container. Representa o tamanho mximo que o controle pode assumir. 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 design. Retorna o form pai ou o container que o controle est contido. Atribui ou retorna a regio Windows associada com o controle. Representa o tamanho do controle em pixel. Representa a ordem de precedncia do controle quando a tecla Tab for utilizada para navegar controle a controle. 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 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 durante o design estando invisvel na execuo. 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 AutoEllipsis DialogResult FlatAppearance FlatStyle Text TextAlign Descrio Habilita a manipulao automtica textos que excedam a largura do boto. Atribui um DialogResult ao boto, exemplo: DialogResult.Ok, DialogResult.Cancel. 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 e passa a respeitar o que desenvolvedor define no FlatAppearance Atribui o texto que aparece no boto. 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. 2. 3. 4. 5. Crie um novo projeto Windows Forms, arraste um controle Button da ToolBox para o formulrio padro. Altere o valor da propriedade Name para btnMudaCor. Altere o valor da propriedade Text para Mudar cor de fundo. Abra a lista de eventos do boto e d um duplo click no evento Click. 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 AutoCompleteSource estiver com valor custom. 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 pelo desenvolvedor. Determina a forma como os caracteres ficaro na caixa de texto, os valores so:UpperTodos em maisculo, Lower-Todos em minsculo e Normal-Permanece como o usurio digitar. Representa uma coleo de strings que refletem o valor da caixa de texto separado em linhas, s significante quando a propriedade MuliLine estiver com valor verdadeiro. Determina o nmero mximo de caracteres que o TextBox pode aceitar. 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 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 atravs da seleo do mesmo. Indica se barras de rolagem aparecero na caixa de texto caso mltiplas linhas forem aceitas. Uma string representando o texto contido na caixa de texto. Determina se o texto atual deve ser substitudo pelo caractere de senha padro do 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 verdadeiro.

AutoCompleteCustomSource AutoCompleteMode

AutoCompleteSource

CharacterCasing Lines MaxLength MultiLine

PasswordChar

ReadOnly ScrollBars Text UseSystemPasswordChar

WordWrap

Exemplo
1. 2. 3. 4. 5. Crie um novo projeto Windows Forms, arraste um controle TextBox da ToolBox para o formulrio padro. Altere a propriedade Name do TextBox para txtMensagem. Arraste um controle Button da ToolBox para o formulrio padro. Altere a propriedade Name do Button para btnExibir e a propriedade Text para Exibir. 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 que o identifica. Determina se o CheckBox est marcado Determina o estado da marcao do CheckBox, Indeterminate,Checked ou UnChecked Representa o texto que identifica o CheckBox para o usurio Determina se o CheckBox aceita dois ou trs estado de marcao.

AutoCheck Checked

CheckState Text ThreeState

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 chkCarneSeca chkCatupiry chkBacon chkPalmito Propriedade Text Carne seca Catupiry Bacon Palmito

Primeiro Segundo Terceiro Quarto

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
chkCarneSeca_CheckedChanged

Definio
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 Checked Text Descrio Indica se o Radio button esta marcado. Representa o texto que identifica 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 rdbCheddar rdbMussarela Propriedade Text Cheddar Mussarela Propriedade Checked true false

Primeiro Segundo

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

TextMaskFormat

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 0 9 Descrio Representa um dgito obrigatrio de 0-9 Representa um dgito opcional de 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 (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 funcionar como o &. Representa um caractere alfa numrico opcional, Se a propriedade Ascii estiver com valor verdadeiro s aceitar 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 movidos ou apagados.

&

A, a

< > |

Todos outros caracteres

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 File Descrio Fornece mtodos estticos para criao, cpia, deleo, movimentao e abertura de arquivos. Fornece um fluxo sobre o arquivo, suportando operaes sncronas e assncronas de leitura e escrita. um escritor de texto para streams em um enconding em particular. um leitor de texto para streams em um enconding em particular.

FileStream

StreamWriter StreamReader

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 St.WriteLine("Qualquer /* No arquivo ficaria * * Qualquer texto pode * Qualquer texto pode * */ texto pode ser escrito aqui."); texto pode ser escrito aqui."); assim ser escrito aqui. 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 palavrachave 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.
1234567Em um projeto Windows Forms adicione um User Control. Mude o nome para Cronometro e clique em Add. Um painel que representa a rea do controle aparecer. Arraste um label e um boto para o mesmo. Renomeie o label para lblSegundo e coloque propriedade Text com o valor 0. Renomeie o boto para btnIniciar e mude o texto para Iniciar. Deixe o layout do controle parecido com a imagem abaixo:

8910111213-

Arraste um controle do tipo timer para o form. Mude a propriedade interval para 1000. Exiba o cdigo do Controle e crie uma varvel do tipo inteiro com o nome Segundos e inicialize-a com 0. V at a lista de eventos do Timer e d um duplo clique no evento Tick. 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 Type Descrio Essa a classe fundamental do namespace reflection ela abstrai as principais informaes que so relevantes a respeito de um determinado tipo. Rene informaes sobre uma propriedade como nome e o tipo da mesma. Utilizado para criao de instncias dinamicamente. Rene informaes sobre um mdulo Assembly, como os tipos contidos no mesmo.

PropertyInfo Activator Assembly

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 propriedad e 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 public public { string Nome { get; set; } int Idade { get; set; } 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 Rob er 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.