Académique Documents
Professionnel Documents
Culture Documents
Pgina
1 1 1 2 2 3 3 6 6 7
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
72 73
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.
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
3.0
2.0
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
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 !"); } } }
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
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.
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# 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.
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:
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
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.
-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
-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.
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
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
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.
14
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
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.
16
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
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#.
18
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; } } }
19
Observe os outros namespaces antes de Animais, so onde esto os tipos fundamentais do framework e por padro so adicionados ao criar uma classe.
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; }
20
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
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
21
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
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
Operadores de igualdade
Expresso x == y x != y Descrio Igual Diferente
24
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
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
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
}
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
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
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
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
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
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
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:
34
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.
35
Selecione o item Windows Form, mude o nome na caixa de texto abaixo da lista conforme desejado. E clique no boto Add.
36
ForeColor
Determina uma cor de primeiro plano padro, ser utilizada para todos controle caso no seja atribuda separadamente.
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.
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.
37
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
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
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
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
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.
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
41
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
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.
43
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
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
AutoCompleteCustomSource AutoCompleteMode
AutoCompleteSource
PasswordChar
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
AutoCheck Checked
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
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
Mtodo
chkCarneSeca_CheckedChanged
Definio
if (chkCarneSeca.Checked) { if(!Ingredientes.Contains(chkCarneSeca.Text)) { Ingredientes.Add(chkCarneSeca.Text); } } else { Ingredientes.Remove(chkCarneSeca.Text); }
chkBacon_CheckedChanged
chkCatupiry_CheckedChanged
chkPalmito_CheckedChanged
48
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()));
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
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
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
&
A, a
< > |
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
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.
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
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();
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
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
56
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
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
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
Nesse caso mamferos passa a ser um animal e possuir todos os elementos da classe base que as restries de visibilidade permitam.
61
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
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
64
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";
65
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
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
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
//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.
Vamos ver na prtica como realizar as tarefas mais comuns com Reflection;
69
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"; }
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
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.
71
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
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
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.
74