apostila de c#

371
I C# E .NET – GUIA DO DESENVOLVEDOR

Upload: caio-santos

Post on 21-Nov-2015

99 views

Category:

Documents


0 download

DESCRIPTION

Apostila da linguagem de programação C#. Ideal para quem está começando a lidar com a linguagem.

TRANSCRIPT

  • IC# E .NET GUIA DODESENVOLVEDOR

  • Consultores EditoriaisLorenzo RidolfiGerente Snior Accenture

    Srgio ColcherProfessor do departamentode Informtica da PUC-Rio

    Preencha a ficha de cadastro no final deste livroe receba gratuitamente informaes

    sobre os lanamentos e as promoes daEditora Campus.

    Consulte tambm nosso catlogocompleto e ltimos lanamentos em

    www.campus.com.br

  • 2002, Editora Campus Ltda. uma empresa Elsevier Science

    Todos os direitos reservados e protegidos pela Lei 5.988 de 14/12/73.Nenhuma parte deste livro, sem autorizao prvia por escrito da editora,poder ser reproduzida ou transmitida sejam quais forem os meios empregados:eletrnicos, mecnicos, fotogrficos, gravao ou quaisquer outros.

    CapaAdaptao da original americana por RioTextoEditorao EletrnicaRioTextoReviso GrficaAdriana Kramer

    Projeto GrficoEditora Campus Ltda.A Qualidade da Informao.Rua Sete de Setembro, 111 16 andar20050-002 Rio de Janeiro RJ BrasilTelefone: (21) 3970-9300 FAX (21) 2507-1991E-mail: [email protected]

    ISBN 85-352-0954-9

    CIP-Brasil. Catalogao-na-fonte.Sindicato Nacional dos Editores de Livros, RJ

    L697cLima, Edwin

    C# e .Net para desenvolvedores / Edwin Lima,Eugnio Reis. Rio de Janeiro : Campus, 2002

    ISBN 85-352-0954-9

    1. C# (Linguagem de programao de computador).2. Programao orientada a objetos (Cincia da computao).3. Software de componente. I. Reis, Eugnio. II. Ttulo.

    02-0351. CDD 005.117CDU 004.41

    02 03 04 05 5 4 3 2 1

  • DedicatriaAos meus filhos Miguel e Henrique, que so as pessoas que mais amo nestemundo.

    AgradecimentosA Deus por ter me dado a coragem e sabedoria diante do desafio to grandecomo foi escrever este livro.

    A tia L de maneira muito especial, por ter dedicado boa parte da sua vida emtoda a minha formao e educao e por ter me ensinado o Caminho Jesus pelo qual devo andar.

    Aos meus pais, Adiel e Yolanda, porque sem os esforos que eles fizeram nopoderia ter chegado aqui.

    In memoriamDe mi hermano Rubn.De mi abuelita Mam Sarita.

    consegui, painho

    Meu filho de dois anos

    Edwin Lima

    V

  • VI

  • Dedicatria minha esposa Flvia e aos meus filhos Thales e Alice. Eles so o meu grandetesouro e fonte de inspirao.

    AgradecimentosA Flvia, por todo o carinho, pacincia e estmulo ao longo desta empreitada.

    A todos que, direta ou indiretamente, me ajudaram a ser o que eu sou hoje.

    In memoriamAo meu pai, que recentemente deixou este mundo de maneira to serena.

    "O amor um oceano de emoes inteiramente rodeado de despesas"

    Lorde Dewar

    Eugnio Reis

    VII

  • VIII

  • Os AutoresEdwin Lima, pai de dois filhos brasileiros, Miguel e Henrique, nasceu em El Sal-vador, na Amrica Central, em 1972, onde obteve a educao fundamental. Em1992, recebeu uma bolsa de estudos para estudar no Brasil, onde graduou-secomo Bacharel em Cincias da Computao pela Universidade Federal da Para-ba em Joo Pessoa.

    Ingressou no mercado de trabalho em 1996, numa empresa de consultoriaem Joo Pessoa, onde trabalhou at o ano 2000. Nesse perodo, participou comoanalista de sistemas/desenvolvedor em diversos projetos, dentre os quais se des-tacam um sistema de home banking, aplicaes Web e de data warehouse em em-presas de telecomunicaes na Bahia, Pernambuco e Paraba, e diversos outrosprojetos para empresas do segmento pblico.

    No ano 2000, foi contratado para trabalhar na NEC Computers Internatio-nal na Holanda como Data Integration & Oracle Specialist, onde atua at hojedesenvolvendo sistemas no ambiente Oracle para projetos de data warehouse ede integrao de sistemas.

    Acompanha ativamente as tendncias tecnolgicas tendo em sua bagagemprofissional certificaes da Microsoft (MCP), larga experincia em linguagensde programao, suporte a bases de dados SQL Server. especialista no sistemaoperacional MS Windows NT Server e Workstation 4.0 e trabalha no desenvol-vimento de aplicaes para plataformas Microsoft e de cdigo aberto. Investeseu tempo na leitura e na sua atualizao profissional investigando as novas ten-dncias tecnolgicas no mercado de TI.

    Finalmente, como fruto do seu compromisso com a promoo dos valoresdo Reino de Deus, ele se identifica profundamente com as causas sociais que con-correm de uma forma ou de outra para a construo de uma sociedade mais justae igualitria.

    IX

  • Eugnio Reis comeou a estudar programao, quase que por acaso, ainda aos 15anos de idade, num pequeno computador NEZ-8000 com apenas 2k de mem-ria e um interpretador Basic. Hoje, possui mais de 17 anos dedicados ao assunto edomina as mais variadas linguagens de programao em diversos ambientes.

    Entre 1999 e 2000, obteve as certificaes de MCSE (Microsoft CertifiedSystems Engineer), MCSD (Microsoft Certified Solution Developer), MCDBA(Microsoft Certified Consultant), MCT (Microsoft Certified Trainer), OCP(Oracle Certified Professional) e Borland Delphi Certified Consultant.

    Atualmente, trabalha como Consultor de Desenvolvimento Corporativo emAmbiente Cliente/Servidor e Distribudo sobre uma base de dados de 1,5 bilhode registros (aproximadamente 2 terabytes) para o Governo do Estado de NovaYork, nos Estados Unidos.

    Seu hobby preferido msica, multiinstrumentista de cordas e freqente-mente publica artigos sobre o assunto na Internet. Isso, claro, quando seus doisfilhos, Thales e Alice, e sua esposa Flvia assim o permitem!

    Seu Web site http://www.eugenio.com.br.

    X

  • Sumrio

    Prefcio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XIII

    PARTE IFundamentos de C# .Net

    1 A plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . 3Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    2 A linguagem C# . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19As caractersticas do C# . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    3 Programao Orientada a Objetos (OOP) em C# . . . . . . . . . 68Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

    4 Namespaces, Assemblies e documentaode sistemas usando XML . . . . . . . . . . . . . . . . . . . . . . 95Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100Documentando sistemas em C# . . . . . . . . . . . . . . . . . . . . . . 112Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

    5 Windows Forms . . . . . . . . . . . . . . . . . . . . . . . . . . 118Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118Usando FORMS: o corao de toda aplicao Windows . . . . . . . . . . 119Usando o componente TabControl . . . . . . . . . . . . . . . . . . . . . 131Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

    XI

  • 6 .NET Avanada . . . . . . . . . . . . . . . . . . . . . . . . . . . 161Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161Usando o componente FileSystemWatcher . . . . . . . . . . . . . . . . . 161Usando a classe Process . . . . . . . . . . . . . . . . . . . . . . . . . . . 163Colees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176Reflection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

    PARTE IIEstudo de Caso

    7 ADO.NET Projeto e Definio de Dados . . . . . . . . . . . . 193Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193Por onde comear. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194Conceito de Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . 195Namespaces de ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . 197Codificao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202Escolhendo a plataforma-alvo. . . . . . . . . . . . . . . . . . . . . . . . 210Eventos do formulrio . . . . . . . . . . . . . . . . . . . . . . . . . . . 212Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218

    8 ADO.NET Entrada e Validao de Dados . . . . . . . . . . . . 219Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

    9 Relatrios Usando o Crystal Reports . . . . . . . . . . . . . . 302Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302Gerao de Relatrios . . . . . . . . . . . . . . . . . . . . . . . . . . . 302Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331

    10 Empacotando um sistema: Gerando discos de instalao. . . . 332Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349

    ndice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351

    XII

  • Prefcio

    Decidir que linguagem usar para se construir um sistema sempre foi um dos pri-meiros problemas enfrentados por qualquer empresa, no importa o seu portenem o tipo de sistema. Normalmente a escolha da linguagem determinada pelaplataforma, pela natureza do sistema e pela cultura da empresa. Em muitos casos,o uso de mltiplas linguagens se torna necessrio e ento logo surgem os proble-mas de integrao. A Microsoft .NET resolve este e muitos outros problemas.

    A Microsoft .NET uma plataforma para desenvolvimento de servios Webbaseados em XML. Essa , na verdade, uma definio muito simplista. Comoplataforma, a .NET vai muito alm de servios Web. A Microsoft .NET vai per-mitir desenvolver qualquer tipo de aplicao usando a linguagem de sua prefe-rncia. C#, Visual Basic.NET, C++, COBOL, Perl, Fortran, Pascal so apenasalgumas das linguagens suportadas na plataforma .NET, que no apenas permiteo uso de mltiplas linguagens, mas tambm a completa e perfeita integrao en-tre componentes desenvolvidos em linguagens diferentes. Por exemplo, poss-vel acessar objetos desenvolvidos em C# a partir de um programa escrito emCOBOL.

    Embora seja possvel usar vrias linguagens na plataforma .NET, C# aque-la que deve sempre ser considerada em primeiro lugar. As razes so simples: oC# oferece o mesmo poder que o C++ e a mesma facilidade de programaoque o Visual Basic, alm de ser a linguagem nativa para a nova plataforma da Mi-crosoft. At pouco tempo atrs, eu usava o C++ para programas de baixo nvel(usando sockets e threads, por exemplo); o Visual Basic era usado para criar jane-las e acessar bancos de dados. Hoje, tudo isso pode ser feito usando apenas umalinguagem o C#.

    O C# oferece poder, facilidade, flexibilidade e a linguagem nativa para aplataforma .NET. O C# resolve o abismo entre as linguagens de baixo nvel ealto nvel. O C# a linguagem que vai garantir seu sucesso na revoluo que aMicrosoft vem prometendo. Este livro vai apresentar o leitor tanto plataforma.NET quanto linguagem C#.

    Foi com grande prazer que aceitei o convite dos autores para escrever esteprefcio. Conheci Edwin na Paraba, quando ramos ainda estudantes da UFPB.No acredito que j faz tanto tempo! Trabalhamos juntos no nosso primeiro sis-tema comercial, um home banking, um dos primeiros do Brasil. Alguns anos de- XIII

  • pois, conhecemos Eugnio, o senhor dos certificados, ento consultor de umagrande empresa de telecomunicaes, na qual tivemos a oportunidade de traba-lhar num sistema desafiador que durou cerca de dois anos e envolveu uma equipede aproximadamente 15 pessoas. Nesse meio tempo, tambm pudemos jogarmuitas partidas de xadrez, congregar as famlias e contar muitas piadas duranteos cafezinhos.

    Jos Edvaldo SaraivaSoftware Design Engineer

    * Jos Edvaldo Saraiva foi desenvolvedor e consultor de sistemas distribudos em empresas de tele-comunicao pelo Brasil afora. Hoje trabalha em Redmond, Estados Unidos, como Software De-sign Engineer para uma das maiores empresas do mundo.XIV

  • PARTE

    IFundamentos de C# .Net

  • 1A plataforma .NET

    Introduo.NET a nova plataforma de desenvolvimento da Microsoft que tem como focoprincipal o desenvolvimento de Servios WEB XML. Um servio Web XML, ousimplesmente Web Service como o chamaremos de aqui em diante por simplici-dade e coerncia com a linguagem da indstria de software, transcende ao quens conhecemos como pginas dinmicas, as quais podem ser acessadas a partirde um browser. A idia central de um Web Service consiste em permitir que asaplicaes, sejam elas da Web ou Desktop, ou ainda middleware, se comuni-quem e troquem dados de forma simples e transparente, independente do siste-ma operacional ou da linguagem de programao.

    Para tal fim, no preciso apenas uma plataforma para desenvolvimentoWeb como o ASP ou CGI, ou ento, um modelo de objetos (COM) para criarcomponentes de software reusveis. A idia de um Web Service oferecer umasoluo uniforme, independente do cliente que estiver solicitando um servioqualquer: uma pgina dinmica (ASP, CGI, JSP), um cliente gordo no desktop,ou simplesmente um programa qualquer de terceiros que requeira o servio, umcelular, um handheld, no importa. O que interessa que todos os clientes pos-sam usufruir do mesmo servio. Vamos tentar entender o que descrevemos aquiatravs da Figura 1.1.

    Pelo exposto acima, toda uma nova plataforma de desenvolvimento, o queenvolve linguagens de programao, compiladores, modelo de objetos etc., setorna necessria para que consiga englobar de uma forma completamente inte-grada todos esses requisitos. E essa a proposta de .NET.

    A linguagem C# (pronuncia-se C Sharp) faz parte desse conjunto de ferra-mentas oferecidas na plataforma .NET e surge como uma linguagem simples, ro- 3

  • busta, orientada a objetos, fortemente tipada e altamente escalvel a fim de per-mitir que uma mesma aplicao possa ser executada em diversos dispositivos dehardware, independentemente destes serem PCs, handhelds ou qualquer outrodispositivo mvel. Alm do mais, a linguagem C# tambm tem como objetivopermitir o desenvolvimento de qualquer tipo de aplicao: Web service, aplica-o Windows convencional, aplicaes para serem executadas num palmtop ouhandheld, aplicaes para Internet etc.

    Figura 1.1

    Junto linguagem C# encontramos outras linguagens paralelas da prpriaMicrosoft e que tm tambm a finalidade de dar suporte ao desenvolvimento desistemas para a plataforma .NET; dentre elas podemos citar: VB.NET (VISUALBASIC .NET), JSCRIPT.NET, MANAGED C++.

    Neste captulo, apresentaremos ao leitor a arquitetura da plataforma .NET afim de que possa entender onde C# se encaixa nesta plataforma e por que, a des-peito da existncia de outras linguagens, inclusive aquelas que tambm do su-porte a .NET, C# to importante.

    Atuais dificuldades encontradas nodesenvolvimento de sistemas para WindowsAlgumas das dificuldades encontradas hoje em dia no desenvolvimento de siste-mas so:

    Complexidade associada a linguagens de programao de difcil sintaxe, eainda as dores de cabea provocadas pelo gerenciamento da memriaheap por parte do programador.

    Pouca integrao e reaproveitamento de cdigo entre linguagens de pro-gramao diferentes; ausncia de implementao de mecanismo de heran-a entre linguagens diferentes, por exemplo.4

    Laptop

    IBM PC ou compatvel

    Estao de trabalho

    Servio Web

    Servidor

    Servidor

    Servidor

  • Diversidade com pouca integrao na resoluo de problemas complexos,dificultando a compreenso e o desenvolvimento dos sistemas.

    Falta de portabilidade de cdigo executvel entre plataformas diferentes.

    Vejamos a evoluo histrica das ferramentas da Microsoft:

    Figura 1.2

    Apenas para ilustrar um pouco a situao atual, vamos apresentar um peque-no estudo de caso. Para simplificar o nosso problema, vamos considerar apenasas solues Microsoft. Imaginemos uma situao hipottica na qual solicitadauma soluo de home banking que aceite requisies de um browser da Internetou qualquer outro dispositivo como handheld, telefone celular etc.; vejamosqual seria a resposta imediata dos recursos de software que eu iria precisar:

    1. Uma linguagem de programao para desenvolver as pginas dinmi-cas: de cara, VBScript ou JScript.

    2. Precisamos desenvolver alguns objetos COM ou COM+ no servidor,mas por questes de performance e poder de linguagem, escolhemos alinguagem C++, e claro, o compilador MS Visual C++.

    3. Vamos precisar de alguns componentes para executar no MS Queueserver ou ento no MS transaction server, e escolhemos a linguagemVisual Basic porque temos pessoal que j fez esse tipo de trabalho usan-do VB.

    4. Bem, vamos falar o bvio, mas precisamos tambm de Web designerscom domnio de HTML, Flash, ferramentas de editorao grfica etc. 5

    Altair Basic(1976)

    MS-DOS BASIC(1981)

    WindowsVisual Basic

    (1990 )

    Internet(1995)

    NET XMLWeb Services

    (2000)

  • 5. Ainda temos um problema para resolver, que o fato de termos clientesheterogneos que no conseguem ler um formato padro como umaWeb page em HTML.

    Ok, agora o momento de correr atrs do pessoal com todos esses skills,tentar gerenciar essa salada de tecnologias e linguagens de programao e, dequebra, fazer funcionar tudo direitinho logo de primeira (a pedir demais!).Brincadeiras parte, esta a atual situao do desenvolvimento de software: terde costurar uma srie de linguagens + ferramentas + tecnologias + modelos deobjetos + linguagens de script vs. linguagens de programao completas + lin-guagens de marcao. Vou lhe propor uma soluo, ok? Aqui vai:

    1. Uma linguagem de programao para desenvolver as pginas dinmicasno servidor Web: C# usando o Visual Studio .NET.

    2. Uma linguagem de programao para desenvolver os meus objetosCOM+ no servidor: C# claro.

    3. Uma linguagem de marcao malevel o suficiente de sorte que permitamostrar o contedo em diversos dispositivos: XML.

    4. Todo o trabalho de formatao e transformao dos documentos XMLgerados pela soluo de homebank ser feito usando XSL para gerar alinguagem de marcao suportada no lado cliente. Ah! Com que lingua-gem vamos fazer estas transformaes? Com C# claro!

    Mas de cara voc vem e me diz: olha, sua soluo parece at bonitinha, maseu sinto lhe dizer que os nossos desenvolvedores tm um background muito forteem VB, de forma que ns descartamos o C# como alternativa. Rapidinho sempensar eu respondo a voc: no tem problema, tudo o que foi dito acima conti-nua vlido, vamos mudar apenas a linguagem de C# para VB.NET.

    A .NET permite que usemos a linguagem de programao da qual mais temosdomnio e mesmo assim continuamos a usufruir todo o seu potencial.

    O exemplo anterior foi apenas para ilustrar o contexto atual de desenvolvi-mento de sistemas complexos, onde temos de realmente fazer uma ginstica mui-to grande integrar todas as partes constituintes da nossa soluo. A boa notcia que, como mostramos no exemplo, com .NET esta situao est, digamos assim,findando esse problema, porque, como voc pode ter percebido, a sua soluocaiu de trs linguagens de programao para apenas uma, e o resto das tecnolo-gias que usamos (COM+, por exemplo) se integra perfeitamente com o restanteda soluo.

    Apenas falando no quesito da clareza e reutilizao de cdigo, algumas biblio-tecas de classes, como MFC (Microsoft Foundation Class), surgem nesse nte-rim, mas tm como foco a linguagem C/C++ e no podem ser usadas a partir do6

  • Power Builder, por exemplo, ou ento Delphi, que tem a sua prpria bibliotecade componentes reutilizveis. O que equivale a dizer que essas bibliotecas nopodem ser usadas a partir de qualquer linguagem de programao, o que torna oreaproveitamento de cdigo ainda mais difcil.

    Mesmo tecnologias como COM e CORBA sempre apresentam os mesmos pro-blemas de dificuldade de aprendizado por causa de sua complexidade; ou ento,mesmo quando oferecem um modelo de objetos comum a ser usado por outras lin-guagens que no VB ou C++, acabam esbarrando no fato de que cada linguagem deprogramao implementa os tipos de uma forma diferente. E finalmente, quandoachamos que conseguimos resolver o problemas dos tipos, somos barrados porqueno conseguimos implementar relaes de herana entre linguagens diferentes.

    Paralelamente s iniciativas da Microsoft, em 1995 surge a linguagem JAVA(na verdade, mais que uma linguagem, uma plataforma de desenvolvimento) e,apesar de oferecer h mais de cinco anos a proposta de portabilidade de cdigoexecutvel, (leia-se, compile uma vez e rode em qualquer plataforma), tem fi-cado restrita ao desenvolvimento de sistemas de middleware, de pginas da Webdinmicas JSP e applets. E mais ainda, JAVA-cntrica, o que obriga o progra-mador a aprender uma nova linguagem se realmente quiser usufruir os recursosque ela oferece. Mas voc pode perguntar: e .NET no nos obriga a aprenderC#? A resposta no e saberemos mais adiante como isso feito.

    A abordagem .NETCitaremos a seguir algumas das caractersticas de .NET que visam a resolver osproblemas citados acima:

    Independncia de linguagem de programao: o que permite a implemen-tao do mecanismo de herana, controle de excees e depurao entrelinguagens de programao diferentes.

    Reutilizao de cdigo legado: o que implica em reaproveitamento de c-digo escrito usando outras tecnologias como COM, COM+, ATL, DLLs eoutras bibliotecas existentes.

    Tempo de execuo compartilhado: o runtime de .NET compartilha-do entre as diversas linguagens que a suportam, o que quer dizer que noexiste um runtime diferente para cada linguagem que implementa .NET.

    Sistemas auto-explicativos e controle de verses: cada pea de cdigo.NET contm em si mesma a informao necessria e suficiente de formaque o runtime no precise procurar no registro do Windows mais infor-maes sobre o programa que est sendo executado. O runtime encontraessas informaes no prprio sistema em questo e sabe qual a verso a serexecutada, sem acusar aqueles velhos conflitos de incompatibilidade aoregistrar DLLs no Windows.

    Simplicidade na resoluo de problemas complexos. 7

  • A Arquitetura .NET

    Para melhor entendermos tudo o que temos dito at aqui, vamos falar um poucoda arquitetura de .NET e os seus principais componentes.

    CLR (Commom Language Runtime)

    O CLR, ou tempo de execuo compartilhado, o ambiente de execuo dasaplicaes .NET. Como o leitor j deve ter atentado, as aplicaes .NET no soaplicaes Win32 propriamente ditas (apesar de executarem no ambiente Win-dows), razo pela qual o runtime Win32 no sabe como execut-las. O Win32,ao identificar uma aplicao .NET, dispara o runtime .NET que, a partir dessemomento, assume o controle da aplicao no sentido mais amplo da palavra,porque, dentre outras coisas, ele quem vai cuidar do gerenciamento da mem-ria via um mecanismo de gerenciamento de memria chamado Garbage Collec-tor (GC) ou coletor de lixo, acerca do qual falaremos mais tarde. Esse gerencia-mento da memria torna os programas menos susceptveis a erros. Mais ainda, oCLR como seu prprio nome o diz, compartilhado e, portanto, no temos umruntime para VB.NET, outro para C# etc. o mesmo para todo mundo.

    CTS (Common Type System)

    O CTS, ou Sistema Comum de Tipos, que tambm faz parte do CLR, define os ti-pos suportados por .NET e as suas caractersticas. Cada linguagem que suporta.NET tem de, necessariamente, suportar esses tipos. Apesar de que a especifica-o no demanda que todos os tipos definidos no CTS sejam suportados pela lin-guagem, esses tipos podem ser um subconjunto do CTS, ou ainda um supercon-junto. No Captulo 2 falaremos mais a respeito dos diferentes tipos especificadosno CTS. Um conjunto de classes bsicas que define todos os tipos implementa-do na CTS. Por exemplo: um tipo Enum deve derivar da classe System.Enum etodas as linguagens devem implementar o tipo Enum dessa forma. Todo tipo de-riva da classe Object, porque em .NET tudo um objeto e, portanto, todos os ti-pos devem ter como raiz essa classe. E dessa forma que os diversos tipos nas di-versas linguagens so implementados, obedecendo s regras definidas no CTS.

    Na .NET, e em C# conseqentemente, todos os tipos derivam de uma raiz co-mum: a classe Object, o que equivale a dizer que todos os tipos so objetos,por definio.

    CLS (Common Language Specification)

    O CLS, ou Especificao Comum da Linguagem, um subconjunto do CTS, e de-fine um conjunto de regras que qualquer linguagem que implemente a .NETdeve seguir a fim de que o cdigo gerado resultante da compilao de qualquer8

  • pea de software escrita na referida linguagem seja perfeitamente entendido peloruntime .NET. Seguir essas regras um imperativo porque, caso contrrio, umdos grandes ganhos do .NET, que a independncia da linguagem de programa-o e a sua interoperabilidade, fica comprometido.

    A grosso modo, dizer que uma linguagem compatvel com o CLS significadizer que mesmo quando esta sintaticamente diferente de qualquer outra queimplemente .NET, semanticamente ela igual, porque na hora da compilaoser gerado um cdigo intermedirio (e no cdigo assembly dependente da ar-quitetura do processador) equivalente para duas peas de cdigo iguais, pormescritas em linguagens diferentes. importante entender esse conceito para nopensar que o cdigo desenvolvido em C# no pode interagir com cdigo desen-volvido em VB ou outras linguagens, porque mesmo estas sendo diferentes, to-das so compatveis com o CLS.

    BCL (Base Classe Library)

    Como era de se esperar, uma plataforma que promete facilitar o desenvolvimen-to de sistemas precisa ter uma biblioteca de classes bsica que alavanque a simpli-cidade e a rapidez no desenvolvimento de sistemas. este o objetivo da BCL (Bi-blioteca de Classes Base), oferecer ao desenvolvedor uma biblioteca consistentede componentes de software reutilizveis que no apenas facilitem, mas tambmque acelerem o desenvolvimento de sistemas.

    Na BCL encontramos classes que contemplam desde um novo sistema dejanelas a bibliotecas de entrada/sada, grficos, sockets, gerenciamento da me-mria etc.

    Esta biblioteca de classes organizada hierarquicamente em uma estruturaconhecida como namespace. Ao desenvolver um componente de software reus-vel, este precisa ser estruturado em um namespace para que possa ser usado apartir de um outro programa externo. A seguir mostramos uma tabela com al-guns dos principais namespaces que fazem parte da BCL:

    Alguns namespaces .NET

    System Contm algumas classes de baixo nvel usadas paratrabalhar com tipos primitivos, operaesmatemticas, gerenciamento de memria etc.

    System.Collections Pensando em implementar suas prprias pilhas, filhas,listas encadeadas? Elas j foram implementadas e seencontram aqui.

    System.Data,System.Data.Commom,System.Data.OleDb,System.Data.SqlClient

    Aqui voc vai encontrar tudo o que necessrio paralidar com bases de dados e, como de se esperar,voc encontrar ADO.NET aqui.

    9

  • Alguns namespaces .NET

    System.Diagnostics Log de Event, medio de performance, classes paragerenciamento de processos, depurao e mais vocpoder encontrar neste namespace.

    System.Drawing e namespacesderivados

    A .NET oferece uma biblioteca de componentes paratrabalhar com grficos, chamada GDI+, que seencontra neste namespace.

    System.IO Biblioteca para lidar com entrada e sada,gerenciamento de arquivos etc.

    System.NET Aqui voc encontra bibliotecas para programao deredes, sockets etc.

    System.Reflection Em .NET voc pode gerar cdigo em tempo deexecuo, descobrir tipos de variveis etc. Asbibliotecas necessrias para isso encontram-se nestenamespace.

    System.Runtime.InteropServicese System.Runtime.Remoting

    Fornecem bibliotecas para interagir com cdigono-gerenciado.

    System.Security Criptografia, permisses e todo o suporte ao qual .NEToferece a segurana voc encontra aqui.

    System.Threading Bibliotecas necessrias para o desenvolvimento deaplicaes multithread.

    System.Web ASP.NET, Web services e tudo o que tenha a ver comWeb pode ser encontrado aqui.

    System.Windows.Forms Bibliotecas para o desenvolvimento de aplicaesWindows tradicionais.

    System.XML Bibliotecas que permitem a interao comdocumentos XML.

    Como o temos dito at o momento, a arquitetura da plataforma .NET ilus-trada na Figura 1.3:

    Compilando programas .NET: introduzindo a linguagemintermediria MSIL (Microsoft Intermediate Language)A MSIL ou simplesmente IL a linguagem intermediria para qual interpre-tado qualquer programa .NET, independente da linguagem em que este for es-crito. Essa traduo feita para cdigo intermedirio (como em JAVA com osbyte codes) sintaticamente expresso na IL. Por sua vez, qualquer linguagem .NETcompatvel, na hora da compilao, gerar cdigo IL e no cdigo assembly es-pecfico da arquitetura do processador onde a compilao do programa efetua-10

  • da, conforme aconteceria em C++ ou Delphi, por exemplo. E por que isso? Issoacontece para garantir duas coisas: a independncia da linguagem e a indepen-dncia da plataforma (arquitetura do processador).

    Figura 1.3

    A MSIL a linguagem intermediria para qual interpretado qualquer pro-grama .NET na hora da compilao, independente da linguagem em que estefor escrito.

    Pelo dito acima, podemos afirmar que .NET, apesar de inicialmente estarsendo desenhada para a plataforma Microsoft, uma arquitetura portvel tantoem termos de linguagem de programao quanto no nvel da arquitetura do pro-cessador, dado que o cdigo gerado pode ser interpretado para a linguagem as-sembly da plataforma host na hora da execuo, sem necessidade de recompila-o de cdigo-fonte. Veja o cdigo a seguir em VB.NET:

    Import SystemPublic Module AppPontoNet

    Sub Main( )Console.WriteLine("Ol mundo em VB.NET")

    End SubEnd Module

    E agora vejamos o mesmo cdigo escrito em C#:

    using system;public class AppPontoNet{

    public class static void Main( ){

    Console.WriteLine("Ol mundo em C#");}

    } 11

    Arquitetura .NET

    Common Language Runtime

    Common Type System Common Language Specification

    Base Class Library (BCL)

    Linguagens de programao

  • Os dois trechos de cdigo acima, escritos em VB e C# respectivamente, ape-sar de serem sintaticamente diferentes, quando traduzidos para IL tm como re-sultado o mesmo cdigo intermedirio (no mostraremos o cdigo IL porqueeste assunto foge ao escopo do nosso livro).

    Como uma aplicao .NET executada pelo Runtime

    Para podermos falar sobre este assunto vamos introduzir alguns conceitos essen-ciais para a compreenso da execuo de um aplicativo .NET.

    Tempo de Compilao

    Entende-se por tempo de compilao a parte do processo de compilao que dizrespeito gerao de cdigo em MSIL (linguagem intermediria) e de informa-es especficas da aplicao necessrias para a sua correta execuo. Mas ondeestas informaes so armazenadas? Como resposta a esta pergunta vamos intro-duzir o conceito de METADATA ou metadados.

    METADADOS

    So um conjunto de instrues geradas no processo de compilao de qualquerprograma .NET, junto com a MSIL, que contm as seguintes informaes espec-ficas da aplicao:

    A descrio dos tipos (classes, estruturas, tipos enumerados etc.) usados naaplicao, podendo esta ter sido gerada em forma de DLL ou de executvel

    A descrio dos membros de cada tipo (propriedades, mtodos, eventos etc.)

    A descrio de cada unidade de cdigo externo (assembly) usada na aplica-o e que requerida para que esta execute adequadamente

    Resoluo da chamada de mtodos

    Resoluo de verses diferentes de uma aplicao

    Dada a informao contida nos METADADOS, podemos dizer que umaaplicao .NET auto-explicativa, dispensando a utilizao do registro do Win-dows para armazenar informaes adicionais a seu respeito. Mais ainda, nosMETADADOS armazenada a verso da aplicao, o que permite que duas apli-caes, mesmo sendo homnimas, possam conviver amigavelmente sem gerarconflitos de verso no sistema hospedeiro. Falaremos mais a esse respeito quan-do abordarmos a discusso de assemblies e namespaces.

    O CLR vai procurar nos METADADOS a verso correta da aplicao a serexecutada. Esse um ganho muito grande no que diz respeito implementao emanuteno de sistemas em produo, dadas as dificuldades associadas manu-teno de DLLs e de componentes cujas verses so diferentes, mas cuja convi-12

  • vncia no mesmo ambiente necessria por razes de compatibilidade com ou-tros aplicativos que precisam de uma ou de outra DLL.

    ASSEMBLY

    Toda aplicao .NET, quando compilada, armazenada fisicamente numa uni-dade de cdigo denominada assembly. Uma aplicao pode ser composta de umou mais assemblies, os quais so representados no sistema de arquivos do sistemaoperacional host na forma de arquivos executveis, de extenso .EXE, ou deuma biblioteca de ligao dinmica melhor conhecida como DLL, e obviamentede extenso .DLL.

    PE (Portable Executable)

    Quando um aplicativo compilado, so geradas instrues em IL. Como j disse-mos acima, METADADOS com informaes da aplicao tambm so gerados,e obviamente armazenados na forma de uma DLL ou de um arquivo executvel.Isso conhecido como Executvel Portvel (Portable Executable) ou simples-mente PE. Diz-se portvel porque ele poder ser executado em qualquer plata-forma que suporte .NET, sem necessidade de recompilao, operao que serefetuada automaticamente pelo runtime quando da execuo da aplicao.

    Compilao JIT (Just In Time)

    Um compilador JIT, tambm conhecido como JITTER, converte instrues ILpara instrues especficas da arquitetura do processador onde a aplicao .NETest sendo executada. Na plataforma .NET existem trs diferentes tipos deJITTER:

    Pr-JIT: Compila de uma s vez todo o cdigo da aplicao .NET que estsendo executada e o armazena no cache para uso posterior.

    Econo-JIT: Este tipo de compilador usado em dispositivos como hand-helds onde a memria um recurso precioso. Sendo assim, o cdigo compilado sob demanda, e a memria alocada que no est em uso libe-rada quando o dispositivo assim o requer.

    Normal-JIT: O Normal-JIT compila o cdigo sob demanda e coloca o c-digo resultante no cache, de forma que esse cdigo no precise ser recom-pilado quando houver uma nova invocao do mesmo mtodo.

    VES (Virtual Execution System)

    O processo de compilao acontece num ambiente chamado de Sistema de Exe-cuo Virtual (VES), e aqui onde o JITTER ativado quando uma aplicao.NET chamada. O JITTER ativado a partir do runtime do Win32, passando o 13

  • controle para o runtime .NET; aps isso, a compilao do PE efetuada e s en-to o cdigo assembly prprio da arquitetura do processador gerado para que aaplicao possa ser executada.

    O diagrama a seguir ilustra todo o processo de execuo de uma aplicao,desde a gerao das instrues IL em tempo de compilao, at a gerao do c-digo assembly especfico da plataforma de execuo.

    Figura 1.4

    Gerenciamento da memria:introduzindo o GC (Garbage Collector)O gerenciamento da memria efetuado pelo runtime, permitindo que o de-senvolvedor se concentre na resoluo do seu problema especfico. O que dizrespeito ao sistema operacional, como o gerenciamento da memria, feitopelo runtime.

    Como isso efetuado? medida que uma rea de memria necessria paraalocar um objeto, o GC ou coletor de lixo (Garbage Collector) realizar essa ta-refa, assim como a liberao de espaos de memria que no estiverem mais em14

    C# VB C++

    Compilador Compilador Compilador Compilador

    MSIL

    Compilador JIT

    Cdigo nativogerenciado

    Execuo

    CLR

    Pentium III MIPS Mobile

  • uso. Para os que no trabalham com linguagens de programao como C ouC++, que permitem o acesso direto memria heap via ponteiros, essa umadas maiores dores de cabea que os programadores sofrem, ora por fazer refern-cia a espaos de memria que no foram alocados, ora porque estes espaos j fo-ram liberados anteriormente; exatamente esse tipo de erro que o coletor delixo nos ajuda a evitar. O gerenciamento da memria, quando efetuado direta-mente pelo programador, torna os programas mais eficientes em termos de de-sempenho, mas ao mesmo tempo o penaliza, obrigando-o a alocar e desalocarmemria quando assim requerido. A .NET permite que o programador faaesse gerenciamento tambm, o que chamado de unsafe code (cdigo insegu-ro); entretanto, por default, o GC o encarregado dessa tarefa, e o contrrio no recomendado.

    Linguagens que suportam .NET

    Dentre as linguagens que suportam .NET podemos citar:

    C# ( claro!)

    C++

    Visual Basic

    Jscript

    Cobol

    Small Talk

    Perl

    Pascal

    Phyton

    Oberon

    APL

    Haskell

    Mercury

    Scheme

    CAML

    OZ

    Conforme descrito acima, todas essas linguagens tm de aderir s especifica-es CLS e CTS para poderem ser compatveis com .NET. 15

  • A necessidade de uma nova linguagemFinalmente, para fechar a discusso sobre a arquitetura da plataforma .NET,como voc j deve estar se perguntando, por que a necessidade de uma nova lin-guagem? Este um assunto que tem gerado uma ampla discusso no apenas nonvel tcnico ou de engenharia de software em si, como tambm no nvel de mer-cado (afinal algum tem de pagar a conta, no ?). At certo ponto fcil conven-cer pessoas tcnicas como voc ou eu a usar uma nova linguagem ou tecnologiaquando tecnicamente for provado que teremos ganhos considerveis em relaoao que j existe no mercado, mas as implicaes de se acrescentar uma nova lin-guagem ao parque tecnolgico instalado numa corporao so srias. Afinal,ser necessrio investir em treinamentos e reciclagem de pessoal para essa novalinguagem, ou pior ainda, em contratao de mo de obra especializada que co-nhea essa nova linguagem.

    Ainda, o fato de seu gerente convencer o CIO da empresa de que essa novalinguagem trar ganhos significativos no desenvolvimento de sistemas no expli-ca como os sistemas que j foram desenvolvidos usando outras linguagens deprogramao devero ser mantidos. Isso implica necessariamente que uma parteda equipe de desenvolvedores ter de cuidar do suporte, manutenes evolutivasou corretivas dos sistemas existentes, enquanto outra parte da equipe ter de cui-dar do desenvolvimento de sistemas na nova linguagem.

    A resposta para esse problema razoavelmente simples: a .NET no obriga odesenvolvedor a mudar a linguagem de programao que j usa na corporao;outrossim, permite que a migrao para .NET seja indolor, suave, a partir do mo-mento que o programador poder continuar a usar a linguagem na qual ele j experiente.

    Mas voc ainda deve estar se perguntando: por que a necessidade de umanova linguagem? A proposta do C# em termos de linguagens de programaopoderia ser descrita esboando algumas das suas caractersticas principais:

    Clareza, simplicidade e facilidade: C# clara, simples, fcil de aprender,mas nem por isso menos poderosa.

    Completamente orientada a objetos: C#, diferentemente de muitas lin-guagens existentes no mercado, completamente orientada a objetos. EmC#, tudo um objeto.

    No requer ponteiros para gerenciar a memria: C# no requer ponteirospara alocar/desalocar memria heap. Esse gerenciamento, como dissemosacima, feito pelo GC (Garbage Collector).

    Suporta interfaces, sobrecarga, herana, polimorfismo, atributos, proprie-dades, colees, dentre outras caractersticas essenciais numa linguagemque se diz orientada a objetos.

    Cdigo 100% reutilizvel: Todo programa desenvolvido em C# passvelde reutilizao a partir de qualquer outra linguagem de programao.16

  • A proposta de C# adiciona babel das linguagens de programao o que demelhor encontramos em tcnicas de desenvolvimento nas principais lingua-gens de hoje.

    .NET e JAVAMuito se fala que a .NET chegou ao mercado para concorrer pelo espao ocupa-do pela linguagem JAVA. Em certo sentido isso verdade, principalmente noque diz respeito ao desenvolvimento de Web Services e aplicaes Web ServerSide (do lado servidor). Entretanto, consideramos que .NET vai mais alm aoviabilizar o desenvolvimento de aplicaes que no se limitam ao middleware,mas que se estende tambm ao desenvolvimento de aplicaes de Front End(desktop). Alm do mais, a .NET d suporte nativo a XML para qualquer aplica-tivo de qualquer natureza desenvolvido em .NET.

    JAVA, que no apenas uma linguagem de programao mas sim uma plata-forma de desenvolvimento, peca pelo fato de ser centralizada na linguagemJAVA. Como j falamos ao longo deste captulo, a .NET no tem como centro alinguagem de programao e sim a interoperabilidade de linguagens e a portabi-lidade multiplataforma.

    Para os programadores JAVA, a boa notcia que a Microsoft est trabalhan-do tambm em uma verso do JAVA com suporte a .NET, algo conhecido comoJ# (leia-se J-Sharp).

    Quando usar a .NET?Como conseqncia do que foi dito acima, a .NET se adapta perfeitamente aodesenvolvimento do seguinte tipo de aplicaes:

    Aplicaes clientes de front end

    Aplicaes de middleware: Web services, aplicaes do lado servidor(ASP.NET, SOAP, Web Services e XML)

    Aplicaes para internet: a .NET fornece bibliotecas especializadas para odesenvolvimento de aplicaes para Internet suportando os protocolosmais comuns: FTP, SMTP, HTTP, SOAP etc.

    Aplicaes grficas: via a biblioteca GDI+, a .NET d suporte completo aesse tipo de aplicaes.

    Acesso a bancos de dados via ADO.NET: ADO.NET uma evoluo datecnologia ADO usada amplamente no desenvolvimento de sistemaspara bancos de dados. Entretanto, novas caractersticas so encontradasnessa nova biblioteca, como manipulao de dados na aplicao cliente,como se esta estivesse sendo manipulada no servidor. Isso implica emaplicaes connectionless (sem conexo) com vistas a no degradar odesempenho do servidor de banco de dados, quando este est servindo 17

  • milhares de conexes simultaneamente. Ideal para desenvolvimento deaplicaes OLTP, no ?

    Aplicaes multitarefa: a biblioteca System.Thread d suporte ao desen-volvimento de aplicaes multitarefa. E muito mais!

    Neste livro, vamos explorar o potencial da .NET no desenvolvimento de apli-caes Windows tradicionais usando as bibliotecas Windows Forms e ADO.NET,porque consideramos que mesmo sendo a .NET orientada ao desenvolvimento deservios Web XML, a sua maior usabilidade acontecer no desenvolvimento dessetipo de aplicaes. De toda forma, haver tambm a abordagem de XML.

    Ambientes de Desenvolvimento .NETNo momento da elaborao deste livro, temos conhecimento da existncia dosseguintes ambientes de desenvolvimento para .NET:

    .NET SDK Framework: Este ambiente vem junto com o SDK .NET e ape-nas de linha de comando. Pode ser baixado do site da Microsoft.

    VISUAL STUDIO .NET (VS.NET): Este um ambiente de desenvolvimen-to da mesma famlia das verses do Visual Studio da Microsoft, mas ele completamente integrado com todas as linguagens s quais oferece supor-te: C#, VB, Jscript e Managed C++. Ainda possvel estender o suportedo VS.NET para outras linguagens que no so nativas a ele. Neste livro,nos basearemos neste ambiente para a apresentao dos exemplos. Enten-demos que a maioria dos desenvolvedores da plataforma Windows irus-lo e por isso achamos desnecessrio usar outros ambientes de desen-volvimento.

    C-SharpDevelop: Este ambiente de desenvolvimento da categoria OpenSource, possui algumas funcionalidades de IDE, mas ainda est em fase dedesenvolvimento e portanto ainda incompleto. Apesar de ser um bomproduto e ser gratuito, no chega ao nvel do VS.NET. O uso deste ambi-ente encorajado pela iniciativa Open Source .NET cujo nome MONO(http://www.go-mono.com), e cujo objetivo migrar a .NET para o am-biente Linux.

    18

  • 2A linguagem C#

    IntroduoAps termos falado sobre a plataforma .NET, queremos agora apresentar a lin-guagem C# nos seus mais diversos aspectos: sintaxe, tipos, declarao de vari-veis, classes, estruturas, mascaramento de tipos, passagem de parmetros etc.Neste captulo tambm ensinaremos a usar alguns dos namespaces bsicos da.NET e falaremos em detalhes da sintaxe de C# para podermos prosseguir comcaractersticas mais avanadas da linguagem.

    As caractersticas do C#Dentre as caractersticas essenciais do C# podemos citar:

    Simplicidade: os projetistas de C# costumam dizer que essa linguagem to poderosa quanto o C++ e to simples quanto o Visual Basic.

    Completamente orientada a objetos: em C#, qualquer varivel tem de fa-zer parte de uma classe.

    Fortemente tipada: isso ajudar a evitar erros por manipulao imprpriade tipos, atribuies incorretas etc.

    Gera cdigo gerenciado: assim como o ambiente .NET gerenciado, assimtambm o C#.

    Tudo um objeto: System.Object a classe base de todo o sistema de tiposde C#.

    Controle de verses: cada assembly gerado, seja como EXE ou DLL, teminformao sobre a verso do cdigo, permitindo a coexistncia de doisassemblies homnimos, mas de verses diferentes no mesmo ambiente. 19

  • Suporte a cdigo legado: o C# pode interagir com cdigo legado de obje-tos COM e DLLs escritas em uma linguagem no-gerenciada.

    Flexibilidade: se o desenvolvedor precisar usar ponteiros, o C# permite,mas ao custo de desenvolver cdigo no-gerenciado, chamado unsafe.

    Linguagem gerenciada: os programas desenvolvidos em C# executamnum ambiente gerenciado, o que significa que todo o gerenciamento dememria feito pelo runtime via o GC (Garbage Collector), e no direta-mente pelo programador, reduzindo as chances de cometer erros comunsa linguagens de programao onde o gerenciamento da memria feitodiretamente pelo programador.

    Ol Mundo: A estrutura bsica de uma aplicao C#

    O pequeno trecho de cdigo a seguir implementa o clssico programa Olmundo:

    using System;class AppPontoNet{

    static void Main( ){

    // escrevendo no consoleConsole.WriteLine("Ol mundo em C#");Console.ReadLine( );

    }}

    O Cabealho do programa

    A primeira linha do nosso programa, que escreve no console Ol mundo emC#, contm a informao do namespace System, que contm as classes pri-mitivas necessrias para ter acesso ao console do ambiente .NET. Para incluirum namespace em C#, utilizamos a clusula using seguida do nome do na-mespace.

    A declarao de uma classe

    O C# requer que toda a lgica do programa esteja contida em classes. Aps a de-clarao da classe usando a palavra reservada class, temos o seu respectivo iden-tificador. Para quem no est familiarizado com o conceito de classe, apenasadiantamos que uma classe um tipo abstrato de dados que no paradigma deprogramao orientada a objetos usado para representar objetos do mundoreal. No exemplo acima, temos uma classe que contm apenas o mtodo Main( )e no recebe nenhum parmetro.20

  • O Mtodo Main( )

    Todo programa C# deve ter uma classe que defina o mtodo Main( ), que deveser declarado como esttico usando o modificador static, que diz ao runtimeque o mtodo pode ser chamado sem que a classe seja instanciada. atravs dessemodificador que o runtime sabe qual ser o ponto de entrada do programa noambiente Win32, para poder passar o controle ao runtime .NET.

    O M mausculo do mtodo Main obrigatrio, e seu valor de retorno voidsignifica que o mtodo no retorna nenhum valor quando chamado.

    Algumas variantes do mtodo Main( )

    // Main recebe parmetros na linha de comando via o array// argsstatic void Main(string[ ] args){

    // corpo do mtodo}

    // Main tem como valor de retorno um tipo int

    static int Main( ){

    // corpo do mtodo}

    A forma do mtodo Main( ) a ser usada vai depender dos seguintes fatores:

    O programa vai receber parmetros na linha de comando? Ento esses pa-rmetros sero armazenados no array args.

    Quando o programa finalizado, necessrio retornar algum valor ao sis-tema? Ento o valor de retorno ser do tipo int.

    Um programa escrito em C# pode ter mais de uma classe que implementa omtodo Main( ). Nesse caso, dever ser especificado em tempo de compilaoem qual classe se encontra o mtodo Main( ), que dever ser chamado pelo runti-me quando a aplicao for executada.

    Exemplo:

    using System;class class1{

    static void Main( ){

    Console.WriteLine("Mtodo Main( ) da classe 1");}

    } 21

  • class class2{

    static void Main( ){

    Console.WriteLine("Mtodo Main( ) da classe 2");}

    }

    O resultado da compilao deste programa :

    Class1.cs(6): Program 'C:\My Documents\Visual StudioProjects\twoMainMet\obj\Debug\twoMainMet.exe' has morethan one entry point defined: 'class1.Main( )'

    Class1.cs(15): Program 'C:\My Documents\Visual StudioProjects\twoMainMet\obj\Debug\twoMainMet.exe' has morethan one entry point defined: 'class2.Main( )'

    Dentro do ambiente de desenvolvimento VS.NET proceda da seguinte for-ma para resolver esse problema:

    1. Clique no menu Project e selecione a opo Properties.

    2. Clique na pasta Common Properties.

    3. Clique na opo General.

    4. Modifique a propriedade Startup Object, selecionando a classe quecontm o mtodo Main( ) que voc deseja que seja chamado pelo Runti-me quando a aplicao for executada.

    5. Clique em Ok e compile a aplicao de novo.

    Alguns ltimos detalhes adicionais

    Blocos de cdigo so agrupados entre chaves { }.

    Cada linha de cdigo separada por ponto-e-vrgula.

    Os comentrios de linha simples comeam com duas barras //. Coment-rios em bloco so feitos usando os terminadores /* (de incio) e */ (de fim).

    /*Este um comentrio de blocoSegue o mesmo estilo de C/C++*/

    O C# sensvel ao contexto, portanto int e INT so duas coisas diferen-tes. int uma palavra reservada que um alias do tipo System.Int32. INTpoderia ser um identificador, entretanto no recomendado usar comoidentificadores de variveis o nome de um tipo ou palavra reservada comono exemplo citado.22

  • Sempre declare uma classe onde todos os aspectos inerentes inicializaoda aplicao sero implementados, e obviamente, que conter o mtodoMain( ) tambm. No decorrer deste livro seguiremos fielmente essa regranos nossos exemplos.

    Interagindo com o console

    Toda linguagem de programao oferece meios de interagir com o console, paraler ou escrever na entrada (geralmente o teclado) e sada padro (normalmente ovdeo em modo texto). Em C#, temos uma classe chamada Console no namespa-ce System, a qual oferece uma srie de mtodos para interagir com a entrada esada padro. Vejamos alguns exemplos:

    public class stdInOut{

    static void Main( ){

    char c;string str;// Escreve no console sem retorno de carroConsole.Write("Digite seu nome: ");// L uma string do console. para concluirstr = Console.ReadLine( );// Escreve no console sem retorno de carroConsole.Write("Digite uma vogal e tecle :";// L do console um caractere simples.c = (char)Console.Read( );// Escreve uma linha em brancoConsole.WriteLine( );// Escreve uma string no consoleConsole.WriteLine("Seu nome : {0}", str);// Escreve 1 caractere com ToString( ) para converterConsole.WriteLine("Sua vogal: {0}", c.ToString( ));Console.ReadLine( );

    }}

    Como voc pode ver no exemplo acima, para escrever no console usamos osmtodos:

    Console.Write( ), para escrever uma string sem retorno de carro;

    Console.WriteLine( ), para escrever uma string com retorno de carro. Essastring pode ser parametrizada, o que significa que o contedo de variveispode ser mostrado no console. As variveis a serem mostradas comeam apartir do segundo parmetro e so separadas por vrgula. Na string do pri-meiro parmetro elas so representadas por nmeros inteiros, a comearpor zero, encerrados entre terminadores de incio { e de fim }. 23

  • Exemplo:

    Console.WriteLine("var1: {0}, var2: {1}, var3: {2}", var1, var2, var3);

    Para ler dados da entrada padro, usamos os seguintes mtodos:

    Read( ), para ler um caractere simples;

    ReadLine( ) para ler uma linha completa, conforme mostrado no exemploacima.

    Formatando a sada padro

    A formatao da sada padro feita usando os chamados caracteres de escape(veja a tabela abaixo). Vejamos um exemplo:

    // \t = TAB// \n = quebra de linha e retorno de carro (CR LF)Console.WriteLine( "var1: {0} \t var2: {1}\t var3: {2}\n", var1, var2, var3);

    Caractere deEscape

    Significado

    \n Insere uma nova linha

    \t TAB

    \a Dispara o som de um alarme sonoro simples

    \b Apaga o caractere anterior da string que est sendo escrita no console(backspace)

    \r Insere um retorno de carro

    \0 Caractere NULL (nulo)

    Recebendo parmetros na linha de comando

    Para receber parmetros na linha de comando, ou seja, na chamada de um pro-grama quando digitamos o nome do executvel no prompt da linha de comandodo DOS (como ScanDisk /All /AutoFix, por exemplo), o mtodo Main( ) preci-sa ser declarado da seguinte forma:

    // no retorna nenhum valor ao sistemastatic void Main(string[ ] args)

    ou,

    // retorna um valor do tipo int ao sistemastatic int Main(string[ ] args)

    O parmetro args um array de strings que recebe os parmetros passadosquando a aplicao chamada na linha de comando. A seguir mostramos umadas formas da varrer os parmetros recebidos:24

  • foreach (string cmd in args){

    int i = 0;Console.WriteLine("Par {0}: {1}", i, cmd);i++;

    }

    Para saber o nmero de argumentos que foram passados, usamos o mtodoLength( ) do array args da seguinte forma:

    numArgs = args.Length( );

    Quando na linha de comando so recebidos parmetros numricos, estes de-vem ser convertidos de string para o tipo numrico respectivo usando a classeConvert. Exemplo:

    Convert.ToInt32(varString)

    Variveis

    Em C#, todas as variveis so declaradas dentro do escopo de uma classe e po-dem ser dos seguintes tipos:

    Locais: so declaradas no escopo de um metdo, indexador ou evento eno possuem modificadores de acesso. A sua declarao se limita ao tiposeguido do identificador da varivel.

    Atributos de uma classe ou campos da classe: a varivel declarada comomembro de uma classe. A declarao deve ser efetuada como se segue:

    [Modificador de acesso] [tipo atributo]

    Exemplo:

    public class App{

    public int varInt;static void Main( ){

    int varLocal;}

    }

    O Sistema de Tipos em C#

    Em C#, todo tipo derivado da classe System.Object, que constitui o ncleo dosistema de tipos de C#. Entretanto, os projetistas da linguagem, e no apenas dalinguagem, mas de .NET como um todo, sabem perfeitamente das implicaes 25

  • de ter um sistema de tipos onde tudo um objeto: queda de desempenho. Pararesolver este problema, eles organizaram o sistema de tipos de duas formas:

    Tipos Valor: variveis deste tipo so alocadas na pilha e tm como classebase System.ValueType, que por sua vez deriva de System.Object.

    Tipos Referncia: variveis deste tipo so alocadas na memria heap e tma classe System.Object como classe base.

    Organizando o sistema de tipos, eles dividiram os tipos de tal forma que ape-nas os tipos referncia seriam alocados na memria heap, enquanto os tiposvalor iriam para a pilha. Tipos primitivos como int, float e char no precisamser alocados na memria heap, agilizando, assim, a sua manipulao.

    Veja na figura a seguir a hierarquia de tipos em C# e .NET:

    Figura 2.1

    Boxing e UnBoxing

    A razo de se criar uma origem comum de tipos para facilitar a interao entre ti-pos valor e referncia. O processo de converso explcita de um tipo valor para umtipo referncia conhecido em C# como Boxing (encaixotar). O processo contr-rio a Boxing conhecido como Unboxing. Nesse caso, o compilador verifica se otipo valor a receber o contedo do tipo referncia equivalente a este ltimo.

    No processo de Boxing, o que de fato est acontencendo que um novo obje-to est sendo alocado na memria heap e o contedo da varivel de tipo valor copiado para a rea de memria referenciada por esse objeto.

    Exemplo:int intNumero = 10;// Faz o boxing para o tipo referencia.Object objNumero = intNumero;

    // Faz o unboxing para o tipo valorint intValor = (int)objNumero;26

    System.Object

    Tipos valor

    EstruturasTipos

    enumerados

    Tiposreferncia

    Objeto Interfaces Ponteiros

  • Quando essa operao efetuada entre tipos que no so equivalentes, umaexceo gerada pelo runtime.

    Tipos ValorTipos valor no podem ser usados como classes base para criar novos tipos por-que estes so implementados usando classes chamadas seladas, a partir dasquais no possvel implementar o mecanismo de herana. Antes de serem usa-dos, os tipos valor devem ser inicializados, caso contrrio o compilador acusarum erro.

    Os tipos valor so subdivididos em duas categorias:

    1. Estruturas

    2. Enumerados

    EstruturasEstruturas so usadas para implementar tipos simples chamados de primitivosem outras linguagens de programao, so criadas na pilha e ainda oferecemmuito do potencial de uma classe a um custo menor. Os seguintes tipos so im-plementados usando estruturas:

    Tipos primitivos

    Numricos: inteiros, ponto flutuante e decimal

    Booleanos: verdadeiro e falso

    Tipos definidos pelo usurio: estruturas propriamente ditas que permi-tem que o usurio crie seus prprios tipos.

    Enumerados

    So usados para implementar listas de valores constantes, os quais podem ser dequalquer tipo inteiro (long, int etc.); porm no podem ser do tipo char. Cadaconstante tem um valor inteiro associado, o qual pode ser sobrescrito quando as-sim definido na lista enumerada. Os valores inteiros associados a cada constanteda lista enumerada comeam a partir de zero.

    Tipos RefernciaOs seguintes tipos referncia fazem parte do namespace System e derivam direta-mente do System.Object:

    class

    object 27

  • string

    delegate

    interface

    ClassesUma classe um tipo referncia e podemos defini-la como a implementao deum tipo abstrato de dados que modela objetos do mundo real.

    Uma classe define atributos e mtodos que implementam a estrutura de da-dos e as suas operaes, respectivamente.

    Classes so indispensveis em qualquer linguagem orientada a objetos. Nocaptulo seguinte falaremos em profundidade sobre o paradigma de programa-o orientada a objetos e como implementar sistemas orientados a objetos usan-do C#.

    Ao criarmos variveis cujo tipo uma classe, dizemos que estamos instan-ciando a classe, e por sua vez, instncias de classes so chamadas de objetos.

    A declarao de uma classe em C# como se segue:

    [modificador de acesso] class : [classe base]{// declarao de atributos e mtodos}

    Em C#, a implementao dos mtodos da classe inline, e portanto no exis-te declarao e implementao de mtodos separada.

    Exemplo:

    public class funcionario{

    private string nome ;private float salarioBruto ;private string funcID ;

    // Em C#, a implementao de mtodos Inline.

    public float CalcularSalarioLiquido (string ID){

    return salarioBruto * 0.9;}

    }

    28

  • Membros de uma classe

    Os membros de uma classe podem ser:

    Atributos

    Mtodos

    Propriedades

    Eventos

    Constantes

    Indexers

    Operadores

    Mais adiante falaremos com mais detalhes acerca de cada um dos membros.

    Membros estticos e membros instncias

    Os membros de uma classe podem ser classificados da seguinte maneira:

    Estticos: S podem ser chamados usando o identificador da classe, masno atravs das suas instncias, o que significa que podem ser chamadossem ter de se criar uma instncia da classe.

    Instncias: Os membros instncia no podem ser chamados sem antes terinstanciado a classe. Todos aqueles membros que no so precedidos domodificador static so entendidos como membros instncias.

    Os membros estticos podem ser classificados da seguinte maneira:

    Atributos estticos: Independente do nmero de instncias (objetos) quesejam criadas de uma classe, existe apenas uma nica cpia de um atributoesttico. Atributos estticos s podem ser modificados na classe atravs demtodos estticos. A tentativa de acessar um membro esttico via uma ins-tncia gera um erro em tempo de compilao. Da mesma forma, atributosinstncia s podem ser acessados via mtodos instncia.

    Funes membros estticas: Podem ser dos seguintes tipos:

    Mtodos

    Propriedades

    Eventos

    Construtores

    Exemplo:

    using System;

    class Class1 29

  • {// atributo esttico

    public static int total = 0;public int naoEstatico;

    // mtodo estticopublic static void inc( ){

    total++;}

    }

    class App{

    static public void Main( ){

    Console.WriteLine(Class1.total++);staticClass.inc( );

    Class1 cl1 = new Class1( );Console.WriteLine(Class1.total++);

    Class1 cl2 = new Class1( );Console.WriteLine(Class1.total);

    Console.ReadLine( );}

    }

    Na sada do console temos os seguintes resultados ao compilarmos o nossoexemplo:

    023

    A primeira chamada do atributo total bem-sucedida mesmo sem ter sidocriada uma instncia da classe staticClass. O mesmo acontece com a chamadado mtodo Main( ), que feita pelo runtime sem ter criado uma instncia da clas-se App. Podemos observar que mesmo depois de termos criado uma instncia daclasse, o atributo esttico continua a ser chamado via o identificador da classe; omesmo pode ser dito sobre o mtodo inc( ), que tambm esttico. A seguintechamada ilegal:

    Console.WriteLine(cl1.total);

    Voc pode testar fazer as chamadas dos membros estticos via a instncia daclasse para observar o resultado.30

  • Modificadores de Acesso

    Os modificadores de acesso dizem ao compilador a forma como um membro deuma classe pode ser acessado externamente quanto esta instanciada. Veja na ta-bela as seguir os modificadores e o seu significado:

    Modificador Tipo de acesso

    Public Membro visvel externamente aos usurios da classe assim como dassuas classes derivadas via mecanismo de herana.

    Protected Somente os membros da classe tm acesso e as classes derivadastm acesso via mecanismo de herana.

    Internal Acesso limitado ao assembly que contm a classe.

    Protected internal Acesso limitado ao assembly que contm a classe ou aos tiposderivados da classe.

    Private Acesso limitado aos membros da classe. No pode ser acessado defora da classe nem por classes derivadas via mecanismo de herana.

    Quando o modificador de acesso no especificado, o compilador assume omodificador default private.

    Exemplo:

    public int idade;// o modificador default private assumido neste casostring Nome;

    Atributos com o mesmo modificador de acesso e mesmo tipo podem seragrupados.

    Exemplo:

    public int a, b, c;

    Mtodos

    Os mtodos so os equivalentes das funes ou procedimentos na programaoestruturada. Entretanto, em C# os mtodos esto diretamente ligados a umaclasse e a sua declarao feita da seguinte forma:

    [modificador de acesso] [tipo do mtodo] ([lista de parmetros]){// implementao} 31

  • Alguns detalhes importantes sobre a declarao de mtodos:

    Os parmetros consistem em uma lista de variveis separadas por vrgula,cada um precedido pelo tipo da passagem de parmetro (ref ou out) mais otipo da varivel seguido do seu identificador.

    Um mtodo pode simplesmente no receber parmetros.

    Os mtodos podem ter variveis locais, as quais so declaradas na sua im-plementao.

    Exemplo:

    public void metodoTeste( ){

    int numero=0;numero++;

    }

    Passagem de parmetros por valor e por referncia

    Os mtodos podem receber parmetros de duas formas diferentes:

    Por valor: Na passagem por valor, uma cpia do parmetro criada na pi-lha local do mtodo, e mesmo que o parmetro seja modificado pelo m-todo, esta modificao no ser visvel fora dele.

    Por referncia: Se desejarmos que as modificaes efetuadas no parmetrosejam visveis externamente, podemos passar o parmetro por referncia,e neste caso no apenas uma cpia local criada, mas a referncia do par-metro na memria passada e qualquer modificao que este sofrer nomtodo ser visvel externamente. Para passar parmetros por refernciausamos a palavra reservada ref antes do tipo do parmetro.

    Quando no especificado o tipo de passagem do parmetro por default, apassagem por valor e no requer nenhum modificador adicional para talfim.

    Exemplo:

    using System;class teste{

    // Mtodo que recebe parmetros por valorpublic void metValor (int parametro){

    parametro++;Console.WriteLine(parametro);32

  • }static public void Main( ){

    int argValor = 10;teste class1 = new teste( );

    class1.metValor(argValor);Console.WriteLine(argValor);

    }}

    Veja a seguir a sada do programa no console:

    1110

    Voc pode perceber que o parmetro foi modificado no mtodo, mas quan-do retornou ao ponto do programa onde foi chamado, essas modificaes noforam visveis. Veja a seguir o mesmo exemplo onde o parmetro passado porreferncia.

    using System;

    class teste{

    public void metRef (ref int parametro){

    parametro++;Console.WriteLine(parametro);

    }

    }

    class App{

    public static void Main( ){

    int parRef = 10;teste class1 = new teste( );

    class1.metRef(ref parRef);Console.WriteLine(parRef);Console.ReadLine( );

    }}

    O mesmo programa que usamos no exemplo anterior agora tem a seguintesada:

    33

  • 1111 o valor de argumento foi de fato alterado!

    Parmetros de sada: OUT

    Mas o que aconteceria se quisssemos passar um parmetro que no tivesse sidoinicializado? O compilador acusaria erro porque estaramos tentando usar umavarivel que no foi inicializada. Existe um outro tipo de parmetro por refern-cia conhecido como parmetro de sada. Esse tipo de parmetro resolve o nossoproblema porque ele no precisa ser inicializado para poder ser passado ao mto-do, porque o seu valor inicial no tem utilidade, dado que a sua nica finalidade servir como valor de retorno.

    Exemplo:

    using System;

    class teste{

    public void metOut(ref int parametro, out int resultado){

    parametro++;Console.WriteLine(parametro);resultado = parametro + 100;

    }}

    class app{

    static void Main( ){

    int argValor = 10, res;teste class1 = new teste( );

    class1.metOut(ref argValor, out res);

    Console.WriteLine(argValor);Console.WriteLine(res);Console.ReadLine( );

    }}

    Com o mtodo modificado recebendo um parmetro out, a sada do nossoprograma fica da seguinte forma:

    111111134

  • Passagem de nmero varivel de parmetros

    A finalidade desse tipo de parmetro, onde na verdade o que passamos uma lis-ta de parmetros que pode variar no seu nmero de elementos, nos permitirpassar a um mtodo quantos parmetros desejarmos. Para isso, usamos a palavrareservada params antes do tipo do parmetro que deve ser um array.

    Quando o mtodo receber mais de um parmetro, o parmetro array deve sero ltimo da lista.

    Exemplo:

    using System;class teste{

    public int Soma(params int[ ] args){

    int total=0;

    // implementao do mtodo.foreach (int element in args){

    total = total + element;}return (total);

    }}

    class app{

    public static void Main( ){

    int total;teste class1 = new teste( );

    total = class1.Soma(1,2,3,4);Console.WriteLine(total);total = class1.Soma(10,20);Console.WriteLine(total);

    Console.ReadLine( );}

    }

    35

  • Valor de retorno de um mtodo

    Quando o mtodo no retorna nenhum valor, o tipo de retorno void. Casocontrrio, especificamos o tipo do valor de retorno desejado. O retorno do m-todo feito atravs da palavra reservada return, seguida de uma expresso ou deuma varivel que contm o valor de retorno do mtodo. A palavra reservada re-turn encerra a execuo do mtodo e faz o programa retornar ao ponto onde omtodo foi chamado.

    Exemplo:

    public int soma(int a, int b){

    return a + b; //retornando uma expresso}

    ou;

    public int soma(int a, int b){

    int total = a + b;return total; //retornando uma varivel

    }

    A chamada do mtodo como se segue:

    // o valor de retorno armazenado na varivel total.total = soma(5,10);

    Constantes e atributos somente leitura

    Constantes e atributos de leitura so extremamente parecidos e nesta seo ex-plicaremos o que cada um deles e quando devem ser usados.

    Constantes

    Constantes so atributos cujo valor determinado em tempo de compilao.Exemplos de atributos constantes so: a varivel matemtica PI, a temperaturade ebulio da gua (100C) etc. Nesses casos, usamos uma constante porque oseu valor conhecido em tempo de compilao e no mudar durante a execu-o do programa.

    Constantes devem ser declaradas dentro do escopo de uma classe ou m-todo sendo, neste ltimo caso, visveis apenas no mtodo (locais).

    As constantes so por definio estticas e devem ser acessadas atravs doidentificador da classe e no por suas instncias. Apesar disso, constantespodem ser referenciadas por membros instncia da classe, o que no ver-dade para atributos estticos convencionais.36

  • Podemos declarar classes cuja nica finalidade seja a declarao de constan-tes. Como veremos mais adiante, no ser necessrio instanci-la; para evitar queisso seja feito pelos usurios da classe, declararemos um construtor privado. Re-tomaremos esse assunto novamente quando falarmos de construtores.

    Atributos somente leitura

    A diferena das constantes e dos atributos somente leitura (read-only) reside nofato de que o valor destes ltimos no conhecido em tempo de compilao.Entretanto, uma vez que o atributo inicializado, o seu valor persistir durante otempo de execuo da aplicao, e no ser possvel modific-lo. Da a naturezasomente leitura desses atributos.

    A inicializao de atributos readonly feita atravs do uso de construtores declasses e a tentativa de inicializar um atributo readonly fora de um construtor ouda sua declarao provocar um erro de compilao.

    Existem casos em que preciso inicializar o atributo readonly, mas no se dese-ja que uma instncia da classe seja criada para tal fim. Nesse caso, declaramos osatributos como estticos e um construtor esttico declarado para poder reiniciali-zar o seu valor. No se preocupe, voc vai saber em breve o que um construtor.

    Exemplo:

    using System;class clConstantes{

    public const int a = 100;public readonly int b;public static readonly int c;public clConstantes( ){

    b = 200;}

    static clConstantes( ){

    c = 300;}

    }

    class app{

    static void Main( ){

    clConstantes cl = new clConstantes( );

    Console.WriteLine("Constante: {0}", clConstantes.a); 37

  • Console.WriteLine("Atributo Readonly: {0}", cl.b);Console.WriteLine("Atributo Readonly Esttico: {0}",

    clConstantes.c);Console.ReadLine( );

    }

    }

    Construtores de instncias

    Construtores de instncias, ou simplesmente construtores, so mtodos chama-dos automaticamente quando da instanciao de uma classe, os quais implemen-tam as aes necessrias para sua inicializao. Sempre que uma classe instan-ciada, um construtor conhecido como default chamado.

    Exemplo:

    using System;

    class Circulo{

    private int x,y;public Circulo ( ){

    Console.WriteLine(Construtor Default);}

    }

    class CsharpApp{

    static void Main( ){

    CsharpEx cl1 = new CsharpEx( );}

    }

    Vamos ilustrar alguns conceitos a partir de nosso exemplo:

    Um construtor sempre tem o nome da classe da qual membro

    Construtores podem receber parmetros

    Construtores sem parmetros so chamados de construtores default, esempre so chamados quando da instaciao da classe, no nosso exemplo,a seguinte declarao:

    CsharpEx cl1 = new CsharpEx( )

    ... de um construtor default.38

  • Quando a classe instanciada, o construtor default sempre ser chamado,e para que determinadas aes sejam executadas a partir dele, este precisaser modificado conforme fizemos no nossso exemplo.

    Construtores com parmetros so chamados de construtores customizados

    Construtores no possuem valor de retorno.

    A seguir, modificamos o exemplo anterior e adicionamos classe um cons-trutor customizado:

    using System;

    class Circulo{

    private int x, y;

    public Circulo( ){

    Console.WriteLine("Construtor Default");}

    public Circulo(int a, int b){

    x = a;y = b;Console.WriteLine("Construtor Customizado");

    }

    }

    class CsharpApp{

    static void Main( ){

    Circulo cl1 = new Circulo( );Circulo cl2 = new Circulo(1,2);Console.ReadLine( );

    }

    }

    A sada no console deste programa como se segue:

    Construtor DefaultConstrutor Customizado

    Ao instanciarmos a classe circulo sem parmetros, o construtor default foichamado. Porm, quando o fazemos com parmetros, o construtor customiza-do que chamado. 39

  • Construtores estticos

    Construtores estticos seguem a definio anterior de construtores, porm pos-suem algumas particularidades:

    A declarao antecedida pelo modificador static

    chamado automaticamente antes da instanciao da classe

    executado apenas uma nica vez durante a execuo do programa quecontm a classe

    No pode receber parmetros como acontece com os construtores custo-mizados

    Construtores estticos no podem referenciar membros instncia da classe

    Exemplo:

    using System;class Circulo{

    static Circulo( ){

    Console.WriteLine("Construtor Esttico");}

    }

    class CsharpApp{

    static void Main( ){

    Circulo cl1 = new Circulo( );Circulo cl2 = new Circulo( );Console.ReadLine( );

    }

    }

    Sada do programa:

    Construtor Esttico

    Como voc pode observar, o construtor esttico s foi chamado uma nicavez, e no a cada vez que a classe instanciada. Como dissemos anteriormente,quando falamos de atributos read only, usamos esse tipo de construtor para ini-cializar atributos estticos, ou estticos s de leitura.40

  • Construtores Privados

    Construtores privados so usados para evitar que instncias de uma classe sejamcriadas. Exemplos de classes desse tipo so aquelas que definem um conjunto deatributos constantes.

    Exemplo:

    class classeDeConstantes{

    public const double pi = 3.1415;public const int iTempDeFervorDaAgua = 37;

    // declarao de outras constantes

    private classeDeConstantes( );}

    Se voc tentar criar uma instncia da classe, o compilador acusar um erroporque ela possui um construtor esttico.

    Destrutores

    Destrutores so mtodos membros de uma classe que so executados automati-camente quando um objeto destrudo. Algumas caractersticas importantes deum destrutor:

    chamado automaticamente quando uma instncia de uma classe nopode ser mais referenciada, e ento removida da memria pelo GC (Gar-bage Collector)

    No recebe parmetros

    Daremos exemplos e mais detalhes sobre o uso de construtores no captulosobre programao orientada a objetos usando C#. Por enquanto, basta quevoc saiba que em C# eles tambm existem.

    EstruturasEstruturas so tipos abstratos de dados muito semelhantes a classes. A diferenamais sensvel entre classses e estruturas reside no fato de que esta ltima no alocada na memria heap, e os seus valores so diretamente contidos na estrutu-ra; o que equivale a dizer que estruturas so tipos valor e no referncia. As carac-tersticas mais importantes de uma estrutura so as seguintes:

    No suportam mecanismo de herana

    So usadas para modelar estruturas de dados pequenas. Os tipos int, dou-ble e bool so implementados usando estruturas 41

  • Estruturas implementam Interfaces, conceito que veremos mais adiante

    So tipos valor, portanto so alocadas na pilha e no na memra heap

    Cada varivel do tipo estrutura (struct) contm uma cpia dos seus valorese, portanto, ao atribuirmos uma varivel A do tipo struct a outra, B, domesmo tipo, o que estamos fazendo uma cpia dos valores de A em B;portanto, qualquer modificao em B no alterar os valores de A.

    Declarando estruturas

    Veja no exemplo a seguir a declarao de uma estrutura:

    using System;

    struct Circulo{

    private int x, y;private float diametro;

    public Circulo(int a, int b, float Diametro){

    x = a;y = b;diametro = Diametro;

    }}

    class CsharpApp{

    static void Main( ){

    Circulo cl1 = new Circulo(0,1, 10);Console.ReadLine( );

    }

    }

    A declarao da estrutura:

    [modificador de acesso] struct : [interface]{//membros da estrutura}

    Como voc pode observar na sintaxe da declarao da estrutura acima, se-melhantemente a uma classe, estruturas podem implementar interfaces; no cap-tulo sobre programao orientada a objetos falaremos a respeito desse assunto.De forma similar a uma classe, uma estrutura pode possuir construtores, porm42

  • no possui destrutores e os construtores tm de ser customizados. A tentativa dedeclarar o construtor default gera um erro de compilao.

    Para criarmos uma varivel de um tipo struct:

    identificador = new [parmetros do construtor]

    Uma vez que feita a declarao da estrutura, os valores default dos seus atri-butos so configurados e copiados diretamente na estrutura. Ao contrrio dasclasses, que armazenam referncias para reas da memria, a estrutura contm osseus valores.

    Tipos aninhados

    Uma estrutura pode ser definida em um namespace independentemente de qual-quer outro tipo definido pelo usurio (classe ou estrutura), ou pode ser definidacomo um tipo aninhado dentro da declarao de outro tipo. Veja o exemplo:

    using System;class figura{

    public struct Circulo{

    private int x, y;private float diametro;

    public Circulo(int a, int b, float Diametro){

    x = a;y = b;diametro = Diametro;

    }

    }

    public struct Elipse{}

    public void teste( ){

    Circulo cl = new Circulo(0,0,10);Console.WriteLine("Usando tipos aninhados");

    }}

    class CsharpApp{ 43

  • static void Main( ){

    figura fig = new figura( );fig.teste( );Console.ReadLine( );

    }

    }

    No exemplo acima, declaramos duas estruturas, Elipse e Circulo, dentro dadeclarao da classe figura. E isso o que se conhece como tipos aninhados.Esses tipos so visveis apenas aos membros da classe figura porque foram decla-rados dentro do seu escopo.

    Mais alguns detalhes acerca de estruturas:

    No inicialize atributos de instncia dentro de uma estrutura porque ocompilador acusar erro.

    A declarao de construtores default numa estrutura no permitida pelocompilador, portanto apenas declare construtores customizados cujos pa-rmetros tm como finalidade inicializar a estrutura.

    Por ser um tipo valor, estruturas no podem ser usadas enquanto no fo-rem inicializadas. O mesmo vlido para tipos bsicos, mas isso assimporque esses tipos, como j vimos, so baseados em estruturas.

    Estruturas podem ter mais de um construtor customizado.

    Quando usar estruturas

    Se as estruturas so to semelhantes a classes, ento quando devemos usar estru-turas e quando devemos usar classes? Vejamos:

    Quando se est lidando com estruturas de dados pequenas.

    Quando no precisamos de suporte para o mecanismo de herana.

    O uso de classes mais custoso em termos de desempenho e uso da mem-ria, portanto, quando as duas caractersticas acima forem verdadeiras, orecomendado usar uma estrutura e no uma classe.

    Tipos Enumerados

    Como j dissemos acima, tipos enumerados so listas de valores constantes cujarepresentao interna se d atravs de nmeros inteiros. Cada constante definidanum tipo enumerado mapeia um nmero inteiro especfico, que comea pelo va-lor inteiro zero. Entretanto, este valor inicial pode ser sobrescrito quando assimespecificado na declarao do tipo enumerado.44

  • Os membros de um tipo enumerado no possuem modificadores de acesso, eestes so acessveis desde que o tipo enum que os contm seja acessvel.

    Veja a seguir a declarao de um tipo enumerado:

    enum dias_da_Semana{

    domingo, // = 0segunda, // = 1terca, // = 2quarta, // = 3quinta, // = 4sexta, // = 5sabado // = 6

    }

    Podemos sobrescrever o valor inicial dos membros do tipo enumerado:

    enum dias_da_Semana{

    domingo = 100,segunda = 50,terca = 34,quarta = 3,quinta = 40,sexta = 60,sabado = 70

    }

    Como voc pode observar no exemplo, os valores inteiros usados para so-brescrever a lista enumerada no precisam ser seqenciais. Se um dos valores dasequncia da lista no for sobrescrito, o seu valor inteiro correspondente ser oprximo da seqncia em relao ao membro anterior. Vejamos:

    enum dias_da_semana{

    domingo = 100,segunda = 50,terca = 34,quarta = 3,quinta,sexta = 60,sabado = 70

    }

    class app{

    public static void Main( ){

    int quinta = (int) dias_da_semana.quinta;int sexta = (int) dias_da_semana.sexta; 45

  • Console.WriteLine("quinta = {0}", quinta);Console.WriteLine("sexta = {0}", sexta);Console.ReadLine( );

    }}

    No exemplo anterior, usamos mascaramento de tipos de forma a extrair dotipo enumerado o nmero inteiro correspondente ao dia da semana.

    Um determinado elemento de um tipo enumerado pode compartilhar o mes-mo valor inteiro com outro elemento da lista. Vejamos:

    enum dias_da_semana{

    domingo = 100,segunda = 50,terca = 34,quarta = 3,quinta,sexta = 60,sabado = 70,dia_de_festa = sabado,dia_de_descanso = domingo

    }

    Como voc pode observar, declaramos dois novos elementos no tipo enume-rado dos dias da semana. Esses novos elementos compartilham o mesmo valordos elementos sabado e domingo respectivamente.

    Agora observe a seguinte declarao:

    enum dias_da_semana{

    domingo = dia_de_descanso,dia_de_descanso

    }

    A declarao acima no vlida porque, nesse caso, temos uma declara-o circular, dado que o valor de dia_de_descanso depende de domingo e vi-ce-versa.

    O tipo inteiro subjacente a um tipo enumerado definido como int pelocompilador automaticamente. Mas esse tipo pode ser redefinido para qualquerum dos tipos inteiros existentes em C# (byte, sbyte, short, ushort, uint, long ouulong). Sendo assim, a seguinte declarao redefine para uint o tipo default deenum dias_da_semana. Veja a declarao:

    enum dias_da_semana:uint{

    // corpo do enum}46

  • Ao fazermos isso, a seguinte declarao se torna invlida:

    enum dias_da_semana:uint{

    domingo = 100,segunda = -1

    }

    O compilador acusar um erro porque o valor do elemento segunda est forado intervalo do tipo uint.

    O tipo enum tem como classe base System.Enum, portanto herda alguns met-dos e propriedades atravs dos quais podemos efetuar operaes com uma listaenumerada. Vejamos alguns deles:

    Enum.Format: No exemplo a seguir vamos escrever no console a stringconstante correspondente a um determinado valor da lista enumerada.

    enum dias_da_Semana{

    domingo = 100,...

    }

    ....

    dias_da_semana dia;dia = dias_da_semana.domingo;

    // Retornando a string correspondente ao dia domingo

    Console.WriteLine("dia: {0}", Enum.Format(typeof(dias_da_semana),dia,"G"));

    A declarao abaixo equivalente anterior:

    Console.WriteLine( "dia: {0}", Enum.Format( typeof(dias_da_semana ), dias_da_semana.domingo, "G" ) );

    Observe que declaramos uma varivel do tipo dias_da_semana qual atribu-mos o elemento domingo da nossa lista. A chamada do mtodo Enum.Format foiefetuada passando como parmetros o tipo do enumerado usando a funo type-of mais um dos elementos da nossa lista. Este ltimo parmetro podia ser passa-do como o valor inteiro correspondente constante da lista ou como uma vari-vel do tipo dias_da_semana. As duas formas foram usadas no exemplo. E, final-mente, o mtodo recebe um ltimo parmetro onde especificamos o formato emque desejamos que seja apresentado o resultado: string (G), hexa (x) ou deci-mal (d). 47

  • Enum.GetName: A seguinte linha de cdigo escreve no console a string cor-respondente ao elemento domingo da lista dias_da_semana:

    Console.WriteLine( "dia: {0}", Enum.GetName( typeof(dias_da_semana), dia) );

    Enum.GetNames: Usando o mtodo Enum.GetNames escreveremos no consoletodas as constantes que compem os diferentes elementos da nossa lista dias_da_semana. Como voc poder observar, os elementos foram apresentados de acor-do com a seqncia dos nmeros inteiros subjacentes a cada elemento da lista.

    foreach(string str in Enum.GetNames( typeof( dias_da_semana) ) ){

    Console.WriteLine("dia: {0}", str);}

    Enum.GetUnderlyingType: Este mtodo mostra qual o tipo inteiro subjacen-te lista enumerada.

    Exemplo:

    Console.WriteLine( "Tipo subjacente do tipo enum: {0}", Enum.GetUnderlyingType(typeof( dias_da_semana ) ) );

    A sada correspondente no console:

    Tipo subjacente do tipo enum: System.Int32

    Enum.IsDefined: Este mtodo retorna true ou false indicando se a string pas-sada como parmetro existe na definio de constantes do tipo enumerado.

    Exemplo:

    Console.WriteLine( "A string sabado existe na lista enumerada?: {0}",Enum.IsDefined( typeof( dias_da_semana ), "sabado") );

    A sada correspondente no console:

    A string sabado existe na lista enumerada?: True

    O parmetro passado sensvel ao contexto, portanto, se passarmos a stringSabado, o resultado ser falso.

    Como observao final sobre tipos enumerados, os diferentes operadoresaritmticos podem ser usados para comparar elementos de uma lista enumerada.Por exemplo:

    dias_da_semana dia = dias_da_semana.domingo;dias_da_semana dia2 = dias_da_semana.dia_de_descanso;

    if (dia == dia2)48

  • {Console.WriteLine( "Tenha um bom descanso" );}

    ArraysEm C#, arrays so objetos cuja classe base System.Array. Os arrays podem serunidimensionais, multidimensionais ou ainda arrays de arrays, cujos elementosso outros arrays.

    Declarando arrays

    A seguir, temos a declarao de um array de inteiros unidimensional:

    int[ ] arrInt = new int[2] ;

    As trs formas a seguir so vlidas para inicializar um array quando feita suadeclarao:

    int[ ] arrInt = new int[2] {0,1}; //ouint[ ] arrInt = new int[ ] {0,1}; //ouint[ ] arrInt = {0,1} ;

    Declarando um exemplo multidimensional de 22 dimenses:

    int[,] arrInt = new int[2,2] ;

    Inicializando o array:

    int[,] arrInt = new int[2,2] {{0,0},{0,1}}

    Declarando um array de arrays:

    private int[ ][,] ArrDeArr = new int[2][,] {new int[2,3], new int[4,5]};

    Inicializando o array na declarao:

    private int[ ][,] ArrDeArr = new int[2][,] {new int[2,2] {{1,2},{3,4}}, newint[2,2]{{5,6},{7,8}}};

    Basicamente, o que estamos fazendo no ltimo exemplo declarar um arrayque, por sua vez, contm dois arrays bidimensionais.

    Veja um exemplo completo:

    using System;

    public class clArrays{

    private int[ ] arrInt = new int[2] {1,2};private int[,] multInt = new int[2,2] {{1,2},{3,4}};private int[ ][,] ArrDeArr = new int[2][,] {new int[2,2] {{1,2},{3,4}}, new 49

  • int[2,2]{{5,6},{7,8}}};

    public void Im