Você está na página 1de 618
Um Guia Para Aprender Facil Um Guia de Aprendizagem Para Programacao no Mundo Real em C# e .NET Mande nos seus dados \ usando LINQ Descut escubra os Segredos da @ ‘Abstracdo e da Jiu Heranga — Crieum | ae jogo arcade | Y retr6 classico y totalmente, “Z - funcional \ Y/, / YF - Aprenda como { rs extensdes de } métodos t ‘Veja como Jaime ee Sus a usou colegdes regras na Vila i a briga com seus Objeto dados Fa genéricas para vencer Andrew Stellman O'REILLY nS & Jennifer Greene conteuido (sumario) Contetido (Sumario) Introdugao. xxix 1 Seja produrivo com CH: Aplicativos visuais em 10 minutos ou menos 1 2 Tudo é somente eédigo: Nos bastidores 39 3 Objetos orientem-se: Fazendo o codigo ter sentido, 7 4 Tipos e referéncias: Sio 10 horas. Voc? sabe onde seus dados estio? 13 Laboratério CH 1: Um dia de corsidas 147 5 Encapsulamento: Mantenha o que é particuas.. particular 155 6 Heeranga: Sua devote genealigica de objeto 183, 7 Interfaces ¢ classes abstratas: Fazendo as classes manterem suas promessas 223 8 Enumeragies ¢ coleedes: Guardando um monte de dados 269 Laboratorio C# 2: A Missio 313 9 Lendo e salvando arquivos: Salve o conjunto de bytes, salve o mundo 3 10 Tratamento de excegdes: Apagar incéndios é coisa do passado : a7 11 Eventos ¢ delegados: © que o seu cédigo faz quando voce nao esté olhando “1 12 Revisto e prévia: Conhecimento, poder ¢ desenvolver coisas lepais 89 13 Controles grificos: Deise bonito a7 14 Capitio Manwvilhoso: A Morte do objeto 527 15 LINQ: Controle seus dados 559 Laboratirio C# 3: Invasores, 583 Apendice i: Sobras 599 Conteiide (a coisa real) Introdugao ‘Sua mente em C#. Voce esta sentado tentando aprender alguma coisa, mas sua mente fica insistindo em dizer-ine ‘que este aprendizado néo ¢ importante. Sua mente diz melhor deixar espago para coisas mas importantes, como, por ‘exemplo, quais animais selvagens evar e se um local para @ patica de arco e lecha para nudistas € uma ideia rum’ Entéo como vacé engana sua mente para que ela pense que a sua vida realmente depende de aprender C#? Pra quem é este livro? sox Sabemos o que vor esti pensando xox “Metacognicao: pensando sobre o pensar wail Aqui esté o que VOCE pode fazer para forcar seu cérebro a ser submisso foes Do que vocé precisa para ler este livro xaxiv Teia-me sexe Acequipe de revisto técnica xexvi Aggradecimentos xavil contetido (sumario) Seja prodative com C# Aplicativos Visuais em 10 minutos ou menos Quer criar étimos programas realmente rapido? © C# 6 uma linguagem de progr méo. Com a IDE do Visual Studio, vocé nunca mai ‘obscuro para fazer com que um botao funcione. Mell realizar 0 seu trabalho, ao invés de lembrar botée, e qual é o rétulo dele. Soa interessant Por que vocé deve aprender C# © C#t co IDE do Visual Studio facititam muitas coisas Ajude o diretor geral a eliminat os papéis Conheca as necessidades dos uswirios antes de comecar a fazer seu programa Aqui esti o que voeé vai desenvolver (© que voeé faz no Visual Studio... que o Visual Studio faz por voc’... Desenvolva a interface de usuirio Visual Studio, nos bastidores Complete 0 cédigo gerado automaticamente ‘Voce jé pode executar seu aplicativo Precisamos de uma base de dados para armazenar nossas informagies Criando a tabela para a Lista de Contatos Os espacos em branco no cartio de contato s4o colunas na tabela People ‘Termine de construir tabela Faca um diagrama com seus dados para que seu aplicativo possa acessé-los Insira seus dados dos cartes no banco de dacios, Conecte seu formulitio 3 sua base de dados usando uma fonte de dados Adicione controles vinculados a dados em scu formulitio Bons programas sio usados intuitivamente Como transformar 9 SEU aplicativo num aplicativo para TODOS Dé o aplicativo aos seus usurios Vocé NAO terminou: teste sua instalagio Vocé fez um aplicativo disigido a dados completo ramacdo poderosa e uma ferramenta valiosa na palma de sua terd que gastar horas escrevendo codigo ihor ainda, vocd podera se concentrar em gual parametro de qual método € 0 nome para um Me? Vire a pagina, e vamos comecar a programar. contetide (sumario) Tado & Somente Cédigo Nos bastidores \Vocé 6 um programador, nao apenas usuario de IDE Yoc8 pode fazer muito usando a IDE. Mas existe um limite para o que a IDE pode fazer por vocé. Claro, existem muitas tarefos repetitivas que tem que ser feitas quando se desenvolve um aplicativo. E a IDE é otima para fozer essas coisas. Mas trabalhar com a IDE é apenas o comeco. Pode-se fazer um aplicativo realizar muito mais - e escrever cbdigo C# € « forma de consequir isso. Uma vez que se tenha pego 0 jeito da coisa com relagéo a programar, néo hé nada que seus programas néo possam fazer. Enquanto voeé esti fazendo isso. 40 .0 IDE esti fazendo isso " De onde vém os programas 2 O IDE ajuda voeé a fazer seu cédigo 4 Quando coisas si0 alteradas no IDE, 0 codigo é mudado também 46 Anatomia de um programa 48 Seu programa sabe por onde comecar 50 Vocé pode mudar o ponto de entrada de seu programa 51 Dus classes podem estar no mesmo namespace 7 Scus programas usam variéveis para trabalhar com dados 37 (© C# usa simbolos matemiticos familiares 59 gos executam uma agao repetidamente 0 Use um trecho de eddigo para escrever lagos for simples ol Comandos if/else tomatn decis6es o * = Estabelega condigdes € veja se elas Sio verdadeiras 6 Cite este formuléio sg * teed amma nn ncpipret efron nce reat ancarecrkinonpert terrapins CO achahesenaee eran nner rm evaporate ncn ene) a acer Hnom nth baat Sembee seopre den prcnrto entre te casser be Vets a ania “con ster pj xi contedido (sumério) Objetos: se otientem! Fazendo o Cédigo Ter Sentido Cada programa que vocé escreve resolve um problema. ‘Quando voce esté desenvolvendo um programa, é sempre uma boa idéia comecar pensando a respeito de qual problema ele deveria resolver. € por isso que objetos séo téo uteis. Elos permitem que se estruture 0 cédigo baseando-se no problema que se estd resolvendo, de forma que vocé pode empregar seu tempo pensando sobre o problema que precisa ser enfrentando ao invés de ficar atolado na mecénica de escrever cédigo. Quando se usa um objeto corretamente, acaba-se com cédigo que 6 intuitivo de escrever, e facil de ler e alterar. Como Miguel pensa a respeito de seus problemas ‘Como o sistema de navegagio do carro de Miguel pensa sobre este problema A classe de navegacao de Miguel tem métodos para criar e modificar rotas Use 0 que voce aprendeu para desenvolver um aplicativo simples ‘Miguel tem uma idéia Miguel pode usar objetos pata resolver 0 problema Vocé pode usar uma classe para construir um objeto Quando voce cria um novo objeto a partir de uma chasse, cle é chamado de uma instineia dessa classe Uma solugio melhor... 6 que os objetos conseguiram para vocé! ‘Uma insténcia usa campos para manter registro sobre coisas ‘Vamos criar algumas instancias! Gracas & memoria que passa pela mente de sew programa Voce pode usar nomes de classes e métodos para deixar seu cédigo mais intuitive (bat Nawgtor Dé As suas classes uma estrutura natural Diagramas de classe ajudam a organizar 0 eédigo de forma que ele faga sentido ey Desenvolva uma classe para trabalhar com alguns earas Exisce uma forma ainda mais ficil de incializar objetos ‘Obie Never Algumas ideas para projetar classes intuitivas Gone yc define on ce deine sevrnbfate, examen cons ome Morte tines enya de meee xh) a i tinh < ay — a peepee ios ise a Coan yer otha de spel, a xl 8 9 80 80 81 82 83 8 gi 88 89 1 93 9% 99 105 106 contetido (sumério) Tipos e Referéncias So 10 horas. Vocé sabe onde seus dados estéo? Tipos de dados, bases de dados, Tenente-Comandante Data... 6 tudo importante. Sem dados, seus programas so intiteis. Informagées oriundas dos usuérios séo necessérias, © s60 usadas para procurar ov criar informagéo nova para devolver a eles. Na verdade, quase tudo que vocé faz em programagdo envolve trabalho com dados de uma form ou de ouira. Neste capitulo, voce oprenderd as vantagens e desvantagens dos tipos de dados C#, como trabalhar com dades em seu programa e até descobrir alguns segredos sujos. sobre objetos (shhhhh...objetos s60 dados também). © tipo da vasiével determina qual tipo de dado ela pode armazenar 14 ‘Uma variivel é um eopo cheio de dados para a viagem 16 Cinco quilos de dados aum saco de 2,5 quilos 116 ‘Mesmo quando um aiimero tem o tamanho certo, vocé no pode apenas atribuilo a qualquer variivel ww Quando vocé converte um valor grande demais, 0 Ci itd ajusti-lo automaticamente 8 C## faz alguma coercio automaticamente 19 Quando vocé chama um método, as variéveis deve corresponder aos tipos dos parimetros 121 Combinando = com um operador 125 Objetos sto variéveis também 125 Refira-se 20s seus objetos com variivels de referéncia 126 Referéncias sio como etiquetas para seu objeto 1 Se nio hé mais nenhuma seferéncia, seu objeto € caletado como lixo 127 Mialtiplas referéncias e seus efeitos colaterais 129 Daas referéncias significam DUAS formas de mudar um dado do objeto 133 [Um caso especial: matrizes 133 Matrizes podem conter um monte de varkéveis de referéncia também 134 ae Bem-vindo a lanchonete de sanduiches com desconto do Joio Podrio! 135 oy echy = mew og: ‘Objetos usam referéncias para falar uns com os outros 137 ‘Onde neahum objeto jamais esteve 138 ail contetido (sumirio) contetide (sumério) encapsulamento Mantenha o que é particular... em particular Vocé ja quis ter um pouco mais de privacidade? As veres seus objetos sentem-se da mesma forma. Assim como voce nao quer que ninguém que vocé ndo confie leia seu didrio ou veja seus extratos bancarios, um bom objeto néo deixa outro objeto xeretar seus campos. Neste capitulo, vocé vai aprender sobre o poder do ‘encapsulamento. Vocé vai tornar seus dados de objeto privados, e adicionar métodos para proteger a forma como esses dados sao acessados. Catarina é uma promotora de eventos 156 © que um estimador faz? 156 O teste da Catarina 162 Cada opgao deve ser calculada individualmente 163 FE ficil usar acidentalmente seus objetos de forma errada 164 Encapsulamento significa manter em particular alguns dados de uma classe 165 Use encapsulamento pata controlar acesso aos métodos ¢ campos de sua classe 165 Mas 0 campo NomeVerdadeiro fica REALMENTE protegido? 166 ‘Campos ¢ métodos privados #6 podem ser acessados de dentro da classe 167 smas idéias para encapsular classes 170 © encapsulamento mantém seus dados em boas condigdes 170 agenteClA Propriedades faclitam 0 encapsulamento m ric um aplicativo para testar a classe Farmer a1 Use propriedades automiticas para terminat a classe 172 E se quisermos alterar 0 multiplicador de racio? 173 Use um construtor para iniializar campos privados 174 agenteKGB agenteMI5 a” ~. > =] fees Be) mae] 7 ~ —* ees] conteddo (sumario) heranga Sua arvore genealdgica de objeto As vezes vocé REALMENTE quer ser exatamente como seus pais. Vocé j@ encontrou sem querer um objeto que quase faz exatamente o que vocé quer que o seu objeto faa? Jé se pegou pensando se vocé pudesse apenas mudar algumas coisas, aquele objeto seria perfeito? Bom, essa 6 apenas uma razéo que faz da heranca um dos conceitos ¢ técnicas mais poderoso na linguagem C#. Antes de avancar neste capitulo, vocé vai aprender como criar uma subelasse a partir de um objeto para herdar seu comportamento, mas mantendo a fle» lidade para alterar esse comportamento. Vocé vai modelar 0 mundo real mais corretamente e vai ter cédigo que é mais facil de manter. \e Catarina onganiza aniversirios também Precisamos de uma classe BirthdayParty Mais uma coisa.. Voce pode acrescentar uma taxa de RS100 para festas com mais de 12 pessoas Quando suas classes usam heranga, vor’ 86 precisa eserever seu eédigo uma vex Faca seu modelo de classe comegando pelo geral e especificando cada vez mais mo vocé criaria um simulador de zooldgico? Use heranga para evitar duplicagio de cédigo em subclasses Animas diferentes produzem sons diferentes Pense em como agrupar os animais Crie a hierarquia de classe Toda subclasse estende sua classe base Use dois-pontos para herdar de uma classe base Sabemos que heranca adiciona os campos, propriedades ¢ métodos da classe base a subclasse. Uma subclasse pode substituir métodos para alterar ow mudar completamente os métodos herdados Em qualquer lugar onde se pode usar uma classe base, pode-se utilizar uma de suas subclasses Uma subclasse pode acessar sua classe base usando a palavra-chave base Quando uma classe base tem um construtor, sua subclasse precisa de um também Agora vocé esti pronto para terminar o trabalho para a Catarinal astra um sistema de gerenciamento de colmeia Primeiro voed construiri o sistema bisieo Use heranga para estender 0 sistema de gerenciamento de abelhas itar duplicar cédigo, vai 184 184 190 190 191 192 192 193 194 195 195 196 199 200 200 204 205 206 210 21 contetido (sumério) Interfaces e classes abstratas Fazendo as classes manterem suas promessas Agées sao mais importantes do que palavras. Algumas vezes vocé precisa agrupar seus objetos baseando-se nas coisas que eles podem fazer 20 invés de com relacéo a quais classes eles herdam caracteristicas. E ai que entram as interfaces las permitem que vocé trabalhe com qualquer classe que posse fazer o trabalho. Mas com grande poder vem grande responsabilidade, e qualquer classe que implementar uma interface precisa se comprometer a preencher todos os requisites... ov © compilador quebrard as pernas delas, entende? Vamos voltar ao colmei-co 24 odemos usat heranca para criar classes para tipos diferentes de abelhas 204 x Herang ‘Uma interface diz para uma classe que ela precisa implementar * Abetratio certos métodos ¢ propriedades ; 25 * Use a palavra-chave interface para definir uma 226 Encapsulamento Agora vocé pode criar uma instincia de NectarStinger que realize ambas as tarefias 226 * . Classes que implementarem interfaces devem incluir TODOS 0s métodos ". Polimorfismo Pratique um pouco com interfaces 228 = Voce nao pode criar instincias de uma interface, mas pode ctiar referéncias 230 Referéncias de interfaces funcionam exatamente como referéacias de objetos 230 Vocé pose descobrir se uma classe implementa uma interface especifica usando “is” 231 Interfaces podem herdar de oureas 232 © RoboBee 4000 pode fazer o trabalho de uma abelha opertria sem usar 0 precioso mel 233 A “is” diz a vocé o que um objeto implementa “as” diz 20 compilador como tratar um objeto 233 = Sais Wma cafercira também é um cletrodoméstico 234 Pan fia — Jp Supercocrcdo funciona tanto com objetos quanto com interfaces 234 Subcoercio deixa que voce transforme seu eletrodoméstico de volta em eafeteira 236 Supercoergio e subcoeseo funcionam com interfaces, também 237 esses lugares mais do que exatamente publico e privade 240 (Os modificadores de acesso mudam 0 escopo 241 ‘Algumas classes nunca deveriam ser instanciadas 243 ‘Uma classe abstrata é como um cruzamento entre uma classe ¢ uma interface 244 ‘Algumas classes nunca devem ser intanciadas 245 ‘Um método abstrato mio tem corpo 246 Polimorfismo quer dizer que um objeto pode tomar muitas formas diferentes 253 xvii contetido (sumério) enumeragSes e colegdes Guardando muitos dados Quando chor ve, pode ser garoa ou tempestade. No mundo real, vocé néo costuma lidar com seus dados em pequenas quantidades. Nao, seus dados véo surgir em quantidade, aos montes, em pilhas. Vocé precisaré de ferramentas muito poderosas para organizé-los todos, © é ai que as colegées entram. Elas permitem que vocé ‘armazene, ordene © gerencie todos os dados que seu programa precisa para se concentrar. Dessa forma vocé pode pensar sobre escrever programas que trabalhem com seus dados, e deixar as colegées se preocuparem com tomar conta deles pra voc8. ptt A Strings nem sempre server para armazenar categorias de dados Enums permitem enumerar um conjunto de valores validos Enums permitem representar mimeros usando nomes és poderiamos ter usido uma matriz para eriar um baralho, Matrizes sto dificeis de trabalhar 7": Listas facilitam guardar colecdes de... qualquer coist Listas sio mais flexiveis que matrizes Listas encolhem e aumentam dinamicamente Objetos List podem armazenar qualquer tipo Inicializadores de Colegoes funcionam exatamente como os de objeto ‘Vamos criar uma lista de Patos Listas sio féccis, mas ORDENAR pode ser complicado Duas formas de ordenas seus patos Use IComparer para dizer fis suas listas como se ordenar ric uma instincia de seu objeto de comparacio IComparer pode fazer comparacdes complexas Use um dicionério para armazenar chaves e valores Lista de Funcionalidades de um Dicionatio Chaves e valores também podem ter tipos diferentes Voce pode fazer seus proprios métodos sobrecarregados E ainda MAIS outros tipos de colegies.. ‘Uma fila ¢ PES - Primeiro a Entras, Primeito a Saie ‘Uma pilha € UEPS - Ulkimo a Entrar, Primeiro a Sar 270 270 a 21 275 276 276 279 280 284 284 285 286, 286 287 288 290 292 293 298, 306 307 307 z : 3 : 3 3 conteddo (sumario) lendo e escrevende arquives Salve a matriz de bytes, salve o mundo As vezes vale a pena ser um pouco persistente. A%6 agora, todos os seus programas tém funcionado por muito pouco tempo. Eles so ativados, executam por um curto intervalo e desligam. Mas isso nem sempre 6 0 bastante, principalmente quando vocé esta lidando com informagéo importante. Vocé precisa ser capaz de salvar sev trabalho. Neste capitulo, veremos como escrever dados em um arquivo, e entéo como ler essa informacéo de volta de um arquivo. Voeé aprenderé sobre as classes stream {fluxo, literalmente riacho) do .NET e também dara uma olhada nos mistérios do hexadecimal e do binério. © Cit usa streams para ler ¢ eserever dados Streams diferentes léem e excrevem coisas diferentes Um FileStream escreve bytes em um arquivo Ler e escrever implica em dois objetos es (Os dados podem passar por mais de uma stream Use objeros nativos para exibir caixas de didlogo padrio Caixas de didlogo também sao objetos Use as classes nativas File e Directory para trabalhar com arquivos e diret6rios © 342, Disposable gaeante o descarte apropriado de seus objetos 347 Evite erros no sistema de arquivos com comandos using 348 Escrever arquivos geralmente envolve tomar muitas decisées 354 ‘Use um comando switch para escolher a opgio correta 354 Acrescente um construtor Deck) sobrecarregado que leia um baralho tie seam de um arquivo 356 © que acontece com um objeto quando ele é serializado? 357 Mas o que E exatamente um estado de objeto? O que precisa ser salvo? 357 Quando um objeto €é serilizado, todos os objetos 20 qual obi een se referesio serilizados também... 358 coe sm we wm __ Sétitlizagio permite let ou escrever um objeto inteito de uma vez 359 ast: Paras ser serializada, marque-a com o attibuto [Serializable] 350 OUT G UO ET coarene exo en Unicode atomaicamente 363 (© C#t pode usar matrizes de byte para mover dados Use um Binary Writer para escrever dados em binatio Voce pode ler ¢ escrever arquivos serializados manualmente também ‘StreamReader ¢ StreamWriter servirio muito bem 370 contetido (sumério) Tratamento de Excegtes Apagar incéndios é coisa do passado Programadores nao sao treinados para serem bombeiros. Yocé trabalhou muito, enfrentou érduas leituras de manuais ¢ alguns pouces livros empolgantes da série Use a Cabeca, e atingiu 0 dpice da sua profisséo: programador senior. Mas vocé fica recebendo notas da sua empresa porque seu programa levanta erros e fecha, ou néo se comporta ‘como deveria, Nado tira mais voce do caminho da programagéo do que ter que corrigir um erro estranho... mas com tratamento de excegées, vocé pode escrever cédigo para lidar com problemas que aparecem. Ainda melhor, vocé pode até mesmo reagir a esses problemas, e manter as coisas funcionando. Aldo precisa de desculpas para passear 378 Quando seu programa langa uma excecio, o NET gera um objeto Exception 38 O cédigo do Aldo fez algo inesperado 382 Todos os objetos de excegio herdam de Exception" 383 ‘A barra de ferramentas de depuragio ajuda a rastrear e prevenir excegties 384 Use o depurador do IDE para desentocar o erro no gerenciador de desculpas 385 ‘Opa, o céxlgo ainda esti’ com problemas. 387 Trate de excegdes com try € catch 339 (O que fazer quando um método que voc’ quer chamar apresentariscos? 390 Use 0 depurador para seguir 0 fluxo do try/catch 391 Se vocé tem cédigo que SEMPRE deve executar, use um bloco finally 393 Use 0 objeto Exception para obter informagées sobre 0 problema 396 Use mais de um bloco catch para lidar com miltiplos tipos de excecio. 397 ‘Uma classe lanea uma excego, outra a captura 397 As abelhas precisam de uma excegio para esgotamento de mel 398 Uma forma ficil de evitar muitos problemas: using providencia um try e um finally pra voce 401 Evitando excecdes: implemente [Disposable para fazer sua prépria limpeza 402 A pior captura: bloco de comentisios 403 Tudo bem usar solugdes temporisias (temporariamente) 404 Algumas idéias simples para tratamento de excegies 405 Aldo finalmente consegue suas ferias, 10 O trabalheexté chats hoje. Eu uero i fazer pesca submarina. contetido (sumério) eventos e delegados M4 O que o seu cédigo faz quando vocé nao esta olhando Seus objetos estdo comecando a pensar por eles mesmos. Vocé nem sempre pode controlar © que um objeto esté fazendo. Algumas coisas. simplesmente acontecem. E quando acontecem, voc® vai querer que seus objetos sejam inteligentes o suficente para responder @ qualquer coisa que apareca. E pora isso que servem ‘05 eventos. Um objeto publica um evento, outro objeto se inscreve nele, e todos trabalham juntos para manter as coisas funcionando. O que é timo, até que vocé tenha um monte de ‘objetos respondendo ao mesmo evento. Nesses casos os callbacks serdo dtei Buandn tte ating, Eoufufhbngde tchamade, Ji desejou que seus objetos pensassem por si mesmos? Mas como um objeto SABE como responder? Quando um EVENTO ocorre...0s objetos prestam atengio Um objeto dispara seus eventos e 0s outros ficam atentos, Entio outros objetos tratam 0 evento . Ligando 0s pontos O IDE cria tratadores de eventos para vocé auromaticamente Os formulirios que voed esteve fazendo usaram eventos Conectando remerentes com destinatarios de eventos, Um delegado COLOCA-SE NO LUGAR de um método real Delegados em acio Qualquer objeto pode inscrever-se num evento pablico Use um callback, ao invés de um evento, para associar exatamente ‘um tinico objeto a um delegado Callbacks usam delegados, mas NAO eventos Py bata ft eng ev4 nna treet 70 gees da chia, vat gar 27 ners. ev Cae peypeerse hale True neanirina siieere rea fttanalt, econ tifince Go bmn saye 22. Objeto Golero =a) Goleiro.DefendeBola(70, 9° 412 412 412 413 aug a5 418 424 426 126 ar 20 432 432 revisde e prévia Conhecimento, poder, e desenvolver coisas legais Aprender nao serve de muito até que vocé CRIE algo. conteuido (sumério) Até que vocé tenha realmente escrito cédigo funcional, é dificil ter certeza se voce realmente sabe algunsdos conceitos mais complexos do C#. Nesse capitulo, aprenderemos sobre alguns novos conceitos e amarraremos algumas pontas soltas: falaremos sobre timers e como lidar com colecées usando LINQ, entre outras coisas. Nos também vamos desenvolver a fase 1 de um aplicativo realmente complexo, e nos certificar que vocé tenha um bom dominio sobre © que jé aprendeu nos capitulos anteriores. Entéo ponhe o cinto de seguranca... € hora de desenvolver um software legal. ‘Vocé percorreu um longo caminho, baby Nés A estrutura do simulador de colméia ja fomos apicultores Desenvolvendo 0 simulador de colmeia Vide e morte de uma flor Agora precisamos de uma classe Bee Preenchendo a classe Hive © método Gof) da colméia Estamos prontos para o mundo Estamos criando um sistema baseado em turnos Vida e morte de uma fl Dé comportamento para as abelhas © formulisio principal diz 20 mundo para funcionar Poclemos usar o mundo para conseguir estatisticas mers disparam eventos repetidamente (O timer est usando um delegado nos bastidores Obieto Flower Vamos trabalhar com grupos de abellas Uma colegio coleciona.. DADOS LINQ facilita wrabalhar com dados em colegdes c bases de dados Gis = 32 Objeto Flower Objeto Flower 440 441 442. 442 “7 455 456 456 487 462 463 464 465 466 471 a 473 cconteddo (sumério) contreles e graficos Deixe bonito Algumas vezes voces precisa fazer os graficos vocé mesmo. Passamos bastante tempo confiando que os controles lidassem com tudo 0 que fosse visual nos 1noss0s aplicatives. Mas algumas vezes isso nao é suficiente - por exemplo quando vocé tem que animar uma imagem. E uma vez que vocé comece a lidar com animagao, vocé vai acabar criando seus préprios controles para seus programas .NET, talvez adicionando um buffer duplo, @ mesmo desenhando diretamente nos formuldrios. Tudo comeca com 0 objeto Graphics, os Bitmaps, € uma determinacéo de néo aceitar os gréficos como eles 40, Vocé esteve usando controles até agora para interapir com seus programas 478 Controles de formuliio sao apenas objetos 478 Adicione um renderizador 4 sua estrurura 480 Controles sio adequados como elementos vieuais 482 Desenvolva seu primeiro controle animado 485 Seus controles precisa descartar os controles deles tambéiil 488 ‘Um UserControl & uma forma facil de desenvolver um controle 489 Adicione os formulitios de colméia ¢ de campo ao projeto 492 Desenvolva 0 Renderizador 493 Vamos examinar de perto esses problemas de performance 498 Vocé redimensionou seus Bitmaps usando um objeto Graphics (Os seus recursos que sto imagens ficam armazenados em objetos Bitmap 501 Use System.Drawing para ASSUMIR O CONTROLE dos grificos voce mesmo 502 Um tour de 30 segundos pelos geficos da GDI+ 502 Use grificos para desenhar uma figura num formulirio 503 Grificos podem resolver nosso problema de transparéncia 507 Use o evento Paint para fazer seus grificos durarem 508 Examinando de perto como os formularios ¢ controles repintam-se 511 Buffer duplo suaviza sua animagio 313 Buffer duplo esta implementado nos formulirios e controles sia Use um objeto Graphics ¢ um trarador de eventos para imprimir 520 PrintDocument trabalha em conjuato com o didlogo de impressio © de visualizagio do Windows 521 contetido (sumério) Capitio Maravilhoso, 0 objeto mais maravilhoso da Vila Obieto, persegue seu arqui-inimigo. Sua altima chance de FAZER alguma coisa... 0 finalizador de seu objeto Quando EXATAMENTE um finalizador executa? Disposed) funciona com using, finalizadores com 0 coletor de liso Finalizadores aio podem depender de estabilidade Faca com que um objeto serialize a si mesmo em seu Dispose() Enguanto isso, nas ruas da Vila Objeto.. Uma estrumura parece-se com um objeto. mas no fica na pilha dindmica Valores sio copiados, referéncias sfo atribuidas Estrururas so tipos de valor; abjetos tipos de referencia Pilha dinimica versus estétiea: mais sobre a memiéria Capito Maravithoso... mas nem tanto Métodos de extensio adicionam novos comportamentos a classes EXISTENTES Estendendo um tipo bisieo: string Eades 550 551 554 contedido (sumario) LiNQ Controle seus dados E um mundo voltado para dados... 6 melhor vocé saber como viver nele. Foram-se os tempos em que vocé podia programar por dias, mesmo semanas, sem ter que lidar com montes de dados. Nos dias de hoje, tudo tem relagéo com dados. De fate, vocé com frequéncia vai ter que lidar com dados oriundos de mais de uma fonte... e em mais de um formato. Bases de dados, XML, colecées de outros programas... ¢ tudo parte do trabalho de um bom programador C#. E € ai que o LING entra. Ela ndo s6 permite que se consulte dados de uma forma simples ¢ intuitiva, mas permite também fazer agrupamentos, ¢ unir dados de muitas fontes. Um projeto ficil.. 560 smas os dados estio espalhados pra todo lado. 560 LINQ pode buscar dados em miiliplas fontes . 561 Colegées do NET jé sio preparadas para usar LINQ S61 LING facilita as consuleas 562 ALLINQ ¢ simples, mas suas consultas no deve set 563 ALINQ é versitil 566 ALINQ pode combinar seus resultados em grupos sv Combine os valores de Jeime em grupos Use join para combinar duas colecdes numa tinica consulta Jaime poupa um monte de grana Coneere 2 LINQ a uma base de dados SQL. 577 Use uma consulta de jungio para conectar 0 Starbuzz ¢a Vila Objet 580 xxvi SF Laboratorio C# 3 Invasores ‘Neste laboratério vocé vai fazer homenagem ao mais popular, reverenciado e copiado icone da historia dos videogames, um jogo que n&o precisa de maiores apresentagoes. E hora de vocé desenvolver Space Invaders. O.av6 de todos os videogames 584 E ainda pode ser feito mais... 598 xxvil conteddo (sumério) sobras 2 oss principais topicos que gostariamos de ter incluido neste livro A diversao esta apenas comegando! Mostramos a vocé muitas ferramentas 6timas para desenvolver programas poderosos em C#. ‘Mas néo seria possivel incluir cada uma das ferramentas, tecnologias e técnicas neste livro - simplesmente ndo existem paginas o suficiente. Tivemos que fazer algumas escolhas realmente dificeis a respeito do que incluir © o que deixar de fora. Aqui apresentamos alguns itens que Go sobreviveram aos cortes. Mas mesmo que néo possamos nos aprofundar neles, ainda acreditamos que eles sao importantes e uteis, e queremos dar a vocé uma pequena introducéo «a respeito deles. 1 LINQ para XML 00 2 Refworagio 2 3 Alguns de nossos componentes favoritos na caixa de ferzimentas 04 4 Aplicativos de Console 605 5 Framework de Apresentagio do Windows 606 ‘Yocé sabia que com 0 C# e 0 Framework NET voce pode... 608 ‘Pbackgroundworker1 } Eifiesystemwatcher1 j Bperermancecourtrt vovil 1 Sefa produtive com C# Aplicativos visuais em 10 minutos ou menos Nao se preacupe mde. Com o Visual Studio e 0 C# voc conseguird rogramar tao rdpido que nunca mais queimaré o assado de novo. Quer criar otimos programas realmente rapidos? (0 G#@ uma linquagem de programacao poderosa e uma ferramenta valiosa na palma de ‘sua mao. Com a IDE do Visual Studio voce nunca mais gastaré horas escrevendo ‘cédigo obscuro para um botio funcionar. Mlhor ainda, vocé poder concentrar-se em realizar o seu trabalho, em vez de lembrar qual parémetro de qual método & o nome para um botio e qual éo seu rétulo. Iteressante? Vire a pagina e vamos comegar a programar, este 6.um novo capitulo 4 oct facilita Por que voeé deve aprender C# © CH eo IDE do Visual Studio faciltam o trabalho do oscrovor cédigo © © ZDE- av Visual Stuaio Integrated de desenvolve -lo rapidamente. Quando vocé estiver trabalhando com 0 Develapment Environment Ambiente io Se nas SOO ST oe ees Lnbeprade de Desenvalyinerte) ~€ na pare inportarte de Prabalhar com Cit um pragrama sve Gude & editar sev codigo, serenciar seus enguives epublcar sees prejetos. Aqui vemos o que o IDE automatiza para vocé. Para escrever um programa ou apenas colocar um botéo em um formulério seu programa precisa de um monte de cédigo repetitivo. ( RK fprcces de teda este desenher um befis em Adicionar ah codigo spenes pare um formularia, oe Hons Clememtas visuas 0 que vocé consegue com o Visual Studio © C##... {77570 #2 Zermuilins poderia precisan at de des veer mais ction ‘Com uma linguagem como C#, otimizada para programacao, em Windows, e com o IDE do Visual Studio, vocé pode focar- se no que o seu programa deve fazer: O resuttadeéum plcetive mais tonite I 34244 menos dence ® _ peck er eserthe, 7 Whe Ps Entrada | Vamos comepar Pas ae estrutures | Quo bom? C Bom — Melhor @ Otimo re ore ore Solugdes do Framework .NET a cane aes tarefas de = ee D ‘Acess0 0 dados, 2 Capitutot ‘seja produtivo com C# 0 C# eo IDE do Visual Studio facilitam muitas coisas Quando vocé usa C# © © Visual Studio tem todas estas grandes caracteristicas ao seu aleance, sem nenhum trabalho extra. Juntos, eles permitem que vocé: Faga um oplicativo RAPIDAMENTE. Criar programas em C# leva segundos. A linguagem é poderosa e facil de aprender; ¢ o IDE do Visual Studio faz muito do trabalho automaticamente para vocé. Podem-se deixar tarefas de cédigo simples para o IDE e concentrar-se no que o seu cédigo deveria fazer. Faca uma interface de usuario com boa aparéncia. O Form Designer no IDE do Visual Studio é uma das ferramentas de design mais faceis de usar que existem por ai, Ela faz tanto que vocé descobriré que criar interfaces de usuario lindissimas 6 umas das partes mais satisfatérias de desenvolver um aplicativo em C#. Vocé pode fazer programas profissionois com todas os caracteristicas sem ter de passar horas escrevendo uma interface de usudrio, grafica totalmente do zero. Crie e interaja com bases de dados. O IDE inclui uma interface simples para construir bases de dados e integra-se perfeitamente ao SQL Server Express, ossim como muitos outros sistemas de base de dados populares. Concentre-se em resolver seus problemas REAIS. O IDE faz muito, mos vocé ainda esta no controle do que é feito com o C#. Ele permite-the concentror-se em seu programa, em seu trabalho (ou diverséo!] e em seus clientes; mas cuida de todo o trabalho repetiivo, como: ‘& — manter o registro todos os seus projetos; %* facilitar a edigéo do cédigo de seu projeto; + — manter o registro sobre os graficos, dudio, cones e outros recursos de seu projeto; 4 gerenciar e interagir com bases de dados Isto significa que todo 0 tempo gasto para esta programagiio de rotina pode ser seu e usado para eriar programas muito legais. * \ x Vocd verd exetamente o sve gueremes diser a seguir, voeé esté aqui> 3 0 chefe precisa da sua ajuda Ajude o diretor geral a eliminar os papéis ‘A Empresa de Papel Vila Objeto contratou um novo diretor geral. Ele adora fazer caminhadas, café e a natureza... ¢ ele decidiv ojudar a salvar as florestas; quer ser um executivo “sem papel”, comegando com seus contatos. Ele esté 0 caminho de Aspen para esquiar no fim de semana e quer ter um novo programa de agenda pronto quando voltar. Caso contrario... bem... ndo sera apenas 0 antigo diretor geral que estard em busca de um emprego. em tane smth Qn nrrracee § methan vecd encombrar nv: XE apidanerrtecome forme Poni ages Ir ats erbraren ne SS serfs dees on a Conhega as necessidades dos usudrios antes de comegar a fazer seu programa Antes que possamos comecar a escrever o aplicativo de agenda - ou qualquer outro programa ~ precisamos de um minuto para pensar em quem ira usé-lo e o que eles precisam que seja feito. © Odiretor geral preciso conseguir executar seu programa de agenda no trabalho e também em seu notebook. Ele precisaré de um instalador para ter certeza de que todos os arquives corretos estejam em cada maquina. O diretor suer poder executar Btu pragrama ne desktop @ ne notebook, tntia um instaladar € ume necessidede, 4 Capitulo 1 ‘seja produtivo com CH @® — Aequipe de vendas da Empresa de Papel Vila Objeto quer ‘acessar sua agenda também. Eles podem usar seus dados para fazer listos de e-mail para obter mais ordens de compra de popel de seus cliente: O diretor geral acha que uma base de dados seria a melhor forma para que todos na empresa pudessem fer acesso aos dados dele. Assim, ele pode manter apenas uma copia de todos os seus contatos. Uk sabemos sve o Visual Cit facilitao trabalha com base? de dados. Ter 05 es cedabos em uma base de dades permite § eter ea cqupe devendas Penkim actsse 35 informagies, ainda sve mio existe apenas ume copie das Hades vocé esta aqui> 5 vamos comocar Aqui esta o que vocé vai desenvolver Yocé precisara de um aplicativo com uma interface gréfica de usudrio, objetos para comunicarem-se com uma base de dados, a propria base de dados e um instalador. Parece muito trabalhoso, mos vocé fara isto tudo nas proximas paginas. Aqui esté o estrutura do programa que criaremos: Owleetiys Me dedas Fem ome cemeda Sereda tote, ave 7 IE COM 6 base de. dedos, { Objetos Visuais .NET Objetos de Base de dados .NET (nrnecr | {=onner [orowcurone | '|==ao_) ~ atmos epee agerae re rte form! Vamas precisar de objetes pare comunicarem-se com nassas tabeles, um diasrama para Seger com gue nessa aplcetiva saibe gual € a estrutura de base de dados e ovtras coisas mais. 6 Capitulo t Os dedos sé eo ermasenades em ma tebele ne base de dedos SQL. Server bape Armazenamento de Dados Tobelo objetos de suporte de diagrama de BD (base de dados) Aayi exti a base de dates em st, ue e Visual Studie nos Gudara ecrtar e mater, ‘seja produtivo com C# rama Fenhe side iuide mum pacote de feito, ele ser ‘nstelader do Windows. ‘ J Pacote de Distribuigao Arquivo do programa © departments de Verdes precisan, Pens spemtan e cheer pare instelan © etfs, user sey Presrama, vocé esta aqui> 7 0 que voeé faz no Visual Studio... Vé em frente e instale o Visual Studio, se ainda néo 0 fez. Pule a pagina inicial e selecione New Project (novo projeto) no menu File (Arquivo). Nomeie seu projeto como “Contatos” e clique em OK. As coisas podem parecer um pouco diferentes Veja bem! em sewive. | Esta & a aparéncia da janela ‘New + Project” (Novo Projeto) no Visual : Studio 2008 Express Edition. Se ! vooé estiver usando a edi¢ao | Professional ou Team Foundation, :pode ser um pouco diferente. Mas néo se preocupe, tudo ainda funciona exetamente da mesma Horma. 0 que o Visual Studio faz por voré... — Cortifigve-se de salvar sev projete assim Quando vocé inicia um novo projeto, assim que vocé o salva, o IDE cio os arguives Formic, Fermi. Designee, Progrem cs Ele ge2 copies see ae Hh aver ‘acrescenta-os 4 janela Solution Explorer (Navegador de Solugéo) Tada) no menu Fite Pirguive) iste e, por padrao, coloca-os em Meus Documentos\Visual Studio salvart todos 03 aryuives de projete, Se 2008\Projects\Contacts\. vece selecionan Salvar, somemte ayvele ne f PUREE Ge vs ive comtem o Estes codigo Ce ye eee. canpartamento de formular Form! .Designer.cs i OVisval Studio ceria cates trbs anguives avtomaticamente, 8 Capitulo 1 seja produtivo com C# stern seu lapis Abaixo vemos como, provavelmente, sua tela esté agora. Voce ja deve ter percebido que a ‘maioria destas janelas e arquivos se baseiarn no que voce ja sabe. Preencha cada um dos ‘espacos em branco com uma anotacdo, tentando descrever o que aquela parte do IDE faz. ‘Adlantamos seu trabalho fazendo um para voce. ssi Sto sev DDE nl Liste barca de Ferramentas possi nto parece exatamente com softs crvespanuertes to weyest 6 derte fra, yoct pode seleconr Reset Saptimas cote janele cab fasenda atvalmente ne DDE. inden Layeut (Reiner oLegout das tenga BE VeeE inelas) ra menu Window Genel). ‘a mais espace, (al Solution ‘Contacts’ (1 project) s@ Oita Voc também pode contigurar i ma Properties aessesjenelas, selecionande Selvcion Explorer, Prepriedade de ence ave partir de liste Sxibin menv. voce esta aqui> 9 ‘conhega seu IDE Aponte seu lapis ~“~ Solugao Preenchemos os campos com as anotagdes sobre as diferentes secdes do IDE do Visual Studio Cd. Voe8 pode ter escrito algumas coisas diferentes, mas j deve ter percebido o basico sobre as finalidades de cada grupo de janelas do IDE. jena Fase Prmpliamas essa jane! belie gee erates passe abeixe pare gue voce Femhe fo correspendem aa 2 7. oh ance rte rd = fssadacaine de Fervamentas, Geer controles visuals 4 guevectpede arrester pare seu fermulari, ; iste janele , isles pede: Liste painel abaixe € ropriedades SS pare depuragio HE cambraes em rie guende ba formularicn nso, : Lae [#] E] ¥ (a Solution ‘Contacts' (1 project) = @Contacts me cen ne Navegide @- Ga Properties as Vocé pede ie Pe rece ae ngpives: x, de 50g es arguives i» Gal References ‘ese dor de Salus de Form/.c5 € Fee Z Form1.cs DE. a 5 res vie i @ Program.cs na 10 Capitulo 1 P: Se 0 IDE escreve todo esse codigo para mim, aprender C# é apenas uma ‘questao de aprender como usar 0 IDE? R: Nao. 0 IDE é timo em gerar ‘automaticamente algum cbdigo para Yoo’, mas é sb isso que ele pode fazer. Ha algumas coisas em que ele & muito ‘bom, como estabelecer bons pontos de arta e mudar propriedades de controles automaticamente em seus formulrios. Mas a parte dificil da programagao ~ descobrir ¢ implementar 0 que seu programa precisa fazer - é algo que nenhum IDE Pode fazer por voo8. Embora 0 IDE do ‘Visval Studio seja um dos ambientes de desenvolvimento mais avancados, ele 86 pode ir até esse ponto. E voce — nao IDE~que escreve 0 obtigo de ago, ou 0 cédligo que faz 0 trabalho P:Eu oriei um novo projeto no Visual Studio, mas quando entrei na pasta “Projetos”, em Meus Documentos, ndo vilé, O que acontece? R: Em primeiro lugar, voo8 deve estar usando o Visual Stucio 2008 = no 2005 iss0 no acontecia. Quando \océ cria pela primeira vez um novo projeto no Visual Studio 2008, 0 IDE (fa 0 projeto em sua pasta Local Settings \application Data\ ‘TemporaryProjects. Quando ‘oo’ salva 0 proto pela primeira vez, cle pede, através de uma janeta, um ‘novo nome de arquivo e salva-o na pasta Meus Documentos \Visual Studio2008\Projects. Se voce tentar abrir um novo projeto ou fechar © temporéro, uma janela se abiré para Perguntar se voce quer salvar ou descartar ‘oprojeto temporéro. P: Ese o IDE criar cédigo que eu nao ‘queira em meu projeto? nie existem Perguntas Idietas RR: Voce pode modificé-o. 0 IDE é feito pea crir o cSdigo baseando-se na forma ue o elemento que vooe arrastou ou adicionou é mais usado comument. Mas, as vezes, nBo & exatamente isto que voos (quer. Tudo que o IDE faz por vooé — todas a inhas de cédigo que ele cra, todos os arquivos que adiciona — pode ser aterado manvaimente, edtando-se os arquives, ou através de uma interface simples de usar no IDE. P: Tudo bem se eu baixei e instalei o Visual Studio Express? Ou eu preciso usar uma das verses do Visual Studio que nao so de graca para fazer 0 escrito no livro? R: Nao ha nada neste livo que voce nao ossa fazer com a verso gratis do Visual ‘Studio (que vocé pode baixar na pagina dda Microsot). As principals diferengas entre o Express @ as ouras edigbes (Professional Team Foundation) nfo atrapalharSo a forma de escrever em Cit © de car aplcativos totalmente funcionais @ completes. P: Posso mudar os nomes dos. arquivos que 0 IDE cria? R: Ciaro, voce pode mudar qualquer ‘aspecto de seu programa. Mas 0 IDE esté ‘programado para nomear seus arquivos de forma coerente. Quando vocé adiciona umm arquivo ao seu projeto, o nome do arquivo que voc escolne afeta a forma na qual o cécigo € gerado eo cédigo criado incliré esse nome. Em alguns casos, se ‘vooé renomear 0 arquivo, ou teré de mudar ‘outras partes em todo 0 cédigo, ou teré e lidar com a dferenga entre o nome do arquivo e do cédigo dentro dele. Jé que isto 6 um pouco incdmodo, recomendamos ue vooé no mude os nomes dos arquivos a nfo ser que tenha uma boa razéo para isso. seja produtivo com C# Pe Estou olhando para o IDE neste momento, mas minha tela néo parece com a ‘sual Algumas janelas estio faltando e outras ‘esto no lugar errado. O que acontece? R; Se vooé clcar no comando "Reset Window Layout” (Reiniciar Layout de Janelas) no menu "Window (janela), 0 IDE deve restaurar 0 layout padrao das janelas. Enlao sua tela fara igualzinha as deste capitulo, O Visual Studio gerard eédigo que pode ser um pento de partida para seus aplicatives. Cextificar- se de que o aplicative faz aquilo que deve fazer ainda cabe a You8. vocé esté aquir 11 uma caixa de imagens vale mil palavras Desenvolva a interface de usuario ‘Adicionar controles ¢ arrumar a interface de usuario é tao facil quanto arrastar e soltar no IDE do Visual Studio. Vamos acrescentar um logo ao formulério: Utilize o controle PictureBox para acrescentar uma figura. Clique no controle PictureBox (caixa de imagem) na Caixa de Ferramentas e arraste-o para o seu formulario. Nos bastidores, © IDE adicionou cédigo em Form].Designer.cs para um novo controle de imagens. [) "Forze Toeson [Sat Pe dade cope artele ne Sarma i, es natn ce Deere rade oe Tudo bem se vocé nao for um Relaxe profissional em design de interface de usuério. Falaremos muito mais sobre criar boas interfaces de usuério mais tarde. Por enquanto, vamos apenas colocar 0 logo e outros controles em seu Hfermulério e preacupar-nos com o comportamento. | Adicionaremos mais um pouco de estilo mais tarde. Form! Designercs 12 Capitulo 4 seja produtivo com C# Vocé esté aqui —@ ~S) is ge Coloque a caixa de imagem em modo Zoom. Todos 05 controles em seu formulério possuem propriedades gjustéveis. Clique na flechinha preta para um controle para acessé- las. Altere a propriedade Size (Tamanho) da PictureBox para “Zoom” para ver como isto funciona: Cigue esse flechinka poeta pare acessar uma propriedade de vm * Fort camtrole, 4 Gorey Soe Mode | eden oa ‘Choose Image = Stretchinane autosae cocker » yea borde ae Lscolhe Boom pars ‘a Ga caina ae imager muse P* connes ponder sce colocov tamanho de Figvre derrbre delle weve Baixe 0 logo da Empresa de Papel Vila Objeto. Baixe o logo da Empresa de Papel Vila Objeto dos laboratérios do Use o Cabeca (www.altabooks.com.br) e salve-o em seu disco rigido. Entao clique na sete de propriedades da PictureBox e selecione Escolher Imagem. Clique em Importar, encontre seu logo esta tudo pronto: voce esté aquim 13 conservando os recursos naturals do c# Visual Studio, nos bastidores Toda vez que vocé faz algo no IDE do Visual Studio, ele esté escrevendo cédigo para voré. Quando vocé criou 0 logo e mandou o Visual Studio usar Jagem baixada, ele criou um_ recurso e associou-o com sev aplicativo. Um recurso é qualquer arquivo grafico, de éudio, icone ou outro tipo de arquivo de dados embutido no seu aplicativo. O arquivo grafico fica integrado oo programa, para que, entéo, quando ele for instalado em outro computador, © grafico seja instalado junto com ele e a PictureBox possa usa-lo, Quando vocé arrastou © controle PictureBox pora o seu formulério, 0 IDE automaticamente criou um arquivo de recurso chamado Form] .resx para armazené-lo e manté-lo em seu projeto. Dé um duplo clique neste arquivo e vocé veré a imagem recém-importada. olution Explorer - Solution ‘Conta. Fa EE [Solution ‘Contacts' (1 project) Se vad clear em Forwd-resn ne laresader de Selucia pade yer a lagomarce impartada, Este arguive 6 & @BContacts conectade cena de imagens 0 TOE” aa Properties tdicioney cadize pare faser a context @ a References FormL.cs ® Form 1.Designer.cs 2 eS @ Program.cs nite ct a eben fotos ee eeunses (gratices video, audio seine dados armasenade® vasociades wo Form! 14° Capitulo 1 execute o aplicativo (sim, jé!) ‘seja produtivo com C# Complete 0 cédigo gerado automaticamente 10 para vocé, mas vocé ainda quer ter acesso a ele ‘acrescentar-lhe coisas. Vamos usar 0 logo para mostrar uma caixa de mensagem sobre quando os usudrios executarem 0 programa e clicar cobre o logotipo. Certifique-se de que seu formulério aparece no IDE e clique duos vezes no controle de caixa de imagem. Vocé deve ver algum cédigo semelhante ao seguinte oparec Quando voct clicev dvas veses no contrale de caine de imagen, 0 DDE cviau este metode, tle serd excevtad npr ot om osu lar ns loge com o plc tm public partial public For ( enecuga nom ae mttode re sire tialize ponent 0) divine ben idee Qvande voct clicar dvas veses na caixa Ae imagem, ela abrira este codigo com um curser piscande bem agui. Lsnore sealer janela ve o DDE mosfrar enguarrte voce digits, Le esti tentando Gjudi-le mas nite precisames disse asore, apes, Perguntas idictas ‘P: Oque é um método? P= 0 que aquele \n faz? Um método é apenas um bloco de codigo com R;: Isto 6 uma quebra de linha, Ela fala ao C# para tum nome. Falaremos muito mais sobre méiodos no colocar ‘Contact List 1.0" na ina um, e entéo comecar capituo 2 uma nova linha para “Writen by.” (Escrito por) Vocé jé pode executar seu aplicativo isses tres betes Funcianam ~ ¢ voce nite Pressione F5 no seu teclado ou clique no botdo com a seta Feve que escrever nenhum verde | \p, ) na barra de ferramentas para checar 0 que vocé fez até agore. (Isto se chama “Depurar", 0 que significa ‘apenas executar seu programa usando o IDE). Vocé pode parar de depurar selecionando “Stop Debugging” (Parar a Depuragée) no menu Debug (Depurar) ou clicando neste botéo na barra de ferramentas: ja Be coaibicty aparece vocs esta aquih 15 Onde estéo meus arquivos? Oca enna nfo exister seepragrimanan [| Ferguntas Hdiotas Quando voct executa sev programa, 0 Visual anguive gue vace Bite bopla todos genoa ta js pen Mati ale eatciVar, P: No meu DE, a seta verde esta marcada Documentos\Visualstudio 2008\Projects\ 774° cio "Dab S60 Tle? Contacts \Contacts\bin\debus. Vocé pode fecessar repidamente esse diretério e executor ¢xeeU#ivel,Yee®.o | RN, Depurar, elo menos para nossos seu programa clicando duas vezes no arquivo encentrara: ‘4g’, ma] propositos agora, significa apenas executar sew .exe que o IDE cria. paste de See aplicativo dentro do IDE. Falaremos muito mais a sobre depuragio adiant, Por enquanto, voo8 pode pensar sobre isso como uma forma de Program.cs B R: Obotéo Stop Debugging aparece apenas em ‘uma barra de ferramentas especial que, por sua ‘vez, aparece somente quando seu programa esta em execucdo, Tene iniaro aplcativo de novo e ‘veja se ele aparece, executar seu programa. a ‘P: Eu no vejo 0 botio Stop Debugging em minha barra de ferramentas. O que acontece? Confads proj = 8 e Form) esx Lasse nie éum enre: existem dois niveis de pastes. At peste interna possul os arguives de codigo Ci# em si. que ja fizemos até agora Criamos um formulério e um objeto PictureBox que abre uma caixa de mensagem quando clicamos nela. A seguir, precisamos adicionar todos os outros campos do cartao, como 0 nome para contato e telefone. Vamos armazenar essa informacGo em uma base de dados. O Visual Studio pode conectar campos diretamente a ela, ou seja, néo precisamos fazer uma bagunca com um monte de cédigo de acesso a dados (0 que 6 bom). Mas para funcionar, precisames criar nossa base para que os controles no formulario possam usar seus dados. Entéo vamos pular dos objetos visuais .NET direto para a segéo di armazenamento de dados. eget en Be Bow passe € pare contetar Assim, precisemas concentrar-nes neste esse formularie «nessa pelea bees ae + mas ainda precisames dt base de dades, Lose, ainda Pye rte ess objebes parainterasic —~ na estanas prombos pare inozsa base de dados SEE cam 05 dads pve colocaremes tstepels nie temes una base colbcar alguns dados Tse om nessa base de de de dades. Iniciats mela, 0 Visual Studio pode eriar eédigo para conectar seu formuldrio a uma base de dados, mas vocd precisa ter a base de dados no lugar certo ANTES de gerar 0 cédigo 16 Capitulo 1 doixe para mais tarde seja produtivo com G# Precisamos de uma hase de dados para armazenar nossas informagoes Antes de adicionarmos o restante dos campos no formulério, precisamos @—_ criar uma base de dados para associar-Ihe. O IDE pode criar muito codigo: para conectar nosso formuldrio com nossos dados, mas precisamos definir o propria base de dados primeiro. @ _Adicione uma nova base de dados SQL ao seu projeto. No Navegador de Soluséo, clique com 0 botée direito no Projeto Contacts e escolha New Item (Novo Item). Escolha o icone SQL Database (Base de Dados SQL) e nomeie-o ContactDB” mdf. Este arquive € nossa Se nova base de dades, “yen - ContactDB.mdf : Estotha o foone = certo para.a verso que voc’ © esté usando. , Escoiha SQL SSOSSE enone © icone SQL Database eae BS uw a funciona opens 5€ 0 Visual Studio ona 2RDk waste HRW sear Voce Hiver 0 SAL ‘Express 2005 € ad oy Server txpress seen i @ & @ instalade, Volte pare aatane (Gave ste omen) age oer eke e MEADE thee ‘em Servigos) 56. ‘wo So dash ae me) se vace nie tem oe See ume eer sa sobre como aaa faser tre), @ Concele o Assistente de Configuracao de Fonte de Dados. Por enquanto, queremos pular a configuracao de uma fonte de dados, entao clique no botao Cancelar. Voltaremes a isto quando tivermos criado a estrutura de nossa base de dados. Se vocé ndo esta usando a edicdo Express, vera “Server Explorer”, em vez de “Database Explorer”. Veja bem! As edigdes Professional € Team Foundation do Visual © _ Examine sua base de dados no Navegador de Solugao. Va para 0 Navegador de Solucéo e vocé ver’ que ContactDB foi adicionado 4 lista de arquivos. Clique duas vezes em ContactDB.mdf e olhe no lado esquerdo de sus tela. A Toolbox mudou para Navegador de Base de Dados. Studio 2008 no possuem uma janela de Navegador de Solugdo chamada Database Explorer (explorador, ou navegador, de base de dados). Enr vez disso, elas possuem uma janela Server Explorer (navegador de servidores), que faz tudo que @ Database Explorer faz, mas também Ihe permite explorar dados em sua rede. voes esté aqui> 17 O IDE criou uma base de dados Quando vocé mandou 0 IDE adicionar uma nova base de dados SQL ao seu projeto, ele criou uma nova para vocé. Uma base de dades SQL 6 um sistema que armazena dades para vocé de uma forma organizada e inter- relacionada. © IDE tem todas as ferramentas de que vocé precisa para manter seus dados e bases. Os dados na base de dados SQL ficam em tabelas. Por ‘enquanto, vocé pode pensar em uma tabela como uma planilha. Ela organiza sua informacéo em colunas & linhas. As colunas séo as categorias dos dados, como nome e telefone de contato e cada linha sao os dados em si para uma ficha individual. Vocé est aqui muna plan ( yobelo Precedimemtos armazenades stored, ee ct comandas pare faciivver trabelhe com seus dadas. SQL é uma linguagem em si mesmo SQL significa Linguagem Estruturada de Weave 8 Consulta (Structured Query Language). £ uma " linguagem de programacéo para acessar dados A base de dados SQL esta em bases de dados. Possui sua propria sintaxe, neste arquive, Agera vamos polavras-chave e estrutura. O cédigo SQL tema detourchebelisigedis, forma de comands e consultas, que acessam aielee fueatedke e recuperam os dados. Uma base de dados SQL aap aided ak al pode possuir procedimentos armazenados. armasenede agui também, (stored procedures), que s60 varios comandos consultas SQL armazenados na base de dados ContactDB.mdf @ podem ser executados a qualquer momento. © IDE gerou comandos SQL e procedimentos armazenados automaticamente para vocé para permitir ao seu programa acessar os dados na base de dados. Bx [nota do marketing: pedemes colecar uma referencia sobre 0 Vee a Cabesa SAL agui?) 18 Capitulo 1 armazenamento de dados facilitado Criando a tabela para a Lista de Contatos Tomos uma base de dados e agora precisamos armazenar informagées nela. Mas, na verdade, nossas informagées tem de ir para uma tabela, estruturas usadas pra guordar porcoes individuais dos dados. Para nosso aplicativo, vamos criar uma. tabela chamada “People” (pessoas) para armazenar todas as informagées para contato: Adicione uma tabela a base de dados ContactDB Clique com 0 botao direito em Tables (tabelas) no Navegador de Base de Dados e selecione Add New Table (Adicionar Nova Tabelo). Seré aberta uma janela conde vocé pode definir as colunas na tabela que ecabou de criar. ‘Agora precisamos adicionar colunas @ nossa tabela. Primeiro, vamos adicionar uma coluna chamada ContactiD na tabela People, para que cada registro de Contato tenha sua propria identidade nica. Adicione uma coluna ContactiD a tabela Peopl Digite “ContactID” no campo Column Name (nome da coluno) e selecione Int na caixe de combinacdo Data Type. Certifique-se de desmarcar a caixa Allow Nulls (Permitir Nolos). Finalmente, vamos fazer desta coluna a chave primaria de nossa tabelo. Selecione a coluna ContactID que acabou de criar e clique no botéo Primary Key (Chave Priméria). Isto informa @ base de dados que cada linha teré um valor unico de chave primaria, soja produtivo com C# nio exisom [——Perguntas idiotas —— P: O que é mesmo uma coluna? R: Uma coluna ¢ um campo de uma tabela, Entéo numa tabela chamada Pessoas, vocé pode ter uma coluna para Primeiro Nome e outra para Sobrenome, Ela sempre tera um tipo de dado, também, como String (seqincia de caracteres), Date (data) ou Boo! (boolean), P: Por que precisamos desta coluna ContactiD? RR; Ele ajuda @ ter uma Gnica identidade (1D) para cada registro na maioria das tabelas em bases de dados. Jé que estamos armazenando informagbes de contato para pessoas individuais, decidimos criar uma coluna para isso e chamé-a de ContactiD ‘P: © que aquele int em Data Type significa? R: O tipo de dado (data type) informa a base de cdados qual tipo de informago ela deve esperar de uma coluna. Int signifea apenas um nimero intro Entao @ coluna ContactiD teré numeros inteiros rela. P: Tem muitos detalhes ai. Eu deveria entender tudo isto? R: Nao, tudo bem se voo# nao entender tudo agora. Concentre-se nos passos basicos. Gastaremos muito mais tempo com base de dados ‘nos tilimos capitulos. Se vooé esta curioso para saber mais agora, pode sempre ler o Use a Cabega ‘SQL junto com este livro. Mae Uma chave bo bata Primary Key aad) ia gjvde sue he de dads 0 procurer ‘primari idadas repidamerte voce esté aqui 19 vamos tabelar a discussao © Mande a base de dados gerar identidades automaticamente. Ja que ContactID é um numero que serve para a base de dados e NG para nossos usuarios, podemos mandar nossa base lidar com a criagéo e atribuicao de identidades automaticamente. Desta forma, néo temos que nos preocupar em escrever cédigo para fazer isto. Vocé esté aqui Nas propriedades abaixo de sua tabela, desca a barra até Identity erretl Specification (Especificacdo de Identidade), clique no botéo + e we vect deine slecione Ye sim) i “ tity” jie ). selecione Yes (sim) perto da propriedade “Is Identity” (E Identidade) eae ee yet as tspajeree eee ‘oma 4 chave es art at Oa primarie € 4 forma euees A RE tia goal pmasenerte Stu programa lace lcaligar registros, ela sempre precisa ter um valor, Leto faré com $C cenpo Combat ID se étuatise fs swtameticamente Os espagos em branco no cartao de contato sao colunas sempre sue um rove registra for na tabela People Adicionade, Com uma chave priméria para o tabela, € preciso definir todos os campos que serdo mantidos na base de dados. Cada campo em nosso cartéo de contato impresso deve tornar-se uma coluna na tabela People. a ee nome ndstes XY wee 2) 58029 7 fet lve th@ryaaasien om Sin £ ) ‘ (__--fi>PODER DO Pir cal pesices Cate eee CEREBRO armasenar dades: Seu nome, emp nance he fee 08s SOU Meme, CMPCESA, Mee ne cand, Que tipos de problemas poderiam resultar OPO mE all se cla Cum chemte de ME Ser mane do armazenamento de vérias linhas para a Cee dete da sve biting ligecia, PAr4 Une colina », mesma pessoa? ele Pe = 20 Capitulo 1 ‘seja produtivo com C# . -————* “ae a ewe ‘Agora que vocé criou uma tabela People e uma coluna de chave priméria, precisa adicionar colunas para todos os campos de dados. Veja se consegue descobrir qual tipo de dado combina com cada uma das colunas em sua tabela e também associe 0 tipo de dado a sua descrigdo correta. Nome da Coluna Tipo de Dado Descrigéo Last Call (ultima ligagao) Este tipo armazena uma data e hora . Name (nome) at Um tipo verdadeiro/falso boleano ContactiD fn Uma seqiiéncia de letras, numeros e outros caracteres com um comprimento maximo de 50 lient? char? nvarehar(50) Um numero inteiro datetime voce esté aquir 21 6 bem o meu tipo * a Quem Dan: Agora que voce criou uma tabela People e uma coluna de chave primaria, precisa adicionar colunas para todos os campos de dados. Veja se consegue descobrir qual ipo de dado combina com cada uma das colunas em sua tabela e também associe o tipo de dado & sua descricdo correta. Nome da Coluna Tipo de Dado Descrigéo Last Call (Ultima ligagao) Este tipo armazena uma data e hora Name (nome) at Um tipo verdadeiro/falso boleano ContactID ~ Uma seqiiéncia de letras, ndmeros e outros caracteres com um comprimento maximo de 50 Client? eenstl=) Um numero inteiro datetime 22 Capitulo 1 ‘mapoie tudo sofa produtivo com C# Termine de construir a tabela Volte para onde inseriv a coluna ContactlD e adicione as outras cinco colunas do cartéo de contato. Aqui vemos com 0 que sua tabela de dados deveria se parecer quando voce terminar: Vocé esté aqui “se vackcancele” * selegao em Aitow Nuits, « celune ame! ‘varchan(§0} ‘wvarcha(S0) rwvarchan(£0} Os campos bit possvem valores Verdadtiro cs ong yn valor ov False ¢ podem ser | datetime eve Fer um valere representades come i toma caine de checagen, | Aiguns carties podem ‘ter inbormasies + “Yaltande, extico Clique no botée Save na barra de ferramentas para salvar sua nova deinaremes algumas tabela. Um nome seré solicitado, Chame-a de “People” @ clique OK. colunes em brine eed Temas referiden nes nessa Pabela come 1a Pabela People, > ay Faga um diagrama com seus dados para que seu aplicativo : possa acessa-los Uma vez que voce tenha criado sua base de dados e tabelas, tem de fazer com que seu aplicativo saiba sobre eles. £ aqui que usamos um diagrama de base de dados: uma descricéo simples de sua tabela que o IDE do Visual Studio pode usar para trabalhar com os dados. Ele também permite que o IDE gere automaticamente comandos SQL para adicionar, editar e deletar linhas na tobela @ rie um novo diagrama de base de dados. — Vé para a janela Navegador de Base de Dados clique com 0 botdo direito no né Database Diagrams (Diagramas de Base de Dados). Selecione Add New (fl Owecarectors BG conscck ! —, Diagram (Adicionar Novo Diagrama) Ca Tables |) Ad New Dragram Fe nang Gl] tore Lembre-se, estas opgies estia_> epee el cone todas dentro de Contact)B, & ater entio todas se apticem a este a ects base de dados especifica, vocs esta aquir 23 24 Deixe que o IDE gere 0 cédigo de acesso. Antes que vocé informe ao IDE sobre sua tabela especifica, ele precisa criar ‘alguns procedimentos armazenados bésicos para interagir com sua base de dados. Apenas clique em Yes aqui e deixe o IDE fazer 0 trabalho. \Q) revere sorte nsrmrect te a tse i dap she Se Ce5Ce 5 O DDE sere varios procedimemtas armasenades sve paratben as seu tills ‘berasir com « base de dades gue voed eriov, Selecione as tabelas com as quais vocé quer trabalhar. Selecione a tabela People na janela que aparece e clique Add (adicionar). Agora o IDE esta pronto para gerar cédigo especifico para sua tabela. Capitulo 1 ‘seja produtivo com C# Vocé esté aqui © _ Chome seu diagrame de PeopleDiagram (Diograma de Pessoas). Selecione File>Save Diagram. Sera solicitado que vocé dé um nome ao seu novo diagrama de base de dados. Chame-o de PeopleDiagram e ae estord tudo pronto. Se vecé estiver usando 0 Visual Studia ZOOS jem ves disto, selecione é File>Save Fil, o anges tte “ aes rete Oe sua wit aaNet at eit, eB Contacto ops IRN Eee sig! | company Telephone Email Cent “ Lscal Se voce hovvesse evtras Fabelas na base de dedos gue guisesse diagramar, elas apareceriam agui tambem, See Studio. O IDE entdo usa este diagrama para gerar cédigo automaticamente para trabalhar com sua base de vocé esta aqui 25 Insira seus dados dos cartées no banco de dados ‘Agora vocé esté pronto para comegar a adicionar os cartées no banco de dados. Aqui estéo alguns dos contatos do chefe ~ vamos usé-los para comecar a adicionar alguns registros no banco de dados. Expanda Tables e entéo clique com 0 botao direito na Tabela People no Navegador de Base de Dados (Database Explorer ou Server Explorer) e selecione Show Table Data (Mostrar Dados da Tabela). Show Table Dota Uma vez que vocé tenha visto as linhas de grade da tabela na janela principal, todos os dados abaixo. (Vocé veré todos os valores NULL - nulos - primeiro - Dye fe au False me Sev trebatte é aa Selocar as dees de dos e550 seis certits na tabele ple, apenas digite sobre eles Cent £033 quando voce adicionar sua calv™ armas primeira linha. Ignore os me Zeal, pontos de exclamacéo que a farmagees AE ‘aporecem juntos aos dados). 7, Yocé nao precisa preencher © coluna ContaciD. Isto & feito automaticamente. Nome: Lucinda Ericson @.. Pct Via Cre Empresa: Ericson Events Nome: Lloyd Jones @. ‘Tolono: (212)555-9523 1 Poel Via Oo Empress: Black Box ine. Exmat Lacy @EricsonEvents.info Teleone: (718)555-5638 tent: NGO nine contate: 17/05/07 Emait: LJones@Xblackboxine.com Conte: Sim Uttine contato: 26/05/07 28 Capitulo 1 — ‘Nome: Matt Franks Empress: XYZ Industries “Toleone: (212)555-81125 ‘emai: Matt.Franks@XyZindustriescom inte: Sim Qn erence ‘mimo contato: 26/05/07 ‘Toieone: (614)593-3641 ‘Eman: Sarah@KRS.org ‘lente: Nao Nome: Laverne Smith Empresa: XYZ Indastries ‘elotone:(212)555-8129 ‘E-mat: Laverne.Smith@XyZindastriescom Conte: Sim ‘tio contato: 26/05/07 nme sro aner — Down srs Empresa: Kalter, Riddle, & Stott tine contate: 10/12/05 ‘seja produtivo com C# @ _ Uma ver que voce tenha acrescentado todos os seis registros, selecione Save All no menu File novamente.\———~_ Isto deve salvar os registros na base de dados. nao existem fr Perguntas Idiotas ‘P: Entdo 0 que aconteceu com os dados depois que eu 0s acrescentel? Para onde eles foram? R: 0 IDE armazenou auiomaticamente os dados que vooé acrescentou na tabela People em sua base de dados.Atabela, suas colunas, os tipos de dados e todos os dads denito dela estio todos guardados num arquivo do SOL Server Express, ContactDB mdf. Esse arquivo é mantido como parte de seu projeto & 0 IDE o atualiza apenas como o fez com seus arquivos de datos, quando voc# os tera, dadeos com 0 codige ‘Dt salvar it manda & eee ee apliceHive. tie Taisecente de Save, WE rquive ne P: Certo, eu acrescentei esses seis registros. Eles serao parte do meu programa para sempre? R: Sim, eles sao tho parte de seu programa quanto o cédigo que voce escreveu e oformulrio que esté criando. A diferenga & que, em vez de ser complado como um programa executive, 0 arquivo ContactDB mdf & copiado e armazenado junto com o executivel. Quando seu apicativo procisar acessar os dados, ele I8 © escrave em ContactDB maf, no dretrio de saida do programa. vocd esti aqui 27 adicionando sous dados Conecte seu formulario a sua base de dados usando uma fonte de dados Estamos finalmente prontos para desenvolver os objetos de base de dados .NET que nosso formuldrio usaré para se comunicar com sua base de dados. Precisamos de uma fonte de dados, que é realmente apenas um grupo de comandos SQL que seu programa usaré para se comunicar com a base de dados ContactDB. ect precisa fechan tambs « tebele de dedes suerte o @ _Volte para o formulario do seu aplicativo. dasrama pera vatbe Feche nossa tabela People e o diagrama da base de dados Formulinia, ContactDB. Agora a aba Form! .cs [Design] deve estar visivel. 7 ao seu sim 1a systems 1200 Sosa 12a ranopone 2 sistem 12a @ Adiicione uma nova fonte de dados ao seu aplicative. Isso i6 deve ser facil neste ponto. Clique no menu Data (Dados) e entao selecione Add New Data Source (Adicionar Nova Fonte de Dados)... na caixa de selecdo. a tombe de dedos B06 808 Ost enangs . teri com tasay oe? ARS ee [ome a Ta wee ta Deguokets (DI Sow ote scarves svt vatod Pare OTtre seu IB Prevow ata, wikrise v8 bese | Ae dedes, | Aosnen bas sauce. eal 28° Capitulo 1 s9ja produtivo com C# 4 © configure sua nova fonte de dados. Vocé estd aqui Agora vocé precise configurar uma fonte de dados para usar sua base ContactDB. Eis o que vocé tem de fazer: 4k selecione Database e clique no botdo Next (proximo); 4k clique em Next na tela “Choose your Data Connection” (Escolha sua Conexio de Dados). 4 Na tela “Save the Connection’ (Salvar a Conexéo) que segue <— cerfifique-se de que a caixa de checagem Save esteja marcada. ‘ete de dedos e clique em Next. “ 4 Na tela “Choose Your Objects" (Escolha seus Objetos), clique na caixa de checagem Table (Tabela). +k No campo Dataset Name (Nome do Conjunto de dados), cerfifique-se de que esteja escrito "ContactDBDataSet” e clique em Finish (Terminar). a conte de Aes trae tee Ate ava bara iste arguive éa sua ‘y ContactDBDataSet. pret er sbives oi, eee base de dedos. Sepetes pe fang ghee Oe Ayer esti, SU Formulinis % come cle esti etvaimente, Son san 88 ectbeu de vocé esté aqui 29 0s dados estio todos li Adicione controles vinculados a dados em seu formulario Agora podemos voltar ao nosso formulério e adicionar mais alguns controles. Mas estes no so controles quaisquer, sd0 controles vinculados (bound, significa que uma alteragdo nos dados em um dos controles no formulario, automaticamente altera os dados na respectiva coluna na base de dados. Aqui vemos como criar diversos controles vinculados 4 base de dado inglés) a nossa base de dados e as colunas na tabela People. Isso @ _ Selecione a fonte de dades que vocé quer usar. Selecione a aba Show Data Sources (Mostrar Fontes de Dados) da barra Data. Isso abrird a janela Data Sources, mostrando as fontes que vocé configurou pora seu aplicativo. es a mM pouce de trate, nes as0revalames Se hee ebjetos de eels sue inderaiem 60M mOSS0 an, He dedos, mazenaments Se voct nite estiver vende essa aba, selecione Show Data Seirtes, sismene Baba, @ _Selecione a tabela Pessoas. Abaixo da ContactDBDataSet, vocé deve ver a tabela People e todas 1s suas colunas. Se vocé néo estiver vendo as colunas, seta para abrir 0 menu e selecione Details (Detalhes). a a eee soba da setinte revert f ContactID deve clear abl Name Company {abi Telephone {Sei Email Tades 05 ca Bi clent crieu deve, SFB Lastcal 30 Capitulo 1 ‘s9ja produtivo com C# Vocé estd aqui © rie controles que tenham vinculos com a tabela People Arraste a tabela People até seu formulario. Vocé deve ver controles ‘parecerem para cada coluna em sua base de dados. Nao se preocupe muito sobre a aparéncia deles agora - apenas certifique-se de que todos eles apareceram no formulario. Dk erinesse barre de ferramerrtas part navegar pela Febele People. Listes nite sparccerte no seu fermularia, mas Pasrerendeniacanionte de dades veo Dene Este objeto conecta para aperegte cet id taveaiew pat egg icc Quando veck anrastoy a tebele People para o fermularia, um controle fol criade pare cada coluna na Fabel, Lote adeptader permite One gre seus canbreles voce fe rbergjam com 08 cenbowey a as comandos SAL sue o Ferramenb yt Dies tente de dedos "4 Fajen “4 geraram para voce. voc’ esté aqui> 31 vineule tudo Bons programas sao usados intuitivamente TD tere st Dh ncn Neste momento, o formulério funciona. Mas ele néo esta rer XE Inn assim #80 bonito. Seu aplicativo tem que ser mais do que fe (955-8129 funcional. Ele deve ser facil de usar. Apenas com alguns asso Formulae. n toverne Smithy rindastiescom passos simples vocé pode fazer com que o formulario pareca genie mals inPUTTIV cx. sim ee aauaniey rule mois com os cartes de papel qveextivamos Indo Fee pareceree no comeco do capitulo. bastamte como cartio de conteto, ©@ Alinhe seus campos e titulos. Alinhe seus campos ¢ titulos pelo canto esquerdo do formulério, para que ele se pareca com outros aplicativos e isso deixe seus usudrios mais & vontade para usé-lo. Linhas aguis aparecerite me Sarmulania conforme vect arrasta os contrales @m volte, tes esta ld pare giudé-lo a alinhar 25 campes. @ _ Mode @ Propriedade Text na caixa de selegéo Client. Quando vocé arrastou primeiro os campos para © formulério, « sua caixa de selecéo Client tinha um nome @ direita que precisa ser apagado. Logo abaixo do Navegador de Soluce, vocé verd a janela de propriedades. Arraste a barra para baixo até a propriedade Text e delete 0 rétulo “checkbox1”. Detete esta palevra para ‘pager este ratule, @ Foca 0 aplicative parecer profissional. Vocé pode mudar 0 nome do formulério clicando em qualquer ‘espace dentro dele © encontrando a propriedade Text na janela Properties de seu IDE. Mude o nome do formulério para “Empresa de Papel Vila Objeto - Lista de Contatos” ‘Yoc# também pode desativar os botées Maximizar e Minimizor nessa mesma janela procurando pelas propriedades Vocé esté aqui ‘MaximizeBox e MinimizeBox. Coloque as duas como False. ae Ay casio para voct guerer desativer 9 $etGo Maximiser € ue se 0 usviria _— clicas se mele sev Formularie nto A propriedade Text camtrola mudaria posigio dos 2 inicla do texte na barra de comtreles, fictndo Hitule de seu formulaire, st ranhe, Um bom aplicativo nao apenas funciona, mas é {cil de usar. sempre uma boa idéia certificar-se de que ele se comporta come um usudrio comum esperaria. 32° Capitulo1 seja produtivo com C# Teste drive Cligue no X no cate Tudo bem, sé mais uma coisa pra fazer... executar seu programa e certificar-se i hoia pick patie’ s de que ele funciona como o planejado! Faca como fez antes — pressione F5 em a oa rama e vec’ seu teclado, ou clique na seta verde .p na barra de ferramentas (ou escolha tone S ia *Run’ - executar - no menu Debug) posse seguir pare e Vocé pode executar seus programas a qualquer hora, mesmo quando eles nao proxime passe, estiverem prontos - mas se houver algum erro no cédigo, o IDE informara 0 impediré de continuar. item naveser tres na base By ce ee eee es Listes conbreles perme © gikeren tes EGF Passaremos mais tempo falando disse'ne préxine caprtole, Fmt [erer@tleckborncoom id \ LastCak[ Setuday . May 26,2007 i \ 0 IDE primeiro compila, entao execut: Quendo vocé executor seu programa no IDE, na verdade, ele faz duas coisas. Primeiro ele compila seu programa, depois ele o executa. Isso envolve algumas Com| pilar seu partes distintas. O cédigo ¢ compilado, ov sejo, transformado num arquivo executdvel. Entao ele coloca 0 cédigo compilado, junto com quaisquer recursos & programa outros arquivos, num subdiretério dentro da pasta bin. sobrescreve os Neste caso, vocé encontraré 0 executavel e 0 arquivo de bose de dados SQL em bin/debug. 44 que ele copia a base de dados todas as vezes, qualquer mudanca dados em sua base feita seré perdida na proxima vez que executar dentro do IDE. Mas se vocé ativar © executavel do Windows, ele salvard seus dados - até que vocé compile de novo, le. dados. ponto no qual o IDE sobrescraverd a base de dados SQL com uma nova cépia com os dados incluidos dentro do Navegador de Bose de Dados. Como transformar o SEU aplicativo num aplicativo para TODOS 2) Neste ponto, voce jd tem um otimo programa. Mas ele s6 funciona na sua maquina. Ou seja, ninguém mais pode usar seu aplicativo, comprd-lo de voce, ver o quao genial vocé é e contratar vocé... e seu chefe e clientes ndo podem ver os relatérios que vocé esta gerando a partir da base de dados. © G# facilita escolher um aplicativo que vocé criou Vocé esté aqui distribui-lo. Distribuicéo € pegar um aplicativo e instalé-lo ‘om outras méquinas. E com 0 IDE do Visual C#, vocé pode fazer ume distribuicdo com apenas dois passos. voce esta aquir 33 deixe-o bonito @ _ Selecione Publish Contacts (Publicar Contatos) do menu Build. ~ Build solution Momtar a solvgied apenas copia os arguives em sve indguin lace Polish ert um executive! Setup ¢ um arguive de centigur pacers entao sualguer maquina pessa instelar sev presrama. @ Arenas concorde com todos os padrées no Assistente de Publicacdo clicando em Finish. Vocé o vera compilar seu aplicativo e entéo mostrar uma pasta que tem seu Setup.exe dentro. Dé 0 aplicativo aos seus usuarios Uma vez que tenha criado uma distribuicéo, voce terd uma nova pasta chamada publish/. Ela contem muitas coisas, fodas usadas para a instalacao. A mais importante para seus usuérios é 0 setup, um executével que 0s permitiré instalar seu programa em seus préprios computadores. CEN i Fe Edt dew Favors Tone HD o 40254 forma sve seid vay, tore op be ed errs compu tadares/ iad ‘Minha secretéria acabou de me contar que voc® jé fez a nova base de dados pare contatos funcionar. Faca suas malas = temos um lugar no jatinho para Aspen ara um cara ative como vocé! L satisterto, Bom trabath Pepe tert ate gra Me nanpareas nentunbtton gue vect posse 34 Capitulo 1 ‘sea produtivo com C# Voeé NAO terminou: teste sua instalaga ahi Antes que voce estoure algumo garrofa de champanhe, precisa testar sua distribuicdo e instalagéo. Vocé néo daria seu programa pra ninguém antes de executé-lo y primeiro, certo? Feche o IDE do Visual Studio. Clique no executével de instalagéo ¢ selecione um local em seu computador para instalar o programa. Agora o execute de Id e tenho certeza de que ele funciona como voce esperava. Voce pode adicionar ¢ alterar registros também e eles serdo Vocé esté aqui salvos na base de dados. Ars eda itna citeran ¢ deletan rec eles serie Peis ae ae dados, “. Eas user as F- setascocempe de TRO Stata ee Mee Cae tarts pare trocar : 7 deregotre, Els : [LioydJones | Black Box Inc 718986638 i liones@blackboxine. com et Va em fremtenn SEE eS Sage agumas LastCalk{ Saturday . May 26,2007 i] alterasses, Voct 4 a distribvigia, @ Os seis resistros dessaveeus se i vasdetrcscer/o mantides. inicialmente estia todos TESTE Topo! Teste seu programa, sua distribuigdo e os dados em seu aplicativo. voce esta aquir 35 super répido! Voeé fez um aplicativo dirigido a dados completo O IDE do Visual Studio facilita muito desenvolver aplicativos para Windows, criar e projetar bases de dados e ligar os dois. Vocé até mesmo foi capaz de fozer um instalador com alguns cliques extras. runes EEaaat empresa: Black Box Inc. ‘Teletone: (718)555-5638 Ematt: LJones@Xblackboxinc.com (tere: Sim ‘temo contate: 26/05/07 Cert! FL Latcab em pougui: 'ssimo tempo. O poder do Visual C# esti na forma como yoc8 pode rapidamente aprender e produzir com ele e, entio, focar-se no que seu proprama deve fazer... nie em um monte de janelas, botdes e eddigo de acesso SQL. 36 Capitulo 4 omente codigo x * Nos bastidores * ‘Algum dia vou entender como funciona esse negécio. Vocé é um programador, nao apenas usuario de IDE ‘Voce pode fazer muito usando o IDE. Mas existe um limite para o que o IDE pode {fazer por voo8. Claro. existem muitas tarefas repetitivas que devem ser feitas quando se desenvolve um aplcatvo. E 0 IDE é otima para fazer essas coisas Mas irabalhar com o IDE @ apenas o comeyo. Pode-se fazer um apicatvo realizar muito mais e escrevercddigo Ci é a forma de conseguir-se isto. Uma ‘vez que se tenha pegado 0 jeito da coisa com relagao a programar, nao ha nada ‘que seus programas nao possam fazer. este é.um novo capitulo 39 a0 seu dispor Enquanto vocé esta fazendo isso. © IDE € uma ferramenta poderosa - mos ¢ tudo o que ele é, uma ferramenta para seu uso. Toda vez que vocé mudar seu projeto ou arrastar e soltar alguma coisa no IDE, ele cria codigo automaticamente. E ele é muito bom em escrever codigo de suporte, ou seja, aquele que pode ser reutilizado sem exigir muita customizacéo. Vamos examinar 0 que o IDE faz em desenvolvimento de aplicativos tipicos, quando estamos... @ Criando uma nova selucéo que seja um aplicative do Windows Existem muitos tipos de aplicativos que o IDE permite que se desenvolva, mas nos concentraremos om aplicativos Windows por agora. Estes séo programas. Te com elementos visuais, como formularios e botées. Cortitiqre-se de se re eras Um prsiets pare rime feeb tse Dhar fever ontnalnc nical @ Arzastando um botéo da barra de ferramentas para o rmulério. e clicando nele duas vezes Botdes sao o meio pelo qual vocé faz as coisas acontecerem no seu formuldrio. Usaremos muitos botées para explorar varias partes da linguagem C#. Eles também séo parte de quase todos 08 aplicativos C# que vocé escreverd. © Atribuinde uma propriedade no seu formulério A jjanela de propriedades no IDE é uma ferramenta realmente poderosa usada para mudar atributos de quase todas as coisas em seus programas: todas as propriedades visuais e funcionais dos controles nos formulérios, atributos de bases de dados e mesmo opgoes do préprio projeto. Ajunet ae ore mite Sect de eee te ether ong na 7 aE on Farm/, Disiies te te especiticg '* Mls ISH Sasen inne mgr ent eemerte, re manvalmente, 40 Capitulo 2 Lepredades ne I Errore festa - Tades esses tareses sao relacionadas com 4 ecdaiga de super as coisas nas quis 0 IDE E atime pare guar, Cig : _€ tudo 6 somente cédigo ws IDE esta fazendo isso ‘Toda vez que altera o IDE, ele altera uma parte do ct alteram-se os arquivos que o contém. Algumas vezes apenas algumas bsses erauives sz poucas linhas so modificadas, mas em outras arquivos inteiros so Perdin gee of 28 criadas « : pe adicionados ao projeto. ie can han Mele predetnid @ _ ... 0 IDE cria os arquivos @ pastas para o projeto. WindowsAppliction! —Formi.es _-Form!.Designercs Program.cs Propriedades < 41 Jegal, “aquela® conversa De onde vém os programas Um programa C# pode comecar como comandos em vérios erquives, mas ele termina como um programa executando no seu computador. Eis como ele chega Id. Todos os programas comecam como arquivos de cédigo fonte Vocé 6 viu como editar um programa e como o IDE 0 salva em arquivos € postas. Estes arquivos s&0 0 seu programa - vocé pode copié-los para outra pasta, abri-los e tudo estaré la: formulérios, recursos, cédigo e tudo o mais que foi adicionado ao projeto. Pode-se pensar sobre o IDE como se ele fosse um tipo de editor de texto sofisticado. Ele automaticamente faz a identagéo para vocé, muda as cores das polavras-chave, fecha os parénteses e até mesmo sugere que palavras devem vir em seguida. Mas, no final, tudo 0 que o IDE faz & editar os heed ao 7 8 paderie rquivos que contém seu programa. & rregramer ne O IDE agrupa todes os arquivos de seu programa numa solugée, criando: Bice de Matas, um arquivo préprio para tanto (.sin, de solution) e uma pasta que contera 2 gue serie mur todos os demais arquivos. O orquivo de solugéo tem uma lista de outros mats rebaines, que contém projetos (os com extenséo .csproj), @ estes, por sua vez, contém listas de todos os demais associados com o programa. Neste livro, desenvolveremos solucdes que tem apenas um Unico projeto dentro delas, mas pode-se facilmente adicionar outros projetos nas suas solugées usando 0 Novegedor de Solucées (Solution Explorer) do IDE. O Framework .NET fornece as ferramentas certas para o trabalho C# 6 apenas uma linguagem - por si mesma, nao pode fazer efetivamente nada. E 6 af que entra o Framework .NET. Lembra daquele botéo Maximizar removide do formulério de Contatos? Quando se pressiona 0 botio ‘Maximizar de uma janela, existe cédigo que Ihe diz para aumentar a si mesma e tomar toda a tela. Esse cédigo ¢ parte do framework. Botées, caixas de checagem, listas... todas estas so pecas dele bem como as pequenas pecas internas que associam seus formularios as bases de dados. Ele tem ferramentas para desenhar gréficos, ler e escrever arquivos, gerenciar colecées de objetos... todo tipo de ferramentas para muitos tipos de trabalho que programadores tem de fazer todos os dias. As ferramentas no Framework .NET estao divididas entre varios namespaces. Voce jd os viu antes, no inicio de seu cédigo nas linhas “using” (usondo). Um namespace ¢ chamado de System. Windows.Forms - 6 nele que seus botées, caixas de checagens e formularios se originam. Sempre que vocé criar um novo projeto de aplicativo Windows Forms, o IDE adicionara os arquivos necessérios para que ele contenha um formuldrio, que conterdo a linha “using Windows. Forms” no inicio. 42 Capitulo 2 tudo somente codigo Compile o programa para criar um executavel Quando voce seleciona “compilar a solugdo” (build Solution) no ‘ menu Compilar (Build), o IDE compila seu programa. Ele faz isso \we executando o compilader, uma ferramenta que Ié 0 cédigo fonte de seu programa e o transforma num executavel. Este, por sua vez, 6 um arquivo com extensdo .exe - ¢ nele que vocé clica duas vezes. para executor seus programas. Quando um programa 6 compilado, © executével é criado dentro da pasta bin, que fica dentro da pasta do projeto. Quando vocé publica sua solucéo, 0 executavel € copiado (juntamente com qualquer outro arquivo necessério) para a poste de publicacao. Quando se seleciona “Iniciar depuracéo” (Start Debugging) no menu Depurar (Debug), 0 IDE compila o programa e inicia 0 executavel. Ele tem mais algumas ferramentas avangadas pora depurar o seu programa, o que apenas quer dizer executé-lo e ser capaz de colocéi-lo em pausa (ou “interrompé-lo", "break" em inglés que significa, literalmente, “quebrar”) de forma que se possa determinar © que esté acontecendo. Seu programa executa dentro do CLR Quando vocé clica duas vezes no executavel, o Windows inicia o programa. Mas existe uma “camada” extra entre os dois chamada de Runtime* de Linguagem Comum (Common Language Runtime), ou CLR. Era uma vez, num passado nao tao distante (mas antes do C# existir) um mundo onde escrever programas era mais dificil; tinhamos que lidar com 0 hardware e outras coisas de baixo nivel nos computadores. O CLR - freqlentemente chamado de méquina virtual (virtual machine) - cuida de todos esses detalhes para vocé fazendo um tipo de “traducao” do seu programa para computador que o esta executando. ecisa se prescipar ‘Voce vai aprender sobre uma série de coisas que o CLR pode fazer. Vecd nko pr Por exemplo, ele gerencia rigorosamente a meméria do computador es aha comp CLE eset determinando, por exemplo, quando um programa foi encerrado le rte, 4 0 susiele deixando pra trds parte dos dados. Nesse caso, ele elimina-os para MET eneree voc’. Em geral, isto era algo feito pelos préprios programadores. aber eel ner Agora vocé néo precisa mais se preocupar com isto. Vocé pode nao ve Homa cont ® Ficamentes ter percebido antes, mas o CLR vai facilitar a tarefa de aprender C#. pregame autome . Sabre snderemes mal * runtime pode ser traduzido como “médulo responsével pela Ore avangarnes ‘execucéo”. Significa literalmente "tempo de execucao”, vocs esta aqui> 43 ‘pequeno ajudante da mamae 0 IDE ajuda vocé a fazer seu cédigo Yoc® id viv algumas coisas que o IDE pode fazer. Vamos examinar com mais detalhe algumas das ferramentas que ele fornece. © Navegadbor de Solugéo mostra tudo no seu projeto Vocé emprega muito do seu tempo indo de uma classe para outra. A forma mais facil de fazer to 6 usando 0 Navegador de Solugdo (Solution Explorer). Ele tom duas abas de visualizacéo: uma de Navegar pela Solugao (que lhe mostra os arquivos num projeto) e uma de Visvalizacao de Classes (Class View, que lhe mostra como 0 cédigo esté dividido logicamente em classes). saan ok O Nevegador de Solugia mestra-the os diferentes arguives na pasta de selugio, Voce aprendera mais sobre ‘s-dsResources classes num eee minute, a © _ Use as abss para clternar entre arquives abertos Uma vez que seu programa esté dividido em mais de um arquivo, normalmente, vocé feré muitos arquivos de cédigo aberto ao mesmo tempo. ‘Quando for 0 caso, cada um deles ferd sua propria aba no editor de codigo. © IDE mosira um asterisco (*) a0 lado de um nome de arquivo que einda néo tenha sido salvo. se eeqiive de recurses de farmuliris na quel lege da Empresa de Pape! Objectville fai Serio, Form 1L.cs Guands extanes trabalhande num Sarmuitris, tenes dues bas pare clas mesme Henge’ ime para o painel de design de Formularias Gfarm designer) € uma pare ver o codise correspe 7 © ODE ojude voes « criar seu codigo Vocé notou pequenas jonelas aparecendo conforme vocé vai escrevendo cédigo no IDE? Isto é uma caracteristica chamada IntelliSense que € realmente util. Uma das coisas que ela faz mostrar-lhe formas possiveis de completar a linha de cédigo que esta digitando. Se voce digita MessageBox e um ponto, ele sabe que hé trés formas vélidas de completar essa linha: Form Lresx ten tres metodes en oa "Shaw, Pressione « Fecla eleciont Shah. 3 en econo Exte pede pepe ah re owned estas atone ™ inuihe Fempe, a names extenses HE metodes. 44 Capitulo 2 tudo 6 somente cédigo Se voce selecionar Show e digitor “(", 0 IntelliSense do IDE mostrara informacdes sobre como completar a linha: Isso significa ye 4 a formas diferentes He ‘ _ vhamar 0 metode Show AC . e res sageBox c0me, Per Gof 219) DidogResuit MessageBox Show (string text, string caption) exemple, formes aifere ltexti The text to dsplay in the message box, ide exibir bobaes © tconts> © IDE também tem atalhos chamados trechos (snippets) que permitem se digitar uma abreviagio ¢ que © restante do cédigo seja preenchido automaticamente. Eis um util: digite mbox e pressione a tecla tab duas vezes, e 0 IDE vai preencher o método MessageBox. Show para voce: Quando voce use © _ Alista de Erros ajuda vocé a resolver problemas de compilacéo Lniciar Depurass 5 Se vocé ainda nao descobriu como é facil cometer erros de digitagho num (Start Debuss"s programa C#, vai descobrir muito em brevel Por sorte, oIDEtem uma para executar 50UF 6tima ferramenta para resolvé-los. Quando se compila uma solucdo, rogrames dentre de jer problema que fenha impedido a finalizacto do processo om va primeire cols rd na janela Lista de Erros, na parte inferior do IDE. ps fe ccompllagie- ‘la for bem sucedid Hie a programe ertio 9 PSE ve ie neers. 5e mee mae Le parexecuter € 25 © jxibides arte de bres Grrer [92200] Rowan) (0 oe ileal Fe Une Cokinn Project ‘ew object expressore canbe sed aa statement Clique duas vezes num erro e 0 IDE se deslocaré até a posicéo no cédigo onde ele ocorreu: private void pictureBoxl_Click (object sender, { Event -Show("Contact List 1.0") ‘i emvermelhe vocé esté aqui> 45 vamos nessa Quando coisas sao alteradas no IDE, 0 codigo é mudado também O IDE € otimo para escrever codigo visual. Mas vocé néo precisa acreditar na nossa palavra. Abra o Visual Studio, erie um novo projeto de aplicativo Windows e veja por vocé mesmo. @ Abra o painel de design de codigo Abra 0 arquivo Form! .Designer.cs ne IDE. Mas dessa vez, em vez de abrir © painel de design de formulério, abra o cédigo clicando com o botéo direito no Navegador de Solucdo, selecionando “ver cédigo” (view code). Procure pela declaragéo de classe: public partial class Form : rorm com ANTE algumes 1/7 Required method for Designer support - do not modify Mas 0 tes /i/ the contents of this method with the code editor veges ingen’ OF" es 141 ee buries com eles. Nada mais atraente para uma crianga do que um grande cartaz que diz "néo toque nisso”. Admita, voce esta tentado... vamos modificar 0 conteudo desse método com 0 editor de cédigo. Adicione um botée a seu formulério e entGo faca o seguinte: @ _Modifique 0 cédigo que atribui o valor da propriedade button1. Text. O que vocé pensa que vai acontecer com a janela de propriedades do IDE? Tente - veia 0 que acontece! Agora volte ao painel de design de formulario e verifique « propriedade Text. Ela mudou? Voce nite precisa , salvar’ a formulari @ Continue o painel de design, @ use a janela de propriedades ou exeeutar @ ayer as para modificar a propriedade Name. programa par eae Veja se vocé consegue fazer com que o IDE modifique a modificagses. Ap propriedade Name. Ela aparece na janela de propriedades fagaas alteragaes logo acima de todas as demais, descrita como “(Name)”. O que no editor de codige © ‘econteceu com 0 cédigo? E com os comentarios nele? cligye ma ae de pare, de design pare tra5e- ° ique 0 cédigo que atribui a propriedade Location Taparao primeice (localizacéo) para (0,0) e a propriedade Size (tamanho) para plane as alteresies deixar © botéo bem grande. laevem ser cefleridas: Funcionout imedietamente. @ _Volte para o painel de design e modifique a propriedade BackColor (cor de fundo) do botéo. Olhe com atencéo para o cédigo em Form! .Designer.cs. Foram adicionadas linhas? B sempre mais S4cil usar o IDE para alterar o ebdigo gerado pelo painel de design para seu formulério. Mas quando isto é feito, reflete-se come uma alteracdo no cédigo de seu projeto. vocé esté aquir 47 seu programa comanda Anatomia de um programa Cade programa forma. Todos os métodos para deixar cédigo mais facil de gerenciar. Tada ves 3 Uma clas: Seus metode, sete de comandas = C# 6 estrutyrado sempre exatamente da mesma programas usom namespaces, classes € pia vn nV je vect © ‘en lefine vm names oer geu cage ive ser" an Mt, paraele sn yma pact ragrame ember” 55am de 500 Pre pegyeres P prose Brea cas fet ot dapat 26 em om ot mats mbfades, 77 2 sempre Him teenies lasses. b eles six sor Come aSUEIES sU8 4 vim, es, Vamos examinar seu cédigo mais de perto ‘Abra 0 cédigo de seu arquivo Form! .cs no projeto de Contatos para qi 48 Capitulo 2 jue possamos examind-lo passo @ paso. © arquivo de cédigo usando as ferramentas do Framework .NET Yocé vai notar um grupo de linhas using (usando) no inicio de cada arquivo de programa. Elas dizem ao C# quais partes do Framework .NET usar. Se vocé usar ‘outras classes que estao em outros namespaces, tem de adicionar linhas using para elas também. Ja que os formularios com freqdéncia usam muitas ferramentas diferentes no Framework .NET, 0 IDE automaticamente adiciona varias linhas using quando se cria um formulério ¢ ele 6 adicionado « um projeto. using System; using System.Collections.Generic; barton using System. ComponentModel ; cade any ek 89 6 i ag using System.Data; Mise as Cig Pres ene, Ege using System.Drawing; lasses yg Bn Ur cores using System. Ling; Cate uma gig CNM OME MET 3 #9 seu pp, using System.Text; a Une chasse np S ‘egrams using System.Windows. Forms; Peale ee Ardicedeg a sptces 08 de Franenane Wty tudo 6 somente cédigo @ Programas C# séo organizades usando classes Cada programa C# 6 organizado usando classes. Uma classe pode fazer qualquer coisa, mas a maioria delas faz algo bem especifico. Quando se cria um novo aplicativo, 0 IDE adiciona uma classe chamada Form] que mostra um formulério. Bande vec chamar 2 programa Comtates, IDE eriav um p kel namespace para ele chamade Contacts adicionande & palavra namespace Contacts chave namespace no inicio de cadige, Tide dentro das chaves { correspondentes a esse comando ¢ parte deste namespace. ‘public partial class Forml : Form / { t Este € a classe Form/. Le contim ade 0 codigo para desenhar a formulirio € os controles de barras de ferramentes nele.O LDE 0 criev guando fei determinade 3ve om nove projete de aplicative Windows Farms fosse criado, @ Classes contéem métodos que executam tarefas Quando uma classe precisa fazer alguma coisa, ela usa um método. Eles precisam de algumas informacdes, executam alguma acéo e, algumas vezes, produzem algum resultado. A forma de passar informagées de entrada para os métodos é usando pardmetros. Um mesmo método pode ter comportamentos diferentes dependendo de quais parémetros de entrada recebe. Quando os métodos produzem resultados, isto & chomado de valor de retorno. Se vocé nolar « palavra chave void na frente de um método, isso significa que ele néo retorna valor algum. ee public Forml () a de chaves. Cada "{ { LoitiatrseCompenert0, sve IDE sonphe temite ter om InitializeComponent () ; também criev para veck, "p> correspandente. Aiguns pares podem str comtides demtro de ovtras. Um comando executa uma agéo individual Quando voce adicionou a linha MessageBox.Show() ao programa, estava adicionando um comando. Todos os métodos sdo feitos de comandos. Quando seu programa, chama um método, este executa seu primeiro comando e depois 0 proximo e assim por diante. Quando o método encontra um comando return, ele encerra e © programa continua depois do comando que chamou o método. sede um mbbete chanade pctureBorl_ ; Oe ao usvirts aretha tits ClickO, Le € chamade 5u chamades sender ee, clica na caina de imagem. ee e N v private void pictureBoxl_Click(object sender, EventArgs e) t MessageBox.Show("Contact List 1.0”, “About”) ; } Re % } é ay De é par Este é um comando, Yoct jd sabe Sev comande chamov o meted Shaw, gue € ps — @ BE ele fas - uma pesuena da classe Hessasebony allege wae Jil con ime nensten rage te ec pace ByrtemWindons Forms. em resposte a ele, ae é rian a “Seu comande passeu dots pardmetires para o métade Shaw0. 0 princire ma segiéneia de caracteres de texto pare ser enibde coma men agen, segundo, uma autre segiiencia para ser mostrada na barra de ; voeé esta aquim 49 othando de perto Seu programa sabe por onde comegar Cade programe C tear int CH pede ten Quando vocé criou uma nova solugée para produzir um aplicativo Pens Um Unie reas Windows, um dos arquivos que o IDE adicionou foi chamado de *perte de embrang Ae 8 564 Program.cs. Vé até o Navegador de Solucdo e clique duas vezes $e chamend, UF Semone rele. Ele tem uma classe chamada Programa e dentro dela um se dete, MAO, assim gee método chamado Main(). Este método é o ponto de entrada, o que Winde ele é, per comegen iro a ser executado no programa. <- Cexecotede, quer dizer que ele ¢ 0 pi fir algum edige gue o TDI eriau pare vac _ wieeteoee ino capttvle anterior. Veet 6 prs tearl cm Plager, Seu eédigo de perto N using System; using System. Ling; using System Collections i ‘ -Generic; saige ® using System.Windows Forms; pode 0556 evils e aoe aang Contacts < oe jms ‘ ° Contac gees amespe aoe Linkas sve comesam com berras sts comentarios, Lies padem ser Adicianados ( th guugver oper got se pera yy Sey a «CH pare grereee page mai ‘“ M11 efermnarye tt! Point £0r the application. rama cexecu Pade, cle (STAThread] orate one Na ve 2 prog {amon gee ad tyme orb cert redt ° ue “GoableVisuaistyles() ; ‘on. Application “Run (now Fecal tan enderingDetanit (false) ; SS auiataamiae exeoartcs 2 fermularia de Contatos e encerre s pragrame suands s via e fechado, Lembre-se, tse € apenas 0 ponte de partide pare gue voce merguihe ne cedis Mas antes disto, vect precise saber e gueesta precurande, 50 Capitulo 2 @ OC#eo.NET tem muitas caracteristicas 4 desenvolvidas Vocé encontrara linhas como estas no topo de quase todos os arquives de classe C#. System.Windows.Forms é um namespace. A linha using System. Windows.Forms faz com que tudo 0 que existe naquele namespace esteja disponivel para ser usado tudo 6 somente cédigo “Seus pregramas Vio usar coda vey mals namespaces coma estes pelo seu programa. Nesse caso, este namespace tem muitos comforme voce aprender elementos visuais como botdes e formulario. a resperte do Ce cobras earecteiotiets namades previame? @ ONDE escolhe um namespace para seu cédigo wT et EE Wik Eis 0 namespace que o IDE criou para vocé - ele escolheu a Contacts baseando-se no nome do projeto. Todo o codigo do sou programa esté contido nesse namespace. KR Canespeces permitem vtitisan as mesmos names tm diVErsOS pregramas, @ 52¥ césige fie contido nume classe Soa WE 28 pragramas na esteem Esta classe em particular é chamada de Program. © IDE a criou e adicionou 0 cédigo que inicia o programa e exibe o formulario . Contacts. ° Este cédigo tem apenas um método e ele contém trés, comandos Um namespace tem classes e classes tém métodos. Dentro de cada método esta um conjunto de comandos. Neste programa, ‘9s comandos lidam com iniciar o formulario de contatos. Métodos estéo onde a acdo acontece - cada um deles faz algo. @ 242 programa tem um tipe de métode especial chamado de ponto de entrada Cada programa C# precisa ter um Unico método chamado Main (principal). Mesmo que existam muitos métodos, apenas um pode ser 0 primeiro a ser executado ¢ este é seu método Main). O C# checa cada classe no cédigo procurando por um método definido como static void Main(). Entéo, quando o programa executa, o meiro comando nesse método é executado. O mesmo ocorre mente com quaisquer outros comandos que se seguirem 0 primeiro. Vocé pode mudar o ponto de entrada de seu programa Pade terse mi "0 de mesmo namespace, Htiplas classes jgmo namespace Cada programa C# tem de ter apenas um tinico métede chamade Main. Ele é © ponto de entrada no seu codigo. Quando se exeeuta um programa, © ebdigo ne método Main é ativade PRIMEIRO. Desde que seu programa tenha um ponto de entrada, néo importa em qual classe BV ele esté, ov © que o método que o implementa faz. Vamos remover 0 método Main de Program.cs e eriar um novo ponto de entrada. * Faca isso! a @ _Retome para Proszan.cs altere © nome do métode Nain para NotMain. 3K Agora tente compilar e executar o programa. O que acontece? ben ” V6 0 sue acomtece Setnde vee adi nétade tpargoe vad sche sue ise ac eS acomtece, voce esta aqui> 51 colsas de classe @ _Yores criar um nove ponto de entrada. Adicione uma nova classe chamada AnotherClasse.cs (outra classe). Adicionam-se classes ‘ao programa clicando com o botao direito no nome do projeto no Nayegador de Solugéo e selecionando-se ‘Add>>Class...” apie (Givenaeockus! Che ate eee ue, ee cs. O IDE adicionaré uma classe a seu programa chamada em Poopriedades € AnotherClass. Eis 0 arquivo que o IDE adicionou: selecione Add e Clas: ueing using Syste using System.Col lections.Gene: Text: 1itys £5303 yuatre linhas using foram Adicionadas a0 arguive, Liste classe esta ne mesme namespace Combacts TDi adivianoy sande criames pela primeira ete de aplicative Windows, feet eases ee yee ass eget OD a Dt Utomaticamerbe dev 6 name para a SO 0 ne. E10 meme do erguive, class Another! , las 5€ ba seando- @ Adicione uma nova linha using no tope de arquivo: using System. Windows. Forms: Nao se esqueca de adicionar um ponte e virgula no final da linha! @ Adicione o seguinte método ¢ classe AnotherClass digitando-o em algum ponto dentro das chaves: pressagebon ume sot Glaay Aneiboerciinen contide n 5 é Agora execute! * Entao, 0 que aconteceu? rN Em vez de mostrar o aplicativo de Contatos, seu programa agora mostra esta caixa de mensagem. Quando vocé criou o novo método [Ede Main)), dev a sev programa um nove ponte de entrada. Agora o primeira coisa que ele faz ¢ executar os comandos nesse novo método Pow! = 0.que quer dizer executar o comando MessageBox.Show|). Nao ha mais nada no método, entéo depois que se clicar no botéo OK, 0 (xe) programa fica sem mais nada para executar e encerra. Determine como corrigir seu programa para que ele mostreo Din formulario de contatos novamente. vecd tem de moder TR apenas dvs likes pare ager iss 52 Capitulo 2 tudo 6 somente codigo Aponte oe Preencha as notas para descrever as linhas nesse arquivo C# para onde as setas apontam. Nés preenchemos a primeira pra voc®. o ten; set ee ing System: Ae eugsen SET ae using system. Ling: nee using System. Text; egret using System.Windows. Forms; aeiett. namespace SomeNamespace ‘ a> class wyctass { puis statis wela vaste geeen MescageBox.show ("This is 2 message”); ’ Lane nao existem Perguntas Idiotas ‘P: Qual a idéia por tras de todas aquelas FR: Seu programa tem muitos comandos, mas P: Porque aparecem itens na minha janela chaves? ‘que ndo so executados todos a0 mesmo Lista de Erros quando eu tento executar tempo. O programa comeca com o primeiro meu programa? Eu pensei que isto $6 ‘comando, executa-o, passa para o proximo _acontecesse quando eu ativasse “compilar ‘assim por ciante. Geraimente, estes ‘solugdo” (build solution). R: 0 C#usa as chaves para agrupar ‘comands em biocos. Chaves sempre devem cexislrem pares. Vocé apenas vera um fecha- chave (sexsi um abe-chaveantor_ COmenGos S40 oGanizads defo de MUS. ae 3 pimsira coisa que aootece (*0)- IDE ajuda a checar isso -cique quando se seleciona “Iniciar depuragao’ (start numa chave @ voo8 vera que ele destaca a: Ento, como 0 programa sabe por debugging) no menu ou barra de ferramentas correspondente sombreando-a com uma cor qual comando deve comecar quando é para que o programa seja executadoé todos executado? 08 arquivos na solugao serem salvos e depois tentar compit4os. E quando vocé compila P: Néo entendi muito bem o que é 0 ponto RX: € ai que o ponte de entrada nos aux. O 9, osdigg - soja quando voce o exocuta, ou de entrada. Vocés podem explicar mais °o™Pllador no provessaré o cbdigo @ 80 Ser quando cia a solugo - se exstirom erros, uma vez? on oan Maint), 0 1DE vai exilos na Lista de Erros ¢ 0 execulandoo primeira comando em Main). Pemamendo ve ser execvado, escura, voce esta aquir 53 algumas respostas ee seu lapis Solugao Preencha as notas para descrever as linhas nesse arquivo C# para onde 9s setas apontam. Nos preenchemos a primeira pra voce. using systen; om esas lnhas using System.Ling: Ais cusses CH Hm OF ae using System. Text; ‘ng pare aeiciOnee using System. Windows. Forms; oe namespaces: taal o : Tsto é um metodo, Cada um deles oasiccy isan Todo 0 codigo esta contide Fas, alge, Les so usados para t a em classes, de forma sueo —agruper comando: cue pragrema presin de te ge ania Cokaiiia wee oonaaicestag)" { Leto um comands, Quando ie rateethen tense eee oe Lerewiade, oueat uma pegvens janela com uma mensagem. 54 Capitulo 2 * Cc > + * Qual meu propésito? es Associe cada um desses fragmentos de cédigo gerados pelo IDE ao que eles fazem. (Alguns deles nao foram explicados - dé um palpite para ver se acerta!) thie Buekcolor = Color tarkvielety ropriedades pora um rétulo (label) Nada - 6 um comentério que os programadores adicionam para explicar 0 <édigo para qualquer um que esteja 0 lendo. pelnee roldnltliterieme ns Desativa 0 icone de maximizar (Ei) / na barra de titulo na janela Form1 fonber_of_plt_stopatabel.Nane Um tipo especial de comentario que 0 IDE usa para explicar o que um bloco inteiro de codigo faz ‘Muda a cor de fundo na janela Form] ii Um bloco de cédigo executado sempre ‘que um programa abre a janela Form! vocé esta aqui> 55 08 qltomirapent pote variar + a ie Qual meu propésito? eo Associe cada um desses fragmentos de codigo gerados pelo IDE ao que eles fazem. (Alguns deles néo foram explicados - dé um palpite para ver se acerta!) olor Darkviclety Atribui propriedades para um rétulo (label) Nada - € um comentério que os programadores adicionam para explicar o cédigo para qualquer um que esteja 0 lendo. Desativa 0 icone de maximizar (Ell) no barra de titulo na janela Form) Um tipo especial de comentario que 0 IDE usa para explicar 0 que um bloco inteiro de codigo faz 1 Sete oth stare of Renee whan ‘Muda @ cor de fundo na janela Form! Um bloco de cédigo executado sempre Suse nansnsenon staan que um programa abre a janela Form! 56 Capitulo 2 tudo 6 somente codigo Duas classes podem estar no mesmo namespace Dé uma olhada nestes dois arquivos de classe de um programa chamado PetFiler2. Eles tém trés classes: uma classe Dog (cachorro}, uma Cat (gato) e uma Fish (peixe). Uma vez que estao todas no mesmo namespace PetFiler2, comandos no metodo Dog.Barki) (cao. late) podem chamar Cat.Meow() (gato.mia) e Fish.Swim() (peixe.nada). Nao importa como diversos namespaces e classes sao divididos em arquivos. Eles comportam-se da mesma forma quando executam. SomeClasses.cs (algumas clesses) ‘MoreClasses.cs (mais classes) Uh gue esses classes esta no mesme namespace, todas elas podem ver umas ks ov-tras - mesme sve estejam em argvives diferentes, Uma classe pode estar dividide em awites argvives também, mas voce precisard usar a paleyra chave partial (parcitl) svande declari-la, zt Pade-se apenes dividir uma clas se entre varios diferentes argyives st 4 palavra chave partie! for used. Provavelmente vact nike a usard em nenhum cddiga ue escreverd neste livre, mes 6 IDE vtigene pare dividn seus Fermvlaries tm dois arguives, Form/ es e Farm/ Designer.es. Seus programas usam varidveis para trabalhar com dados No fim das contas, todos os programas séo basicamente processadores de dados. Algumas vezes os dados esto na forma de um documento, ou em uma imagem num videogame, ou em uma mensagem instantdnea. Mas sdo apenas dados. E € ai que as varidveis entram. Elos so 0 que seu programa usa para armazenar dados. Declare suas varidveis Sempre que vocé declarar uma variével, vocé esté dizendo ao seu programa seu tipo e nome. Uma vez que 0 C# sabe o tipo da sua varidvel, isto impedira que seu programa compile se vocé cometer um erro e tentar fazer algo que néo faz sentido, como subtrair “Tots” menos 48353. vocé esté aquim 57 ‘operadores de prontidao enpanag ~, 5 das Stes sis. tteg soot despite 28 memes vyariaveis. oO int maxWeight ; J s \ Saistring message ; < > bool boxChecked; < . bee < Os no! tose, ft, Come van %p £5COLHA, Come p ie: - pare pot pbbadas @ classes, USE MOMeF Peden get Medag wre Fagan serrbide © HESCrEVEM Sen devel 59 (preparar, apontar, codigo! Dectarames une nove vareve O Ferceina comands muda o velar de number, infeire chamade nunier (int number = 15; deixandoo igual a FC veses /S, resuttanda em Hi fe ovelor (tuber = number +10; Sis ne Ae . Gnimere) € recese apes Wise ase 7 . Labia ela reiniciude nevamente eo valor 15. Sntio thes eaieiorme? nbor de 7D. Depsis do sesurde number comanda, number tera vetoes number ‘goals Z number Este eperader ¢ um povcs diferente. O += significa Pegue e valor de number e adicione-ihe /O, Ja gue number no memento esti com ovelor de, cleacebe StEing Bale result result 0 Euma segiencia , de caracteres vasja.t uma string sem nenhum oe int count = 0 MessageBox. Show (result) ; yesNo = !anctherBool; Um bool armazena verdadeire © 12-4217), que resulta em 6, éatribvidente © eperedor =* é semethente ao mais, exceto = gue cle multiplica «valor atval em number por = 3, de Forma sue ele acaba com ovvaler f 8, dividids por F623. Uk ue number buna vanitvel irbeina, ele pode apenas armazenar nimeros ‘inteires, de forma sue esse valor éalfered para 2.3, Veet usard inteiras frequentemente ‘pare faxer comtagens €, suande for += ° again * + result; 2 case, a5 operadores + ¢— serdo iteis. O + increments court +/0OURE? CcamPagem) editisnands Um te velar, €4 wae ns 3: Nw result = “hello” = “the value is: result =~"; ~ decrementaro, de forma ue ovilor Final dele serd sere, bool yesNo = 7 bool anotherBool = true; wande se utilise a operadar + com uma string, ee apenas concetene dus segiencies de careeteres, Nesse case, nimeres serie avtometicamente carecter (come Um Co cemasene rereeMere canvertibes em string de sere pare adiciomer® § — Pperegar “l* significa negesio * string). e transformer verdedeire em False e vice-verse, ) Relaxe Nao fique preocupado tentando memorizar operadores nesse ponto Vocé ir conhece-los porque vai vé-los repetidamente. Lagos executam uma agao repetidamente Eis algo peculiar sobre a maioria dos grandes programas: eles quase sempre implicam em realizar algumas tarefas repetidamente. E para isto que servem ‘05 lagos - eles dizem ao seu programa para executar um carto conju teste pare, wom comandos enquanto alguma condicéo especifica for Cec ns Stele rtinvar executande, > while (x > 5) { xex-3; z Num age while ensvanted, todos 03 comandes dentro das chayes sto excevtades engvante a condizin entre parerteses € verdadeira, 60 Capitulo 2 Cada lage fer (pare) tem a declarasio de tres peremctras, O prineire cria 0 lage em si, 0 comande continvard executande ate sue o segundo La terceine € execu Pade depois de cade vo for @ 20; F< 6; f= 342) { MessageBox. Show(*I’11 pop up 4 times”) ; I Use um trecho de cédigo para escrever lacos for simples Vocé digitaré alguns laces for em instantes e o IDE pode ajudar um pouco a tudo 6 somente cédigo acelerar a criagao do cédigo. Digite cor e pressione a tecla tab duas vezes: 0 nea eal Hah pare IDE ettomdnicamerite insere 0 cadige para vockiSe\vock digit oineme'de: uma: INE? oe nova varidvel, ele automaticamente completard o restante do trecho. Pressione faer 0 curser dos a tecla tab novamente e o cursor saltaré para a palayra length (comprimento, —_palayra !e’ een ‘aqui usado no sentido de “tamanho”). ie veges que e556 se sails pele aa execute e determined le ‘ ee fiver ne ts de554 for (int O; i < TRRGBR: i++) oquees Senators Hora de comegar a codificagao © verdadeiro trabalho de qualquer programa esté nas suas declaracées. Mas declaracées néo existe num vacus. Portanto, vamos definir a fase de criagéo, e na obtengéo alguns cédigos escritos. Crie um novo aplicative Windows Forms. Sa Leto did a0 IDE pare criar um nove projets c. fermularie em trance € um ponte de cela! Voce, ‘pede guerer dar-ibe um nome como programe / do caprtule 2. - voce criand muitos programas conforme tor ler este livre. *« Criar este form! * Adicione comandos para exibir uma mensagem Comece clicando duas vezes no primeiro bottio. Entéo, adicione 0s seguintes seis comandos no método but ton1_ Click (). Examine atentamente o cédigo e o resultado que ele produz. L thie stPing name int@D= 3; de mensasem, palavt. Gere ev variavel. um ni ponto e virgulo. Um comentatio de uma tniea linha comeca com duas barras. // esta linha sera ignorada 4 Amaioria dos espacos em branco é ignorada. x weaeeahe 60 mesmo que xw3; 4k Voriaveis séo decloradas com um nome e um tipo (vocé aprenderé sobre varios fipos no capitulo 4). int pesos // peso: numero intearo Ie Classes © métodos precisam ser definidos dentro de um par de abre e fecha chaves. public void vamos () { //codigo fantastico aqui , te void buttonl_Click (abject sender, EventArgs e) bxtste ume cle: CUS predetinide chamada Mats, ¢ ee tem um 7 membre chamads PT, tuts double d ~ Meth.PI 7 2; esta contida ma na seseageben Sho aone €° + same Syafem age MEUM + *\nx js % + x een aes +s + a: Pe nastnerd eoke cédiga 2 , Une lina vs: Leal oN fene eine decsopepane — PArjreinea, Adicionar Uma 84678 de linha na caine vocé esté aqui> 61 as coisas que vocé pode fazer Comandos if/else tomam decisées Use comandos if/else (se/entéo) para dizer cos seus programas para fazer certas coisas apenas no caso de as condigées estabelecidas serem (ou ndo) verdadeiras, Muitos comandos if/else verificam se duas coisas so iguais. neste caso que se utiliza 0 operador ==. Ele difere do operador sinal de igual unico (=), que é usado para atribuir valores. Cade comande if comega com Um ee Fert de ume contigic. if (someValue == 24) { MessageBox. Show("O valor foi 24."); Os comandes demtre das , haves sie execvtades —ecqual pare comparar — chaves sia exceutede: Sempre use dais sinais de (gut! P pact igaeeiaye valores. resuitar em verdadero. if (somevalue(=)24) Comandes f[else sto | bastante simples, Se // You can have as many statements a condigia resuitar 7/ as you want inside the brackets MessageBox.Show("O valor foi 24.”); verdadeira, o programa» 388 execute os comandos entre « primeins conjumrte de chaves. Se nis for a case, ele execute os comandos debra de segunde MessageBox.Show("O valor nao foi 24.”); Nao se confunda com os operadores de dois sinais de igual! Vocé usa um sinal de igual (=) para atribuir 0 valor para uma varidvel @ os Veja bem! 22% sia (==) pare comparacdes. Voce ndo acredtaia em quantos erros em programas - mesmo alguns cometidos por programadores experientes - sdo causados por colocar = no lugar de ==. Se vocé observar o IDE reclamando que “nao se pode converter implicitamente o tipo ‘int’ para "boo!" (cannot implicitly convert type ‘int’ to ‘boo!), provavelmente, vocé cometeu este erro, 62 Capitulo 2 Estabelega condigdes e veja se elas sao verdadeiras Use comandos if/else para dizer ao programa fazer certas coisas 36 quando as condi¢des estabelecidas por vocé forem (ou nao) verdadeiras. Utilize operadores légicos para checar condigées Vocé acabou de ver o operador = iguais. Existem alguns outros operadores também. Nao se preocupe em memorizé-los agora - nés os veremos nos préximos capitulos: © operador !~ funciona de forma bem parecida ao se duas coisas que vocé esta comparando nao sao iguais *~ usado para testar se duas variaveis sa0 tudo 6 somente cédigo Quando vecé usa um operader condicional para comparar dois néimeres, iste chamado teste condicional. , exceto pelo fato de ser verdadeiro 4k Vocé pode usar > ou < para comparar némeros e ver se um é maior ov menor do que 0 outro. 4k Os ==, !=, > @ < sao chamades operadores condicionais. Quando vocé os usa para testar duos variéveis ou valores é chamado de teste condicional. Yocé pode com checar se i é igual a 3 ou se j é menos do que 5, faca (i == Atribua um valor a uma variével e cheque-a Aqui vemos 0 cédigo para o segundo botao. £ um comando if /e: checa ume variével inteira chamada x para ver se ela & igual a 10. sae PO uma variavel chamade xe fagemernas SC ‘ oe aS iatio ae checames SC ele Ciguat « (0. Aqui esté o resultado. Veja se consegue ajustar uma linha do cédigo e fazer a mensagem mudar para “x must be 10” (x deve ser 10). MossaseBon.Show!"x necesita sar 10"); Acrescente outro teste condicional O terceiro botao produz o resultado seguinte. Mude duas linhas de cédigo para que ele faca oparecer ambas os caixas de mensagem. it (Isovevalue < 3) 68 inine.Equale (“Joe”) MessageBox.show(" 4 3 @ 0 nome @ Joe") MessageBox.snow ("essa linha execute en qual =P 12 vold button’ Click(object sender, Even ar testes condicionais individuais num teste longo usando o operador + para AND (operacéo E légica) e 0 operador | | para OR (operacéo OU légica). Entae pora 311 G <5). eo Seotiie: $e de paren sey gue Soft bes de ager i nit deinarnd soe se ent 2 cedige ensvamts 6 pragrama told senda encevtaterlocs pode paré-lo fechande a ranch, Users o beta stop Granary? ae barre de Serramentas, oy Sthecisnando Stop Debussis Geran a depuragis) ne = Debug, menu ne 8 Se enti, Ame Crome) Sets de ue ne vooé esté aquir 63 de novo ¢ de novo e de nove e... Adicione lagos ao seu programa Aqui esté © codigo para 0 ultimo beta. Ele possui dois lacos. O pri verdadeira - faca algo enquanto isto for verdadeiro. O segundo 6 um laco for. Examine e veja como isto funciona. ivate vold buttond Click(obiact sender, Eventaras ey A se, 4 ® id buctond_Click {obs aan, evencacan 0) A sequmde parte de comends Sse lage © panto 1H for €o teste, Se aig or 50 Or while (count < ra es weet” mile ( 10) attr arn ao averiave! A070. eee ene 94 deve continues, “ran mene ei or Leto erie o ago, Ele apents— Soune oa Se eee Pedlmemte fe, Se re Tere. booemton sine cesta «cess 1 Eafe aes io ree sera usade nele, , cxecoten BYE 0 lage YO adlicisnad mace | 4 p Antes de clicar no botdo, leia todo 0 cédigo e tente descobrir o que a caixa de mensagem mostrara. Entao clique e veja se vocé esta certo! ponte sew bépis— Vamos praticar um pouco mais os testes condicionais e lagos. Dé ume olhada no cédigo abaixo. Circule os testes condicionais e complete os espacos para que os comentarios descrevam corretamente o cédigo em execusdo. int result = 0; // esta variavel tera o sesultado final Completemes 4 int x = 6; // declara uma variavel x e ashanabee dell, Pe imeie pane eh while (x > 3) { // executar esses comandos enquanto result = result +x; // adiciona x x=x- 1; // subtraa ) for (int z=; 2<3; 2=2+41) ( 7] comece © 1aco ao 7/ continue 0 laco enquanto 71 apos cada 1aco result = result +z; // ) // © préximo comando mostraré uma caixa de mensagom que diz uW MessageBox. Show("O resultado 6” + result) ; 64 Capitulo 2 tudo 6 somente cédigo Espere! Tem uma falha na sua légica. O que acontece com meu laco se eu escrever um teste condicional que nunca seja falso? Entao seu laco sera executado para sempre! Toda vez que seu programa executar um teste condicional, o resultado sera verdadeiro ou folso. Se for verdadeiro, entao seu programa passa pelo lao mais uma vez. O cédigo de todos os lacos deveria ser feito de forma que, depois que ele executasse um certo numero de vezes, retornasse falso. Mas se isso n6o acontecer ele continuard executando até que vocé desligue o aplicativo ov 0 computador! Aigumas veges chamee se drone seu lapis iste de loop infinite. Eis alguns lacos. Escreva se cada um deles vai se repetir para sempre ou se, eventualmente, ele terminard. Se o laco encerrar, quantas vezes ele iterara? Lago #1 Laco #3 een int count = int j = 2 amt p= ae a while (count > 0) { for (int i= 1; i < 190, FOF (int a= 27 q < 324 count = count * 3; i=i* 2) qa=a* 2) { count = count * { 7 a j-5-4 while (p 65 ‘se apenas, mas apenas se Aponte seu lapis ~ Solugao Vamos praticar um pouco mais os testes condicionais e lagos. Dé uma olhada no cédigo abaixo. Circule os testes condicionais e complete os espacos para que os comentérios descrevam corretamente o codigo em execucao. int result = 0; // esta var: int x = 6; // declara uma variavel x e.44#,/a while G> 3D ( // executar jes comandos enquanto */¢/.! result = result + x; // adiciona x 2 yecivel result gies . chet oes : comande if interna verifica & re Bi, ae can da rotule, 5 no momento “ ele esta vermetho, execute um comand sue o deine 630. Este comands execute se. sea cor de funde de rotula nia for vermelba e, neste case, 2 faz, com ue ela A reterne Vocé pode baixar o cédigo de todas as solugées de exerciclos pane esta cor, neste livro em www.altabooks.com.br iste caixa de mensagem aparece 5€ 4 caixa de checagem nia estiver marcade, 70 Capitulo 2 tudo 6 somente codigo Vames fozer algo chamative! Iuedo do Qvands o IDE adicionay este metede, tambem Exireiclo acrescemtav um return extra antes do fecha chave, Plgumas veges colocaremas & chave nt Aigumas veses nia mastraremes tade chia numa __-nesma linked vm camande de mest fama pare solugia, apenas as partes alteradas, Tada a agica do poupar espace - mas a Cit nia se importa com ‘eete Flashy Thing Literaimente coisa piscanted Cath ne nebiee wbtanf CkO ree LD ateoney avtomaticamente svando voce chee duas veges no hott painel de design de farmulario, Olasoexterna vile (Visible) fia exeavtande/”) for (int c= 0: © < 254 66 Visibler c+) enguerto e this.backColor = Color.FromArgbic, 255 ~ ¢» ¢)7 Lomi application. Dozvents ()7 RK system. Threading. Thread. Sleep (3) estiver visivel, ae é P = Lage gue cle for (int ¢ = 254; ¢>= 0 sev 564 Fechade, thia.BackColor = Color.FromArgb(c, 255 - 6, eh? aVisibied application .DoBvents () ‘btepade pana System. Threading. Thread. Sleep (3)7 Halse @ awhile ri deveparar de executer, , Resolvemes « proble aperadar ki pare Fa5e fambom chegue a prope Iagas encervam assim gue Visible Vocé conseguiu descobrir o que estava causando o atraso? Conseguiu resolver 0 problema de forma que o programa terminasse imediatamente quando vocé fechasse a janela? © atraso acontece porque os lacos for precisam se encerrar antes que © while possa checar se Visible ainda é verdadeira, Pode-se resolver o problema adicionando && Visible == true no teste condicional em cada laco for. € persertamente vida, ma de atrase extra usands com gue cada um dos (ages vedade J iible Desa forma, 08 O primeine age for fay com sue a5 cores sgjam atterades de ume forma €0 segunda reverte essa ardem para deixar & variasito mais suave. se Forme false, Seu eddige est um pouco diferente do nosso? Existe mais de uma forma de resolver qualquer problema de programagie, come, por exemple, usar lagos while no lugar de Iagos Yor. Se seu programa funciona, entiio Voce fez o exereicio cometamente! voeé esté aqui> 71 ovientem-se! 3 Objetos: x * Fazendo o codigo ter sentido x 3« & por isso que a minha classe ‘Marido néio tem os métodes ‘AjudarNasTarefasDomesticas() ou FazerSueParte(), Cada programa que vocé escreve resolve um problema. (Quando vocé esta desenwolvendo um programa é sempre uma boa idéia comegar pensando sobre qual problema ele deveria resolver. E por isso que objetos sao to utes. Eles permite estruturaro cédigo bbaseando-se no problema que se esté resolvendo. Assim, vo pode user seu tempo pensando sobre 0 problema que precisa sor enftentando, em vez de ficaratolado na mecdnica de escrever cédigo. Quando se Usa um objeto corretamenta, acaba-se com cévigo que é intuive de escrever e facil de ler e alterar este éum novo capitulo 77 Miguel esta de saida Como Miguel pensa a respeito de seus problemas ‘Miguel é um programador que vai a uma entrevista de emprego. Ele mal pode esperar para mostrar suas habilidades com 0 C#, mas primeiro tem que chegar Ié - ¢ esté prestes a se atrasar! @ Miguel decide qual caminho vai usar para chegar ao local da entrevista. Pegarei a ponte na rua 31, continuarei pela avenida Liberdade, € irei pelo Campo Belo. oN Miguel penseu ne local gue gueria chegar € q eortia determiney um caminko, @ Ainda bem que ele estava com 0 rédio ligado. Ele ouve que 0 trénsito esté muito lento no caminho escolhido e isso otrasé-lo! Miguel recebe novas infarmasbes a respeite de una $ ‘Aqui € Francisco Grito para 0 programa as rvs gue ele precise evi Relatério de trénsito nés vemos tudo. Parece que um acidente envolvendo trés carros na avenida Liberdade faz com que © trdnsito fique quase parado por toda a ‘extensiio da avenida até a rua 32. Miguel imagina um novo caminho para chegar & — entrevista em tempo. Sem problemas. Se eu pegar a Assera ele imaginov um Estrada 28, ainda chego a tempo! nove caminke pare chesar na 20 local da entreviste, > a 4 78 Capitulo 3 objetos: orientem-se! Como o sistema de navegagao do carro de Miguel pensa sobre este problema Miguel desenvolveu seu préprio sistema de navegacéo GPS, que ele usa para ajudé-lo a andar pela cidade. Navigator (Nevegador) Setbestination(Fifth Ave & Penn A SetDestination() (Informa Destino) mic itgircoute: ’ | ModifyRouteToAvoid() (Modifique Rote Para Evitar) co occe — cetRoute(); ModifyRouteTolnclude(} (Modifique Rota Pare Inclur) GetRoutel) (Retorna Rota) in GetTimeToDestination) (Retorna Tempo Até Destino) TotaDistance() (Disténcia Total) © sistema de Messer estaselece um ponte de Lis o resuitade do metode bethovteo By destine € calevia ume rote, = uma string cam as instrugaes sve fis um diagrama de cles ses mo programa de Miguel, Ue mostee a mame em cima € 05 2] Miguel deveria seguir. ue @ ponte da rua 31 até a avenida Liberdade, até © Campo Be: 0 sivtema de navesesio recebe nevas pefesey cohen informasses « respeite de uma rva ye tte deveria tan. pe di fyRouter woid ( ore robe ete Arora ele pose calcvlar Uma La de destine. string route; eNOS = CCLRC) “pegue a Estrada 28 até a ponto do Parque Alto, até 4 pr a des Ingl Cs informa via nova rota sue nie inclut 2 rva gue Miguel uer eviter, O sistema de Navegagao de Miguel resolve ¢ problema da mesma forma que ele voce esté aqui 79 métodos de atribuigso © modiificagao de rotas A classe de navegagao de Miguel tem métodos para criar e modificar rotas A classe de navegacéo de Miguel tem métodos onde toda « acéo acontece. Mas diferente do método button_ Click) nos formulérios que voce desenvolveu, todos eles concentram-se em torno de um Unico problema: criar uma rota deniro de uma cidade. E por isso que Miguel agrupou-os todos dentro de uma mesmo classe e chamou- ade Navigator (navegador) Miguel projetou sua classe Navigator para facilitar criar modificar rotas. Para conseguir um caminho a seguir, © programa de Miguel chama 0 método Set Destination () (estabelece destino) ¢ entéo GeiRoute() (retorna rota), para conseguir as instrugdes como uma seqiiéncia de caracteres. Se for preciso modificar a rota, 0 programa chama 0 método Modi fyRouteToAvoid() (modifique rota para evitar) para alteré-la de forma a evitor uma certa rua e entéo chame Get Route () novamente para conseguir as novas instrugées. Miguel excahev nomes A paraiss mbbadas oe public class Navigator () { Ie " “ public void SetDestination(string destinationName) { ... }; 74" sertide pare public void ModityRouteToavoid(string streetName) ( ... }; “gvengueestive public ‘Stxind GetRoute () Came Be pensanda em come criar 7 uma rote através de uma iste éotipe de reterne de métede, Os comandos gue chamarem ——__ cidade, eA pen area revmaetiaste nohacee es yossper dese } tips e ele comberd as instrugies, Qvande avalor de reterne veld — “'sering rout Gagiad « metodo nie retorne nade. 7 e = Getzoute Alguns métodos tém um valor de retorno Todos os métodos sao feitos de comando que fazem coisas. Alguns apenos executam os a te seus comandos e encerram-se. Mas outros tem um valor de retorno, ou seja, um mcrae que cree om valor calculado ou gerado dentro do método ¢ enviade de volta para o comando que pe ke reterne ele chamou este método. O tipo do valor de retorno (como string ou int) échamado de —reforna um int, 0 tipo de retorno. metodo use os dois © comando return fax com que o método se encerre imediatamente. Seo seu método perdnetines pare do fiver um valor de retorno - ou seja, ele é declarado com tipo de retorno void , 0 caleviar 0 resuitade € comando return apenas deve ser seguido de um ponto e virgula e nao é obrigatorio ae ole exsta dentro do método. Mas se 0 métode fiver um tipo de retorno ele t#4* comand return obrigatoriamente deve ter 0 comando return. UC pare passer o valor de vette pare comande fTwotiunbers (int firstNunber, int secondNunber) y £ vec chamov, firstNumber * secondNumber; is um comando que chama um método para multiplicar dois Wetodes podem ter - Sa numeros. Ele retorna um int: parinetres valores ae seepoe Was voce tam! int myResult = MultiplyTwoNumbers (3, 5); <— por exemple. Ms as passer variave’s pare 1S Use o que vocé aprendeu para desenvolver um aplicativo simples * Vamos associar um formulério a uma classe e fazer seus botées chamarem métodos nela. aga isso formuls cl faz bot. hi tod: I & + * @ ric um novo projeto de Aplicativo Windows no IDE. Entéo adicione um arquivo de classe chamado Talker.cs (falante) clicando com 0 botéo direito no projeto no Navegador de Solucéo ¢ selecionando “class...” no menu Add (adicionar). Quando vocé dé para a sua nova classe o nome “Talker.cs”, o IDE automaticamente nomeia a nova classe dentro do arquivo como Talker. Entéo ele abrird o novo arquivo numa nova aba dentro do IDE. © Adicione using systen. Windows. Forms; ne topo do arquivo de classe. Em seguida adicione o seguinte cédigo na classe: 80 Capitulo 3 public static int BlahBlahBlah(string thingToSey, int mumberOfrines) ( as efesag eaincriogi= rt txtecomande 1, 2 for Unt come 2117 count < mumberofrin countt#) { ser WT" galetsing = Shebsering # ehogrosey + "\3rr ar cone ve MessageBox.show(snaistring); velar de reterne de metodo ym return finalString. Length: Biab BiahBtasO € vm irteire gue infarma e , (—— tamanke total da mensagem mastrade. nae Voct pode chaman Length 81 apresentanto objetos sta caine dum dingrana de classe, fe iste todos 05 metedes numa classe © € uma forma facil de ver SetDestination() ModifyRouteToAvoidl) tudo o que ele fas, ModifyRouteTolnclude() SetDestination() GerRouted) ModifyRouteToAvoid() GetTimeToDestination|) ModifyRouteToinclude() Navigator3 TotalDistance() GetRoute() SetDestination() ModifyRouteToAvoid|) ModifyRouteToinclude() GetRoute)) GetTimeToDestination() TotalDistance() GetTimeToDestination() TotalDistancel) Ei, isso ndo pode estar certo! E seu eu quiser alterar um método? Entdo terei que fazer isto trés vezes. Exato! Manter trés copias do mesmo seria cédigo realmente complicado. Muitos problemas a ser resolvides implicam em representor uma. mesma coisa muitas vezes. Neste caso, um monte de rotas. Mas poderiam ser um monte de turbinas, cées, arquivos de musica ou qualquer outro exemplo. Todos estes programas teriam algo em comum: sempre precisariam tratar o mesmo tipo de coisa da mesma forma, nao importa quantas fossem em cada caso. Miguel pode usar objetos para resolver o problema Objetos s40 o ferramenta do C# pora trabalhar com varias coisas semelhantes. Miguel pode usar objetos para desenvolver sue classe Novigotor a (ng apenas uma Gnica vez, mas usar quantas cépias quiser num programa. x % ‘SetDestination() ModifyRouteToAvoid|) Kovigstor ModifyRouteTolnclude() ——a P eae, Fr Miguel precisev GefTimeToDestination() TotalDistance() ova I comparan tree Sey Raa to mesmo tempo, Tudo 0 que voeé precisa para criar de ferme yreesee um objeto 6 a palavra chave new Se NAG tres abetas (novo) e o nome de uma classe. Navigator omarlaccanente Navigator navigatorl =(new) navigatorl .SetDestina‘ m(“Fifth Ave & Penn Ave”) ; string route; Ciavigatori.cethoute( > Ag6ra vocé pode usar o objeto! Quando vocé cria um objeto a partir de uma classe, ele tem todos os métodos dela. 82 Capitulo 3 ‘objetos: oriontom-so! Vocé pode usar uma classe para construir um objeto Uma classe 6 como uma planta de uma casa para um objeto. Se vocé quiser construir cinco casas idénticas num empreendimento de construgdo no subirbio, vocé néo pediré ao arquiteto para desenhar cinco cépias idénticas de plantas. Vocé usaré somente uma para construir as cinco casas. Quando vock define uma classe, define seus mi exetamente como uma planta define 0 esqvemna de me cas, \ Bt gy a —- ——... constouir gualguer mimero de cases K_ epade usar uma classe pare crian > N queer guantidede de objetos, *f ws Um objeto obtém seus métodos de sua classe Uma vez que uma classe tenha sido criada, vocé pode criar quantos objetos queira usando-a com 0 comando new. Quando fizer isto, cada método declarado como public (publico) na classe se torna parte do objeto. GiveShelter() (abrigo) AppreciatelnValvel) (estimativa de preso) GrowLawn() (grama crescendo) MoilDelivered!) (cortas entregues) ClogDrainPipes() (entupir calhas) ‘AccruePropertyTaxes() (aumentar impostos) NeedRepairsl) (precisa de reparos) Quando vocé cria um novo objeto a partir de uma classe, ele é chamado de uma instancia desta classe. Adivinhe s6... vocé j@ sabe isto! Cada item na caixa de ferramentas é uma classe: existe uma classe Button, uma TextBox, uma Label, etc. Quando vocé arrasta um botéo da caixa de ferramentas, o IDE automaticamente cria uma insténcia da classe But ton e a chama, por exemplo, de but toni. Quando vocé arrasta um segundo botéo, uma outra instancia chamada de, nesse caso, button2, é criada. Cada instancia de Button tem seus préprios métodos e propriedades. Mesmo assim todos os botoes comportam-se ‘exatamente da mesma forma, jd que sao instancias da mesma classe. “ Portes: bis uma figure da ‘oy mend de 500 computador svando 0 stu programe inci, voce esté aquir 83 ‘objetos melhoram seu cédigo Sev pragrena execote im comands nen: House 115MapleDrive = new House() ; Depots: Agere existe uma banc da classe House Ceased ne memset. | * Faga isso! Veja vocé mesmo! : “ Abra qualquer projeto que use um botéo button1 use o IDE para procurar por todo 0 projeto por “new button”. Vocé encontraré 0 cédigo que o IDE adicionov ao arquivo de definigéo do formulério para criar a insténcia da classe Button. Uma solugao melhor. jm para voce! LTE sivlepe Goaphiea! U Miguel faz um novo programa de comparagéo de rotas que usa objetos para encontrar a Sf. Erber ies menor entre trés rotas para o mesmo destino, Eis como ele desenvolver o aplicativo. P , Soifica de Ysvarie), 7 pelrpentent @ Miguel cia uma GUI com uma caixa de texto - coxtBox! contém git constrvinds syando destino das trés rotas. Entao ele adiciona textBox2, que tem uma rua Fag um farmuliric ne cuje rota especifica deve evitar, e textBox3, que conteré uma rua painel de design, diferente que o terceira rota deverd ineluir. @ Ele criou um objeto Navigator ¢ determinou qual seria 0 destino. a nigetol 8 en ‘eHaneia ae Clase Navigator classe Mav's textBoxl Texts SetDestination() ModifyRouteToAvoi String destina ModifyRouteTolnclude() Novigator navigator1 = new Navigator () GetRoute() navigator]. SetDestination (destination) : GetTimeToDestination) route = navigatorl.cetRoute() die TotalDistance() [Os chiaetiorh) setts Rav-tetafiverdO € Modify ov tetoL nude? ‘ametre gue E ume @ Em seguida ele adicionou um segundo objeto Navigator ae navigator2. Ele chama o método SetDestination() para determinar o destino ¢ entéo o Modi fyRouteToAvoid() (modificar rota para evitar). fo ipa um pe String. @ 2 fercviro objeto Navigator 6 chamade de navigators. Miguel Seti © destino e entéo chama o método Modi fyRouteToInelude () Criar um novo objeto a partir de uma classe chamado de criay uma instancia desta classe. @ Acora Miguel pode chamor os métodos TotalDistance () de todos os objetes para determinar qual é a rota mois curta, E voc8 teve que criar 0 cédigo apenas uma vex © néo trés! 84 Capitulo 3 objetos: orientom-so! adionte seu lapis Siga os mesmos pasos que Miguel seguiv na pagina anterior para escrever o cédigo para criar objetos Navigator e chomar seus métodos. Aadirtames im pave String destination = textBoxl.Text? Yack Bis acdc ats AOS pre String routezStreetToavoid = textBox2.Te Pare oben as defo oe EereveL String route3StreetToInclude = textBox3.Tex! ees dase Se names de eines de tect Navigator navigator = new Navigator () aalgets navigator. SetDest ination (destination) padi, a chdige pare crit 02 int distancel = navigatorl.TotalDistance ()+ Lapresti ba setritvie um destina © Mayet Roane 1. Crie 0 objeto navigater2, atribua-lhe 0 destino, chame seu método ModifyRouteToAvoid() e guarde o resultado de TotalDistance() numa variavel inteira chamada distance2. Navigator navigator2 = navigator2. navigator2. int distance2 = 2. Crie o objeto navigator3, atribua o destino, chame ModifyRouteToInclude() e guarde o resultado de TotalDistance() numa varidvel inteira chamada distance3. pis nimeros €neParne © 0 mbtede predefinide do Cit Kdath, Mino nearis a menor, Higuel usoure pare achar a mener dis Tan Fé 0 destine. int shortestDistance = th.Min(distancel, Math.Min(distance2, distance3))7 voce esta aqui> 85 fixagdo oletro-estitica Aponte seu lépis Siga os mesmos passos que Miguel seguiu na pagina anterior para Solugao escrever o cédigo para criar objetos Navigator e chamar seus métodos. String destination - textBoxl.text; Antanas um pauce as coisas String route2streetToavoid = textBox2.Text; rina cdo eID Kava seeing. soueesstevdbtameluds, <.naxvBGns. Text pire Secs tea nee ae ° SEGRE SY destinas ¢ names de rues das ctines Navigator navigatorl = new Navigator ( de texte, junto coma pare critn a navigatorl.SetDestination (destination); primeine ebjete Navigator, etribvir int distancel = navigatorl.TotalDistance(); J ie kite t remount "1. Crie 0 objeto navigator?, atribua-Ihe 0 destino, chame seu método ModifyRouteToAvoid() ' e guarde o resultado de TotalDistance() numa varidvel inteira chamada distance2. | Navigator navigator2 new Navigator, | navigator2. SeHestinctiondertination?: | navigator2. Medigheaute AvsicouteD.StrectaPr ai, | int distance2 =. nvgeterZ feteliztanced; | 2. Crie 0 objeto navigator3, atribua o destino, chame MedifyRouteToInelude() e guarde o | resultado de TotalDistance() numa varidvel inteira chamade distances 1 Mavisater navigator3 = new NavisaterO | navigator 3 SetDes tin navigator 5 tdodthy au teTeLnctudetrou te IStreeHeL nclude), irk abace) = navaebar 5 obaD nee, rros eretorna lo ide do C# Math MMin® compara dois numeres € pre - char a menor distancit ates destino. | int shortestDistance = Math.Min(distancel, Math.Min(distance2, distance3)); Omi menor, Miguel useune pare a Espere ail Jé escrevi algumas classes até agora, mas ndo tiinha usado “new” para criar uma insténcia ainda! Isto quer dizer que posso chamar métodos sem ter que criar objetos?, ‘Sim! E por isso que vocé usou a palavra chave w em seus métodos. Dé uma outra olhada na declaracéo para a classe Talker que vocé criou algumas paginas atrés: class Talker ‘ public static int BlahBlahBlah (String thingToSay, int numberofTimes} i string fina: ng = Quando vocé chamou os métodos nao criou uma nova instancia de Talker. Apenas fez iss: ‘Talker. 2labBlahBlah ("Hel hello hells", 5)3 E assim que se chamam métodos estaticos e vocé esteve fazendo isso até agora. Se vocé tirar a palayra chave static da declaracéo do método B1ahB1ahBlah (), deveré eriar uma instancia de Talker() para poder chama-lo. Tirando esta distincao, métodos estaticos so exatamente iguais a métodos de objetos. Vocé pode passar parémetros para eles, eles podem retornar valores e eles existem dentro de classes. Ha uma outra coisa que vocé pode fazer com a palavra chave =t3+ic. Vocé pode marcar toda ume classe como static e entao todos os seus métodos deverao ser estaticos também. Se vocé tentar adicionar um método no estatico numa classe marcada com static, néo conseguir compilar seu codigo. 86 Capitulo 3 objetos: orientem-se! nde existem Perguntas Idictas Quando penso em algo como “estético”, penso em alguma coisa que nao se modifica. Ou seja, métodos nao estaticos podem mudar, mas os estaticos nao? Eles comportam-se de forma diferente? R: Nao. tanto os métedos estaticos como os ndo estéticos so exatamente iguas. A Unica diferenca & que os estos néo precisam de uma instancia, enquanto que os nao estaticos exigem tum, Muitas pessoas tém problemas para lembrar-se disso, porave a palavra “estatco” nao é realmente muito intutva intéo nao posso usar minha classe até criar uma instancia de um objeto? RR: Vocé pode usar seus métodos estaticos. Mas se tiver métodos sem esta qualidade, precisaré de uma insténcia antes de poder uséos, 'P: Entao porque eu usaria um método que precisa de uma instancia? Porque nao fazé-los todos estaticos? RR: Porque se vooé tem um objeto que esta sendo usado para registrar certos dads - como as instncias de cada um dos ‘objelos Navigator de Miguel ostavam sendo usada para manter registro de rotas diferentes -ento pode usar os métodos de cada insténcia para trabalhar com os dados proprios de cada uma delas. Entdo quando Miguel chamou o método ModifyRouteToAvoid() na insténcia navigator2,afetou somente a rota armazenada naquele objeto em particular. Nao afetou navigator’ ou navigator3. E assim que ele foi capaz de trabalhar com trés diferentes rotas ao mesmo {tempo -@ 0 seu programa pode manter registro de todas elas. : Entao como uma instancia mantém registro de seus dados? R: Vire a pagina ¢ descubra! Uma instancia usa campos para manter registro sobre coisas Vocé mudou 0 texto num botéo alterando sua propriedade Text no IDE. Quando vocé fez isto, 0 IDE adicionou codigo como o seguinte no painel de design: buttonl.Text = “texto para o botao”? Reenicamente se esta atribvinde valor «uma propaiedade,tstas sis ‘om Tipo especial de campo np = mas vames chesar niste day! Agora vocé sabe que but ton! € uma instancia da classe Button. O que esse cédigo faz é modificor um campo na instancia but ton1. Vocé pode adicionar os campos num diagrama de classe - s6 precisa desenhar uma linha horizontal no meio dele. Os campos séo colocados acima desta linha e ‘0s métodos, abaixo. Campo? : Campo2 f assim gue um diagrama de >| Campos classe €usede pare mostrar seus campos. Cade instance aiang de ume clesze utiliga-os pare moan mater registro de sev estade. Metodo3() Adiviane este linha pa 0s campos dos metodos. separer vocé esta aquib 87 O estado dos negécios de um objeto Métodos sao 0 que 0 objeto faz. Campos sao 0 que ele sabe. Quando Miguel criou trés instancias da classe Navigator, seu programa instanciou trés objetos. Cada um deles foi usado para manter registro de uma rota diferente. Quando 0 programa criou a instancia navigator? e chamou seu método SetDest ination (), atribuiu o destino apenas aquela instancia. Isso ndo afetou navigator1 nem navigator3. Coste instincia de Denton CS egehie she see ees Oiedrlees ate Roreninecoar Oyveum cbt Meryeter fey fey Madieesinaterel é deiner sue voct estabelesa um GetRovte) ee TN dest 18, moditigue a rote e obtenka GetTimeToDestination() infermagies sobre ele. Totoll rancel) O comportamente de um objeto & definide pelos seus métodos e ele usa seus campos para manter registro de seu estado. Vamos criar algumas instancias! Lembre-se, 6 suande voce notap E facil adicionar campos em suas classes. Apenas ftom esertte ne frente eum declare-os fora de qualquer método. Agora cada metodo, sven diser sue ele nie insténcia tem sua propria cépia dessas variéveis. Heth ras ] piitie clean iow 1, public String Naney public int Height; Public void TalkAboutYoursel£() ( MessageBox.show ("Hy nane is ” + Nene +" and I'm” — ft Helght +° inches tai..”); 2, t Goan vest yiser evtan nstncts de sve classe, nite use 4 palayra chave static nem na da mesma, nemem nenhum metodo, Palhaco FaleSobreVoco() 88 Capitulo 3 objetos: orientemn-se! Lembre-se, a eperador ¥e dis 00 Cit perepeger ape per peestgat Ca5perds dc Sat ppar pete ye estiver & direite, hointe seu lapis Escreva'es conteddes de cada mensogem que serd exibida depois da execugéo do comando ao lado dela. new Clown ()+ oneclown.Name ~ “Boffo"; oneClown-Height ~ 14; oneClown.TalkAboutYoursel£ (); eeutenho___de altura.” Clown anotherClown = new Clown (); anotherClown Name = “Bifi"s anotherClown.Feight = 16; anotherClown.TalkAboutYoursel£ () ; “Mev nomeé se evtenho__de altura.” Clown clown3 = new Clown(}: lown3 .Nar = anotherCLown. Names clown3 Height own.Height - 3; ciswds meus eereaeseLT OF “Meu nome é eeu tenho de altura.” anotherClown.Height * anotherClown.TalkAboutYoursel£() ; “Meu nome é eeu tenho de altura.” Gragas 4 memoria Quando seu programa cria um objeto, ele existiré numa parte da memoria do computador chamada de pilha (heap, em inglés). Quando sev codigo cria um objeto com um comando new, 0 C# imediatamente reserva um espago na pilha para que ele possa armazenar os dados daquele objeto. fis uma figure da pitha antes do programa comegar. Note gue el esta vey vocé esta aqui> 89 Vamos olhar com cuidado 0 que aconteceu aqui. y Aponte seu lapis ~ Soluga Escreva os conteddos de cada mensagem que sera exibida depois da execugéo do comando ao lado dela. Cada um dos comandos new criov uma instancia de classe Clown Ree me Gpalhaged reservande um pedase da memaria ne pitha para cle € lcaown oneciown “Meu nome eevtenho “/ dechve— JanotherClown. Height *= |anotherClown. Talkabout¥oureel£ () ; “Mou nome é__Siff _ eeutenho 32 de altura, Quando seu programa exia um nove objeto, ele é adicionado a pilha. 0 que passa pela mente de seu programa ‘Aqui esté como seu programa cria a nova instancia da classe Clown. Clown myInstance = new Clown()s Na realidade, aqui temos dois comandos combinados em um 86. O primeiro declara uma variével do tipo Clown (Clown myTnstance). O segundo cria um novo objeto e atribui-o a varidvel recém-criada (myinstance = new Clown () ;). Eis @ aparéncia da pilha depois de cada um desses comandos: 90 Capitulo 3 certifique-se que métodos fagam sentido objetos: orientem-se! Este abjete é ume instancia da classe Clawn Cpalhaga), ,) @ — oneClown.Name = “Boffo”; 7 oieClown Height = 44; O prineine jets ened ® ‘ it: lores. 7 oneClown. TaLkAboutYoursel£ (07 seus campos necebem Ve © ctevs snenezcimannencromy anotherCiown-Name = "BILE"; tnotherCiown.tietght = 167 anotherClown.TalkAboutYoursel#() J Estes comandos eriam um segundo objeto ¢ preenchem- ne com dade: oneClown .Heigh' pees <108103 Tal kAbout Yourself (); Sorbie « Perceire objets Clown é eniade e peveade Cov s¢jA, oF Aedes sito preenchidos). © csasmecromnnianmess 2 mmmmmns> znotherClown.TalkaboutYourself (): comandes nia criam Um nave apenas medificam um sue ja es Voeé pode usar nomes de classes e métodos para deixar seu cédigo mais intuitive Quando voce insere codigo num método, esté fazendo uma escolha sobre como estruturar seu programa. Vai usar um Gnico métedo? Mais de um? E preciso um método, afinal de contas? As escolhas sobre métodes podem deixar seu programa muito mais intuitivo - ou, se vocé nao tomar cuidado, muito mais confuso. @ Eis um belo e compacto trecho de cédigo. Ele vem de um programa de controle que faz com que uma méquina de fazer barras doces funcione. ZX Ometede chk Teng® retorna um int t = mchiktemptTs af (t > 160) ( ae MAS 0 SUE Cle Sas? a “m” sie T obj = ney fssmasl tereiet(O Naf scistrp((2 0 métode cls pVO tem um Fenes cone nagar sees pachoehos aes sabe meairsyschk(); para que ele serve, gue eles Fazem. E pare sve serve a classe TO? ' voeé esté aqui 91 Dé uma segunda olhada neste cédigo. Vocé consegue determinar para que ele serve? @ _ Estes comandos néo dao nenhuma pista sobre porque 0 codigo estd fazendo o que estd. Neste caso, 0 programador ficou feliz com o resultado porque conseguiu fazer tudo 0 que precisava num Unico método. ‘Mas fazer seu cédigo ser tao compacto quanto possivel nao é realmente utill Vamos dividi-lo em varios métodos para deixd-lo mais facil de ler e vamos também certificar-nos de que as classes recebam nomes que facam sentido. Mas vamos comecar entendendo para que esse codigo deveria servir. Come voce determine dilidede dem Produtor de Barras Doces Tipo 5 General Eletronics ae ‘tiga? Bem, todos °F Manual de Especificacoes cod Jao escrites programas # ee |A temperatura do creme precisa ser checada a cada 3 minutos por um sistema por um motive. OS lautomatizado. Se a temperatura ultrapassar os 160°C, o doce estard quente siege ae avoce mn idemais e o sistema precisara executar 0 procedimento de liberacdo do sistema Ay podemes olhar ide isolamento de doce para resfriamento (CICS, de candy isolation cooling Mga do mart! |syster)- Frc especibleagaes 3ve* + Fecha-se a valvula de fluxo de curso na turbina #2 (trip throttle valve) ee amader 56500" + Enche-se o sistema de isolamento totalmente com agua para resfriamento pees} + Libera-se a gua * Verifica-se se ndo existe nenhum traco de ar no sistema @ _ {212 Péina do manvolfaclitou o entendimento do codigo e dé-nos étimas dicas sobre como fazer fcitor © entendimento do nosso cédigo. Agora sabemos porque o teste condicional tem como limite para a varidvel o numero 160 - 0 manual diz que qualquer temperatura além desta significa que o creme esta quente demais. E acontece que “m” é uma classe que control a maquina de fazer doce, com métodos cestiticos para checar a temperatura do creme ¢ 0 sistema de ar. Entao vamos colocar a checagem de temperatura em um método e escolher nomes para a classe ¢ os métodos que deixem seus objetivos ébvios. Eietaas anogatraonse pT Maker .CheckNougat Temperature () ; LE (temp > 160) | at A. Ae noncan a clsse come Mater Guepade jaiea | ser Prades come produtor) ee metede de CheckNousatTemperature (verifique i a temperatura de creme), 0 cadiza fica ) muito mais facil de entender. return false; } Ovalar de retarne desse metoda € Um beoleane, ev s¢ja, ele retorna verdadeire ov Falso, 92 Capitulo 3 classes 20 natural ‘objetos: or/entem-se! @ © que as especificacées dizem a respeito do que fazer quando o creme estd quente demais? Elas nos dizem para empregar o procedimento de liberacao do sistema de isolamento de doces para resfriamento (ou CICS). Entéo vamos criar outro método e escolher um nome Sbvio para a classe “T” (que a classe que controla a turbina) e para a classe “ics” (que controla o sistema de isolamento pora resfriamento e que tem dois métodos, um para encher e outro para liberar o contetde do sistema}: turbineController.Closetripvalve (2)? Om tipo void oer turbineController.cl: pValve (2) y a IsolationCoolingsystem.Fill(); diser que e metede nite IsolationCcolingSystem.Vent (); retorna nenbum valor, Maker .CheckAirSystem(); @ 4010 0 cédigo es16 muito mais intuitive! Mesmo que voc# néo saiba que o procedimento de liberacéo do CICS precisa ser executado se 0 creme estiver muito quente, 6 muito mais Sbvio 0 que este cédigo esté fazendo. (IsNougatTootot {) = DocIcsventProcedt true) { oe Voo8 pode Laver seu eddigo mais Keil de ler ¢ entender ao pensar a tespelto lo problema que esth sendo vesolvide por ele. Se Yoo’ escolher nomes para seus métodos que Sagam sentido para alguém que entenda o problema, ento seu cédige ser muito mats Mell de dectfiar... e desenvolver! Dé as suas classes uma estrutura natural Pare um momento e lembre-se do motivo para que seus métodos sejam intuitivos: porque cada programa serve para resolver um problema ou fem um propésito. Pode nao ser um problema empresarial - algumas vezes o propésito de um software (como 0 FlashyThing) ¢ apenas ser divertido e legal! Mas nao importa o que seu programa faca, quanto mais voce puder fazer com que seu cédigo se assemelhe ao problema que esté tentando resolver, mais facil seré de escrevé-lo (e lé-lo, e fazer correcées, € manutencao...). vocé esté aqui> 93 Use diagramas de classes para plangja-las im diagrama delasse é uma farma sinples de descrevers Usande uma Falke de, LE nealmemte uma ferramemte valiase pare prejeter sev cdlize de comeser a escreve-le, ~ Esereva o nome da classe no tape do Depots o name de cada smétade ma cane So ee ee classe numa Unica Vamos desenhar um diagrama de classe Dé uma nova olhada no comande if no item 5 ne pagina anterior. Vocé jé sabe que NomeClasse Método() Métodol) Métodol) comandos sempre so contides dentro de métodos, que, por sua vez, estéo contidos em classes, certo? Nesse caso, 0 comando if esta num método chamado DoMaintenanceTests() (faca testes de manutencao), que parte da classe CandyController (controlador de doces). Agora olhe para © cédigo e para o diagrama de classe. Percebe a relacéo entre eles? public cl publi 38 CandyController { void DoMaintenanceTests() { if (TsNougat { sventPr Nougat TooHot () public void Do: public boclean I 94 Capitulo 3 CandyController DoMaintenanceTests() DoCICSVeniProcedure() IsNougatTooHot() objetos: orientem-sel = Aponte seu lapis O programa para o sistema de controle de doces desenvolvido nas paginas anteriores chamava trés outras classes. Volte atrds no livro, olhe para o cédigo e preencha os diagramas de classe. Yma des clas ses tem um netede chamade Fil, Preencha 0 nome da classe e seu evtre metodo. ty ac acre 0 codigo das paginas srbevares. Freer sev nome e seu metede, Ce vocé esté aquim 95 Diagramas de classe ajudam a organizar o codigo de forma que ele faca sentido ‘Manter diagramas de classes facilita vislumbrar problemas potenciais nelas antes de escrever cédigo. Pensor nas suas classes de um ponto de vista mais elevado antes de entrar nos detalhes pode ajudar a projetar uma estrutura de classes que permita co cédigo resolver o problema para qual é escrito. Isso permite dar um passo para trés € certificar-se de que ndo esté planejando escrever cédigo desnecessério ou métodos @ classes pobremente estruturados e também que aqueles que vocé escrever sejam intuitivos e faceis de usar. Aclasse é chamada de “LavaLoucas”, entdo todos ot os métodos deveriam ser Cokaedeergeney [| = sobre isso. Mas um deles - AiusteTemperaturaAgua) EstacioneCarro() - nao tem nada EstacioneCarro() a ver com loucgas, de forma que ele deve ser retirado e colocado em outra classe. LimpoLouses() ColoqueDetergente() ‘AiusteTemperaturaAgual) Aponte seu lapis © programa para o sistema de controle de doces desenvolvide nas Solugao paginas anteriores chomava trés outras classes. Volte atrds no livro, olhe para o cédigo e preencha os diagramas de classe. Voce note gue Maker € uma classe porgve ele aparece nt frente da ponte em Mater ChectPiirSystem0, Turbine TieteFonCootingSysFem Maker Fill Clasetaplaived vero Check Neuse temperature Check Bin Sys temo 96 Capitulo 3 algumas dicas dtels objetos: orfentem- - %q Aponte seu lapis. ‘Cada uma dessas classes tem um sério problema de projeto. Escreva o que voce pensa que esta errado com cada classe e como corrigi-la. Class23 Esta classe ¢ parte do sistema de produgéio de doces visto antes. PesoBerraDoce() ImprimirPacote() GeraRelatorios() Veil) As duas classes integram o sistema que uma pizzaria usa para controlar a entrega das pizzas. ‘AdicionarPizza() PizzaEntregue() TotolPago() TompeViagemi) EntregadoraPizza ‘AdicionarPizza\) PizzaEniregue() TotalPago() TempoViagem() CaixaRegistradora Aclasse CaixaRegistradora 6 parte de um programa usado por um sistema de cobranga de ume loja de conveniéncia automatizada. Vendatfetuadel) ‘SemVendas)) BombeieGasolinal) Reembolso() YolorTotalNoCaixal) RecuperalistoTransacoes() AdicionarDinheiro() RetiraDinheirol) voce esté aquir 97 — Aponte seu lapis a Solug como corrigimos as classes. Existe apenas uma tnica forma de resolver os problemas - mas muitas formas de fazer o projeto destas classes dependendo de como elas sao usadas. iN Esta classe 6 parte do sistema de produce de doces visto antes. PesoBarraDoce() ImprimirPacotel) GeraRelatorios\) InicieProducaaDeDoce() O nome da classe nto desereve seu propasite, Um prasramador que visse uma linha de codigo chamada Class 2 3Loc0 nite Feria a menor idéia do sue & linha fey, Tambom devemos renomear 0 metode para ser mais descritive - escalhemos LnitePheatceadeDecet, mas paderee sen giater arbre calrt ‘As duas classes integram o sistema que uma pizzaria usa para controlar a entrega das pizzos. Parece sve as dvas classes fazem a mesma coise: mantim controle AdicionarPizza) PizzaEntreguel) A) | TotalPagot) TempoViagem() de um entreseder sue esta fore fazendo ume entrege para cltertes, Um design melhor seria substitvir as dues por uma Unice € adicioner-ihe um campo para o sexe de pessee, Puticionamos um compa Sene porgue assuminas yve existe um mative pare controlar de forma separede omens e mulheres, gue deveria sero motive origin deexirtinem dues classes distintas, Acclasse CaixaRegistradora integra um programa usado por um sistema de cobranca de uma loja de conveniéncia. automatizada. Vendatfetvada() - SemVendas)) 2 a5 mébadas ma classe Him relasia cam a ue uma caine Reombolst) YalorTotalNoCaixal) RecuperalistaTransacoes() AdicionarDinheiro() RetiraDinheirol) Tes regirtradere Sas Saser vendas, abter istas de transasies, adicionar dinktire... exctto um: bombear saseling, & uma boa idéia separar esse metodo numa ovtra classe. 98 Capitulo 3 caras da classe trabalhadora objetos: orientem-se! public partial clase Form : Form private void buttont_click(object sender, EventArgs @} 1 = String result = *": Jogos de Verao Echo el = new Echot); Seu trabalho é pegar os trechos de codigo da piscina e colocé-los nas linhas em branco no cédigo principal. Vocé néo pode usor Sage ie HeLuaty & “er ‘© mesmo trecho mais de uma vez e nao precisa usar todos eles. Seu objetivo ¢ fazer uma classe que compile, execute © produza © resultado mostrado. Nao se engane - este exercicio € mais dificil do que parece. Resultado MossageRox ) public class public int pa Aloooo. Aloooo. Aloooo.. ‘Aloooo. a Contagem: 10 return “helloos: 2 _ ’ Nota: cada trecho na piscina Questéo de Bonus! so pode ser usado uma vez! Se a Gltima linha da saida fosse 24, em vez de 10, como vocé completaria o quebra-cabeca? Vocé pode fazer isto mudando apenas um énico comando. y xe5; @ x50 count x31 Echo Tester echot) count() hello) el=et4t; e1=count + el.count el.count = et.count-+ 1 —— > Resposta na pagina 110. Desenvolva uma classe para trabalhar com alguns caras tape Cosh Joe @ Bob emprestam dinheiro um para o outro todo tempo. Vamos GiveCoshi) desenvolver uma classe para manter registro disso. TakeCosh) @ _ Varnes criar uma classe Guy (cara) ¢ adicionar duas insténcias dela num formulério © formulério tera dois campos, um chamado joe (para associar com © primeiro objeto) © ‘outro chamado bob (para o segundo). cadigo gue € execoteds gvende » formulirie 6 eritda, Es come & ye pila £@ parece depais sue o farmuléris é canrestde: Guy* ‘Guy? voce esté aquir 99 @ Vamos atribuir a cada objeto Guy nome e dinheiro Os dois objetos representam dois caras diferentes. Logo, cada um deles tom um nome e uma quantidade de dinheiro no bolso. aS Cade care tem um campo Name Gnome) sue registra seu nome eum Cash Cdinheira) sue armasena suantos reais eles tem ne balse, Vamos dar tra dntwire dos coras Ronis ict papa ma een ey tain Useromes of meloos GivsCosh er dhe) pro sey mbfatoreCsHO (Hoe dink vcd 9 valor qu ui @ usaremo: TakeCash() para tomar o dinheiro de volta deles. 4778 “9 wertidade de dinteire sve ert tamada lope tad cab ia peice lal ATS asande joeibeCask25) tire 2S reais de} O formularie chama 0 metodo TakelashO do objeto. \ Ca) joe.TakeCash(25); eno = h on". ob métode retorna 0 valor em resis sve fet tomade, x Crie um projeto para seus caras Crie um novo projeto de Aplicativo Windows Forms (porque vocé usard um formulario). Entao use o Navegador de Solucde para adicionar uma nova classe chamada Guy. Certifique-se de adicionar “using System.Windows.Forms.” no inicio b * dovarquivoida classe Guy. Enitc insite dioSdigo. Ei-bo aqui: UV x . sepibock dC cartctores ¢ ton Public clase Guy (pon exemple). 2 canpe Cash € um irbeira, ue manterd Arcasse Eu public string Name; ‘ Rmeeey trbsiofat cash: registro de suemtos reais eles Him no bolso, Sete public int GiveCash(int amount) . e peel ve A £ (amount <= Cash 6& amount > 0) [~O métode GiveCashO tem um parimetro salicitande uma Cash -= amount; chamado ameunt (guantidede) que sera seerhiede ron = sade para diser a. care suerte dinheine le dinkeire else nike ubra faroaele MessageBox. Show ( ele deve darctee, 4\ tacusitinis “I don’t have enough cash to give you ” + amount, Ainkeire,emvez de ggtann 9, ee)? 2 subtra Um comande if @ usade para verificar } , \ se existe dinkeire suticiente- se for 0 case, este suentidade & tirade Se 0 cara nite Hiver dinheire de balsoe reternade coma valor de suficiente, ele dire a voct iss0 com nebcaia: ume caine de mensasem ¢ errtics fare cam gue GiveCashO retorne ere. 100 Capitulo 3 Joe diz “cade meu dinheiro?” objetos: orientern-se! 0 metodo ReceiveCashO Creceber public int Receivecash (int amount) { drhetre) fonciana came BiveCashO, Ye Af (amount > 0) { —— oaritade é passed come partnetre, cash += amount; checada para ver 5¢ € maior sue sere €, return amount; entia, adicionada aa total de dinkeire. } else { MessageBox. Show(amount + “ isn’t an amount I/1l tak Name + says...”); xeturn 0; fe Sea suantidade for pasitive, o metodo , ReceiveCeshO retarna a sventidede Adicionada, Se for sero ov negative, o cara mostra una mensagem e retarns sere, } : D_Preste atengio na colecegie de suas chaves. £ facil ervar a nimere delas ~ certi¥iguense de sve cada abre-chave Pemba um fecha-chave carrespandente. Quando elas esta tades corvetas, « DD ind idenPi-ls pare voct ewtamaticamente guande 4 dttima deles for Aigiteda, Crie um formulario para interagit com os caras ‘A classe Guy é étima, mas é s6 0 comeso. Agora coloque-a em um formulério que use duas insténcias dela. Ele terd rétulos para mostrar seus nomes © * quanto dinheiro eles tém; e botoes pora dar e firar dinheiro deles. * Cre isso! jone dois botées e seis rétulos no seu formulario * * 5 rétulos no lade direito do formulério mostram quanto dinheiro cada cara tem. Também adicionaremos uma variavel chamada bank (banco) no formulario - 0 terceiro rotulo @ direita mostra quanto dinheiro ele tem. Vocé devers alterar 0 nome de alguns dos rétulos que arrastaré para o formuldrio, Vocé pede fazer isto clicando em cada um deles e mudando a linha “(Name)” na janela de propriedades. Isso fard com que seu cédigo fique mais facil de ler, porque vocé usard “joeCash’ (dinheiro do joe) e “bobCash’, em ver de “label4” ov “label5". Nameie « rétvle superior come joesCash, » abaine dele coma bebsCash, @ inferior come bantCash, Vock pede deixar as propritdades Test de todos inelteradas, parue adicioneremes um metode sve var mudé-las, Este betta chamart 0 metodo ReceiveCash0 de objeto Joe, passerd 70 come wantidede € adicionare 9 dinheine dade & Use & varitvel bank, Joe tom RS 50 Bb tem RS 100 (© banco tem RS 100 Este bots chamard Givelast0 de Bob, passande S come suertidade, @ adicisnard o dinkeira gye ele neceberd de Use & variavel bank, vocé esté aqui> 101 Adicione variéveis no seu formulério Seu formulério precisaré manter registro dos dois caras. Logo, vocé precisard de uma varigvel para cada um. Chame-as de joe e bob. Adicione uma outra varidvel ao formulério chamada bank para manter registro de quanto dinheiro 0 formulario dev recebeu para os caras. oe A yuartidade de dinkeiro Uk sue estames usando amaa wee ne bance sobe e desce de objetos Guy para manter + cuy bob: acordo coma suantidade registra aresperte de Uoe Bob, vact declerera as Ant bank = 100; << e dinbeiro recebida ov as eeeLU_| dade 003 abjetes Evy pele Initializecomponent (1 veritveis usando uy. } formulario, @ _Aiicione um metodo no formulario para atualizar os rétulos Os rétulos no lado direito do formulério mostraréo quanto cada cara tem e quanto tem armazenado na varidvel banco. Entao adicione 0 métode UpdateForm() (atuclize formulario) para manté-los atualizados ye-se de que o tipo de retorno seja void para dizer ao C# que o método néo retorna um © seguinte método logo abaixo de onde vocé adicionou a variével bank: 4 public void UpdateForm() { eee Mate come a5 rétules SE Hae fea hae 5 ass GS & abveaate | eons E simples, Ue apenas sia efvatigues isende shoText. = bob.Name © 7 tem s* + bob.casn; [ Simples. Ele apenas , ‘We sh. Text = “O banco tem $” + bank: atvalisa os tres rotules as campos Name ¢ Cash do objeto buy, } etribvinda valores pare @ Clique duas vezes em cada botéo e adi 102 a3 suas propritdedes Tet. Vac€ Fara com sve eadebe Fras phamenare marrter os retules em dit. ne 0 cédigo para interagir com os objetos Certifique-se de que 0 botao da esquerda seja chamado button! e o da direita button?. Clique dvas vezes em cada um deles - quando vocé fizer isto, o IDE adicionaré dois métodos no formulario, button1_Click() e button2_Click(). Adicione o seguinte codigo em cada um deles: private void buttcnl_Click(object sender, EventArgs e) { if (bank >= 10) ( i Quande 0 usvarie clear na botia DE Rp eae 70 pare Vee, fermulirio chama a métode } else { KeceiveCashO do objeto oe ~ mas apenas hoseagobon, shew)" bance orth sem Sishet=0.")7 sea bance Fiver dinheire sufirerte, % i ee ee ) Ob private void buttcn2_Click(object sender, EventArgs €) { y * 70 para dar, vy bank += bob.Givecaan (5); arg nae sseheets natocbene i caine de mensasem, © botie Receber KB S de Bab nie precisa checar suante existe no banco, porgue cle apenas adiciona sualgver sue CGiovcirrebmetspatiae © WC. SeBipststenstan dinkeire, GiveCashO retarna sere, Capitulo 3 objetos: orienten-se! @ Ede sua responsabilidade determinar como Joe e Bob devem ser inicializados a respeito de suas propriedades Cash e Name. Coloque este cédigo diretamente abaixo de InitializeComponent() no formulario. Isto integra um método especial executado somente em uma Unica oportunidade: quando © formulério é iniciado pela primeira vez. Depois disto, clique em ambos os botdes algumas vezes - certifique-se de que um botdo ti tira RS 5 de Bob e o da para 0 banco. public Form() { nitializeComponent (17 // Initialize joe and bob here RS 10 do banco e adiciona o dinheiro a reserva de Joe e que o outro UT Pacione a tnhas de cbt ge" pare os dois ebjetos @ inicialigan seus campos Name ¢ Cash, nao existem, Perguntas Idiotas P: Porque a solugao nao inicia com “Guy bob = new Guy()"? Porque vocés deixaram de fora o primeiro “Guy”? R:: Porque vooé jé deciarou a variével bob no topo do formu, Lembre-se de que o comando “int |= 5° é 0 mesmo que dois ‘comands, “int” € #5". Aqui ocorre o mesmo. Vocé pode tentar declarar a varidvel bob numa linha como “Guy bob = new Guy), ‘mas vodt jd tem a primeira parte do comando ("Guy bab) no inicio do formulério. Entao s6 precisa da segunda metade, a parte que atibui 8 veridvel bob a nova instncia de Gu) P: Certo. Entdo por que nao nos livramos da linha “Guy bob;” ‘no topo do formulario? R: Porque se assim a varidvel existira somente dentro daquele rmétodo especific “public Form{()". Quando voo8 declara uma varidvel dentro de um método, ela € valida somente dentro dele no pode ser acessada de nenhum outro método. Mas quando ocd a declara fora de um método, mas dentro de uma classe ou formulario, ela pode ser acessada por qualquer mélodo dessa classe ou formuléro. ‘P: 0 que acontece se eu tirar a primeira linha com “Guy”? R: Vocé tera problemas - seu formulério nao funcionara, porque ele nem mesmo atrbuiré os valores iniciais para a variavel Dob do formulério, Pense a respeito um minuto e percebera porque isto funciona assim, Se voo8 tem o seguinte codigo no inicio de seu formuléro: public partial Guy bob; ‘enti aticionasse a seguinteinha mais tarde, dentro de um método: ass Forml : Form { Guy bob = new Guy (); ‘oo’ estaria deciarando duas varidveis. Isto ¢ confuso porque ‘as duas tem o mesmo nome. Mas uma delas é valida para 0 formuléro intro @ a outra - a segunda que voce adicionou -é valida apenas dentro do método. Apréxima nha (bob Name = “Bob';) atualiza somente a varidvel local e nem encosta na do formulét. Entao quando vooé tenta executar seu cbdigo, ele he mostraré uma mensagem de erro medonha ("NullReferenceException n&o tratade’, * NuilReferenceException not handled” em inglés, sendo que NulRReferenceException pode ser traduzido para “excecao de referéncia nua"), Este ero significa que vooé tentou usar um objeto antes de criélo com new. vocs esta aqui> 103 solugao do exercicio E de sua responsabilidade determinar como Joe e Bob devem ser inicializados a respeito de suas propriedades Cash e Name. Colomuc lugao do este cédigo diretamente abaixo de InitializeComponent (} Exercicio public Forml() InitializeComponent () 3 Ses ande inisalisemes a prineiva instincia de Guy, F primeira ling _/ b9b = new Guy (); erie 0 abjete € é prénina etritut eb aie Ob lessening bob.Cash = 100; Tonka certess de chamar Updatefarm® Joe = new Guy() rh aft faygnas » neanaican'e os rétulas estejam corretes na joe.Name = “Joe’ yenas Pee he reer, Senscaah = 30; | Meneame ect eo a farnilirk spureren \____ upaaterorm() ; , Combiique-se de stlvar 0 projet agora — voltaremos @ usa-lo dagvi 4 alvmas paginas, 104 Capitulo 2 objetos: orienten-se! Existe uma forma ainda mais facil de inicializar objetos Quase todos 0s obietos criados precisam ser inicializados de alguma forma. E 0 objeto Guy nao ¢ excecto - ele é inutil enquanto néo se atribuem valores para seus campos Name e Cash. £ tao comum ter que inicializar campos Iniclalizadores de objeto 96: que o C# oferece um atalho para isto, o inicializador de funcionam no C# 3.0. ‘objeto. E o IntelliSense do IDE lhe ajudara a fazer isso. A nave declaragio Se voeé estiver usando 0 Eis 0 c6digo original que escrevemos Veja bem! visu stato 2005, iss0.néo para inicializar 0 objeto Guy Joe. funcionaré. Considere baixar: joe : «a versio Express do Visual Studio 2008 - Frooties tig A 6 gratuita e pode ser instalada junto com joe tane = "Joo"; serena eaeeauin toate joe.cash = 50; Apague as tltimas duos linhas depois de “Guy()”. No lugar del © ponte e virgula bra chaves. joe = new Guy() { Pressione espaco. Assim que vocé o fizer, 0 IDE exibe uma janela do IntelliSense que Ihe mostra todos os campos que voce pode inicializar. ¢ nt Gay cash] # Name nar 0 campo Cash. Atribua valor 50 a ele. joe = new Guy() { Pressione a tecla tab para adi joe = sh = 50 ecriin joe = new Guy() { Cas Os inicializadores de objeto Digite uma virgula. Assim que fizer isso 0 outro campo aparecerd. poupam tempo joe = new Guy() { Cash = 50, e fazem seu (2 MEN RTS cédizo sax mais compaeto e S4cil Encerre 0 inicializador de objeto. Veja que vocé poupou duas de ler... e o IDE ajuda Vooé a joe = new Guy() { Cash = 50, Name = “Joe” escrevé-los. tT coetamerteanesne cept ae Hees linkas de chage erguawente crerefas,aas Gaatr arts cfc deer. vocé ests aquim 105 algumas dices ttels ‘Seria dtimo se eu pudesse- comparar algumas rotas & determinar qual é a mais Algumas idéias para projetar classes intuitivas rigid. ke Vocé esté criando seu programa para resolver um problema. Passe algum tempo pensando a respeito do problema. Ele divi se em partes distintas facilmente? Como vocé 0 explicaria para alguem? Estas sdo boas coisas para pensar-se quando se esta projetando classes. x Quais sd0 as coisas no mundo real que o seu programa usa? Um programa que ajude um zoolégico a manter registro de seus horérios de alimentagao de animais pode ter classes para diferentes tipos de alimentos e de animais. Use nomes descri para classes e métodos Outras pessoas deveriam ser capazes de determinar o que as classes e métodos que voc projeta fazem apenas olhando para seus nomes. ; obj Objeto objeto Navegedor He Procure similaridades entre classes Algumas vezes duas classes podem ser combinadas numa Gnica se forem realmente semelhantes. O sistema de fabricacao de doces pode ter trés ou quatro turbinas, mas apenas um Unico método para fechar a valvula de curso que usa um nunters————— de turbina como pardmetro. EstradoBloqueada Nome QuantoTempo NomeRua MotivoFechamento ‘QuantoTempo te MotivoFechamento EncontroRetorno () CaleulePrazo () EncontreRetorno() ColeulePrazo() 106 Capitulo 3 Este Sota dis a doe pare dar RB /D p dar-the 0 nome jocGivesTsBoh, ae Adicione botées no programa “Diverséo com Joe e Bob” para fazer Ex objetos: orientenr-se! ercicio 05 caras darem dinheiro um para o outro. Use um inicializador de objetos para inicializar a instancia de Guy Bob. Voe8 jé fez isto com Joe. Agora faa com que a insténcia de Bob use um inicializador de objetos também. Sevecdjh cies « bof, pade delePia,ediianile nevimente e renaned- 1a, ibaa delete 0 antiga metode buon 3_ClckO gue » Tk edicianav amberiarmentee use a nove mitade ye ele adiontrh agent, 9 Adicone mais dois botées em seu formulério vu O primeiro boto diz que Joe deve dor R$ 10 para Bob e o segundo diz que Bob deve dar 5 de volta pard Joe. Antes que vocé clique duas vezes no botéo, vé até a janela de propriedades e mude os nomes dos botoes usando a linha “(Name)” - ela fica no topo da lista. Nomeie o primeiro botéo como joeGivesToBo (Joe empresta pare Bob, literalmente “Joe dé para Bob") e o segundo como bobGivesToloe. eee DE RS 10 para | [ Receba RSS ~ ane Bob, Assim, voce deve usar a inka woe ‘8 Bob tsse botio dis « Bob —S == pare dar dinkeiro Joe da RS 10 | [Bop aa RSs Use, Je a ele 6 pare et. ara Gob ara Joe ee ctarvestaJoe ©) na janela de prapritdades pare Faca os botées funcionarem Clique duas vezes no botio joeGivesToBob no painel de design. © IDE adicionaré um métode ao formulario chamado joeGivesToBob_Click() que executa quando o botdo for clicado. Complete esse método para fazer Joe dar R$ 10 para Bob. Entéo clique duas vezes no outro botéo e complete o novo método bobGivesToJoe_Click() criado pelo IDE para que Bob dé R$ 5 para Joe. Certifique-se de que o formulario seja atualizado depois que o dinheiro trocar de maos. vocé esté aqui> 107 oe» Adicione botdes no progroma “Diversao com Joe e Bob" para fazer 05. caras darem dinheiro um ao outro. Lis os inicialigadores de objeto para as dues ponies paxphdd lus sea =: Boon instincias da clas se Gvy, Geb € inicialigade com © Guy joe; RA /OD € sev nome. 2 Guy bobs int. bank = 100: public Forml() { Initializecomponent (1: "bob = new Guy() { Cash = 100, Name = “Bob” }; & joe = new Guy() { Cash = 50, Name = “Joe” }; orsererore0y Para teger Joe dar dinterg, eee et 1 Bob, chamados 2 metodo fosgach tone Sb a geneoe caan) ZivelashO de Uae € mendames Sea er ser reihatenraes ReceiveCash0 de Bob, sratalvoid lnsceoal_clipk{ehiect dander, ! (bank >= 10) { bank -= joe.ReceiveCash (10) Déume boa ois oe os _— Updaterormt) métodes de buy esti. O trope ay | cise ( . sendo shamed, Os Epenser guen ——essagezox.show ("0 banco esta sem di vs Peat ce alereetet pat eats Wieaty SivelashO sie injetades stnigre yeem pevace void button? C11ck\ sender, EventArgs ©) | ginete come pardmetres de @ recebende, anos reCash (5)z RecerveCash, ‘ebymealicell Acsatrre tuned eetet (abi tt toda: EventArgs ©) ( A“ ‘bob. (Joe. GiveCash (10)) <= | UpdateForm() ; } Private void bobGivesToJoe_Click(object sender, EventArgs e) ( ‘Joe. ReceiveCash (bob. GiveCash (5)) Updaterorm() ; 4 Tipos e referéncias * Sao 10 horas. * Vocé sabe onde seus dados estado? * * O lixeire acabou de coletar estes dados. Tipos de dados, bases de dados, Tenente-Comandante Data... é tudo importante. Sem dados, seus programas sao initeis. Informagbes oriundas dos usuarios $40 necessérias e so usadas para procurar ou cra informagao nova para devolver a eles. Na verdade, quase tudo que voo8 faz er progremaco envole trabalho com dados de uma forma ou de outa. Neste capitulo, vocé aprendera as vantagens e desvantagens dos tipos de dads Ci, como trabalher com dados em seu programa e até descobrir alguns segredos sujos sobre objetos (shhhhh...cbjetos sso dados também). este é um novo capitulo 113 nao 6 0 meu tipo O tipo da variavel determina qual tipo de dado ela pode armazenar Hé quinze tipos de valores nativos do C# e cada um armazena um tipo diferente de dado. Vocé jé viu alguns dos mais comuns e jé sabe como usé-los. Mas hé alguns poucos para ver ainda © eles realmente podem ser dteis também. Tipos de valores que vocé usaré sempre j Néo deveria surpreender que int, string, bool e float sejam os tipos mais comuns. Um numero inteine nao rns lle lina, int pode armazenar qualquer némero inteiro de -2.147.483.648 o L 2.147.483.647. Z Hot é uma forme IK string pode conter texto de qualquer tamanho (incluindo a sequéncia de caracteres vazia ") ate I bool é um valor boleano ~ é verdadeiro ou falso. LC ponte tutvanted ~ a0 contrario de 3& float pode armazenar qualquer némero decimal de +-1,5x 10-45 até um numero de porto ao ahecriareiascens monk, numero: .410.000.000, 1.743.059, 14, 20, es todos possuem sete digitos significatives). © 1038 significa que vocé pode °” prety, ye armazenar qualquer ndmero téo grande quanto 1038 (ou 1 seguido de | 79°F" Teme MEFme 38 zeros) desde que ele tenha apenas sete ou menos digitos significativos. "Mere de casas Na outra extremidade, 10-45 significa que vocé pode armazenar qualquer 4ecinais, némero to pequeno quanto 10-45 (ou uma virgula decimal seguida por 45 zeros seguidos de 1)... mas vocé adivinhou: desde que tenha apenas sete ou menos digitos significativos. 0 'u" em vint significa unsigned (sem Sinal>, ov sgja, ele nko pode ser ntsatiy kentio nite ha sinal de menos), \ Mais tipos para nuimeros inteiros Era uma vez uma época em que a meméria dos computadores era muito cara e os processadores eram muito lentos. E, acredite ou néo, se vocé usasse 0 tipo errado, isso poderia deixar seu programa bem mais lento. Felizmente, os tempos mudaram e, na maioria das vezes, se vocé precisa armazenar um < numero inteiro vocé pode apenas usar um int. Mas, as vezes, vocé realmente precisa de algo maior. de vez em quando, algo menor também. E por isso que o C# dé mais opcoe ap} Murtas veges, se ved 3 byte pode armazenar qualquer numero inteiro entre 0 © 255. ee Prier tants exses tpes € pergue esta 3c sbyte pode armazenar qualquer némero inteiro de -127 até 128. cendiereiivona plies 3k short pode armazenar qualquer numero inteiro de -32.767 até 32.768. &m gre « eFeite valtar pare o comege— sobre om 3 ushort pode armazenar qualquer nimero inteiro de 0 até 65.535. 0 gual voce ler dagur a { povee — realmente ajuda, Signi see eriarl We int pode armazenar qualquer némero de 0 até 4.294.967.295. \ ‘yk Long pode armazenar qualquer numero entre menos e mais 9 bilhdes de bilhdes. 3k 8 1ong pode armazenar qualquer nimero entre 0 © mais ou menos 18 bilhées de bilhdes. 114 Capitulo 4 tipos @ referéncias Tipos para armazenar numeros realmente GRANDES e realmente pequenos As vez0s, sote digitos significativos néo 6 preciso o bastante. E acredite ou — rnéo, as vezes, 1038 ndo ¢ grande o suficiente © 10-45 nao é tao pequeno Va verdade, o tipe davble ¢ Hie quanto se necesita. Muitos programas escritos para finangos ou para comum santo o float. Muitas pesquisa cientifica apresentam estes problemas a todo o momento, entéo o pessoas vsam-ne toda hore € C# nos dé mais dois tipos: ge double pode armazenar qualquer nimero de +-5,0x10-324at <_/ +-1,7 x 10308 com 15-16 digitos significativos. WK decimal pode armazenar qualquer numero de +- 1,0 x 10-28 até +- 7,9 x 1028 com 28-29 digitos significativos. oF {_ Geenda vec soo sprepteute ie em sev comtrale numerieUpDown, extava vsande um decimal, Ym irteral significa apenas Um nimere que voce 4 em sev cédiga, Ente uande voce digit (7 Sse tea Literais tém tipos também. Quando vocé digita um numero diretamente em seu programa C#, vocé esté usando um literal... e «a todo literal é automaticamente associado um tipo. Vocé pode checar isso por si mesmo - apenas coloque essa linha de cédigo que associa o literal 14,7 a varidvel int: (© 1 ineossive! coneterimolctanent ope soul part. Uma sonverso of squid ra cepted) Agora tente compiler o programa. Vocé verd isso: 4 Esse € 0 mesmo erro que vocé encontrara se tentar fazer com que um numero inteiro seja contido numa varidvel double. © que o IDE esté informando que o literal 14,7 ten Um tipo ~ 6 um double. Vocé pode mudar seu fipe para um float colocando um F no final (14, 78). E14, 7M 6 um decimal. Se vece tember atoibuir um float literal aum double Mais alguns tipos de valores nativos uteis ou um decimal Vocé notou como 0 tipo byte possui 256 valores possiveis? Bem, hd outro tipo que também steal « um Float, possui 256 valores possiveis: char. Mas ele néo 6 numérico - vocé 0 usa para armazenar 4, TD gard a vock ‘um caracter. Valores literais para char so sempre valores individuais dentro de aspas ('x’, '3'), Voce pode incluir seqdéncias de escape nas aspos também ("\n' é uma quebra de__ “m mensasem ont linha, \t € uma tabulacao). [pr Menboendare de E finalmente, hé mais um tipo importante: object. Um objeto pode herdar caracteristicas | adicienar o sufixe de outro e isto pode ter acontecido com este ultimo, No topo de toda a hierarquia de correta, Legal! heranca esté a closse object - da qual todos os outros objetos sao herdados. Ela é muito Util porque significa que voeé pode atribuir a uma variavel do tipo object qualquer valor, variavel ou objero. Voce sprendera muite nats s0bre como char byte relacionencse der di ae , roars lo ne capitute 9, \Vocé pode usar a calculadora do Windows para converter ntimeros decimais (normals, base-10) e bindrios (nimeros de base-2 escritos apenas com uns e zeros) — coloque-a ‘em modo Cientifico, digite um nlimero ¢ clique no bot&o de radio Bin para converte- Jo em binarro. Clique entdo em Dec para converté-lo de volta. Agora coloque alguns ‘dos maiores e menores limites para os tipos de nimero inteiro (como -32.767 e 255) e converta-os para binario. Vocé consegue descobrir por que 0 C# tem esses limites particulares? voce esté aquir 115 vou levar um sorvete de float-olate para a viagem Uma variavel é um copo cheio de dados para a viagem Todos os seus dados ocupam lugar na meméria (lembra-se da pilha do Gltimo capitulo?). Entéo parte do seu trabalho é pensar sobre quanto espaco vocé precisaré sempre que usar uma seqiéncia de coracteres ou um némero em seu programa. Esso é uma das razées pelas quais varidveis s6o usadas. Elas permitem reservar espaco suficiente na meméria para armazenar seus dados. Pense numa varidvel como um copo no qual vocé guarda seus dados. © C# usa um monte de tipos diferentes de copos para guardar tipos diferentes de dados. E assim como os diferentes tamanhos de copos na lanchonete, ha diferentes tamanhos de varidveis também. wt camumente usede pare nine ras verde numeres & Voc sari» lng pare Re serge ily agentes guerdar nimeros inteires bem 123 oe Aqui vemos 0 cédigo para o primeira parte do exercicio. Solugao do ercicio te int funeiana mvite bem pare anumeres inteires. mnie paxtiial chads Vous 1 260 Este nimere paderia i abt 999.999. inti um ‘ int startingMileages short AU UM byte ma serviriam, int endingMileage; double milesTraveled; double reinbureeRate = double anountowed; Voce lembra-se de ter Hide sve public Form () ( Tnieializeconponent 07 muder 0 velor ecima’ de combrete } numeriUpDown pera um snr? private void button! Click(sbject sender, EventArgs startinglileage = [int) numericUpbownt-Value; \>— endingMileage = (int)nunericupDown2.Value: ae Naccae aniamer enter Ente a Late boca deve descabvir por mlestraveied = eadingticage ~~ startinavtease; guemtas gufometes vacd eee gerretiag i yremmeretater | Vege enfants } else { pele taxa de ceembelse, MessageBox. Shox ( “a milha Iniciar necessita ser menor do que a milha final”, *Wio consiga calcular a milnagem”); i TX, Usamos uma forma alternative de chamar a metade MessaseBoxShow0 agui.Demos a ele dats partmetros: o primeira @ 4 ieksajene ithe € 2 segundo vai ma barra de ttv%a, Este botdo parece estar funcionando, mas ele tem um grande problema. Vocé consegue identifica-lo? Agora adicione outro botdo ao formulario. Faca com que o numero de quilometros viajados seja exibido no formulario apés voce ter calculado o montante devido. ee Chear neste butt, pds evar em eaevlete Cealvler, deve mestrar a nimere de ildnetres vigjedes numa caina de mensagtm, Quando voce tiver terminado o Formulario, clique duas vezes no botée Mostrar Quilometragem para adicionar um pouco de cédigo ao projeto. @ _ Urs linha ja deve ser o suficiente. Tudo que precisamos é fazer com que o formulério mostre a variével milesTraveled, certo? Entao essa linha deve fazer isso: private void button2_Click(object sender, Eventi Messagehox.Show (milesTraveled + " milhas”, “Milha ) gs @) Viajadac”); @ Execute. Digite alguns valores e veja o que acontece. @ Hum, algo nao esta certo... O numero de milhas é sempre igual ao débito. Por qué? 124 Capitulo 4 operadores estéo aguardando tipos e referéncias Combinando = com um operador Dé uma boo olhada no operador que usamos para subtrair a quilometragem final da inicial ( problema é que ele nao subtrai apenas, ele também atribui um valor a variavel no lado esquerdo do sinal de subtragéo. A mesma coisa acontece na linha onde multiplicamos nomero de quilémetros percorrides pela taxa de reembolso. Devemos substituir 0 -= © 0 *= por apenas ~ private void button1_Click(object sender, EventArgs e . 7 Setes she chamades apertderes startinglileage = (int) numericUpDownl .Value: conpostes. ste subtrar endinoMileage = (int)numerictippown?.Vaiue; | ___~~"_shardhinghileage de endinghileage, if (startingMileage <= endingMilgagey{ © wns Fumb ined rintnaee velar endingMileage C5) startingtileage: gGneOvad = A(LasTEArslaa(eS) Pataburesiace:, | teMlgltieigee anerlaveed as . , mesmo tempo, label4.Text = “§” + amountOwed; } else { MessageBox. Show ("A que a mil NB consige calcular a mlhageh"); Assiné melhor = agere seu codigo nite modificart endingbileage ¢ miles Traveled, milesTraveled = endingMileage - startingMileage; amountOwed = milesTraveled * reimburseRate; Entao bons nomes de variaveis podem ajudaé-lo? Com certeza! Dé uma olhada mais cuidadosa no que cada varidvel deve fazer. Vocé jd tom muitas pistas no nome mi lesTraveled - vocé sabe que 0 formulario exibe esta variavel incorretamente e como este valor tem que ser calculado. Entéo voce pode firor vantagem disso quando estiver observando seu cédigo para tentar identificar a falha. Em vez disto, seria muito mais dificil achar o problema se as linhas incorretas se parecem com isso: mI = pod Vanitveis nameadas assim sito invteis para informa-lo 20 © sobre sueis deveriam ser seus propasites, Objetos sao variaveis também Até agora, observamos objetos como se fossem separades de outros tipos. Mas um objeto ¢ apenas outro tipo de dados. Seu cédigo trata objetos exatamente como trata numeros, sequéncias de caracteres @ bolecnos. Ele usa varidveis para trabalhar com eles: Us int Usando um objeto ©) Escreva um comando para declarar 0 inteiro, @ Es 125 pegue a referéncia Entéo ndo importa se estou trabalhando com um objeto ou um valor. Se estiver indo para a meméria e ‘meu programa precisar usé-lo, utlizo uma variével Objetos s&o apenas mais um tipo de variavel que seu programa pode usar. Se seu programa precisa trabalhar com um numero inteiro muito grande, use um long. Se ele precisa de um numero inteiro pequeno, use um short. Se precisar de um valor wo verdadeire/falso, use um booleano. E se ele precisa de algo oT gue late © sente, use um Dog (cdo). Nao importa qual o tipo i\¥ , de dados com 0 qual seu programa precisa trabalhar, ele usaré uma variével. Refira-se aos seus objetos com varidveis de referéneia Quando vocé cria um novo objeto, usa cédigo como new Guy. Mas isso néo ritpedin sis 6 o suficiente; embora esse cédigo crie um novo objeto Guy na pilha, ele nao asec Cannan, Ihe dé uma forma de acessar 0 objeto. Vocé precisa de uma referéncia ao instanciar a ahete, objeto. Entéo voce cria uma variével de referéncia: uma variével de tipo Guy ‘com um nome, como Joe. Entéo Joe é uma referéncia co novo objeto Guy. <- Sempre que vocé quiser usar este cara especifico, pode fazer referéncia ele ‘com a variével chamada Joe. Entéo quando vocé fiver uma varidvel que seja um tipo de objeto, ela sera uma varidvel de referéncia: uma referéncia a um objeto especifico. Dé uma olhade: Loa yp tae a plate a eb che vader, Mesitdoanie public partial class Forml : Form { Este varitvel chame: Guy Joe audi eae hk patente Aa public Form () Coian uma neferencia ¢ cama fager ume se aum objeto de { et igueta com uma eiguetedera- em vex Ha buy InitializeComponent () 7 de sruder uma nas sues caises, vect esti Sica Guy () ; usandera part nemear um objet, pedende ) wa referir-se a tle mats Harde, Leta Lavartve de tte Co abiets ae ye! ania 6 agora se refere. vert Fat eneeutade, Agus vemes um abjeto, seneste ofjete guy éatravés Pilea depots que 0 cediga > =) ES A WICH forma ate referir com a varievel Ue referinde-se « el. io ast da variivel de referencia Ube. 126 Capitulo4 tipos e referéncias Referéneias sdo como etiquetas para seu objeto Em sua cozinha, provavelmente, voce tem um pote de sal e de acucar. Se voce trocasse seus nomes, faria uma refeicdo bem desagradavel — embora os nomes tenham mudado, os contetdos dos potes continuariam os mesmos. Referéncias —_funcionar com um objeto so como nomes. Vocé pode mudar os nomes de posicéo, aponté-los para coisas diferentes, mas € 0 objeto que dita quais métodos e dados estao disponiveis, ndo Quando seu eédige precisa na mem/éria, ele usa uma 1 referéncia propriamente dita. , tonalidade, que é uma O metodo sutten/ Click de Form/ Vasiivel cujo tipo é uma Sate abete {de tye buy. pessut uma veriivel ena ee clasye de objeto para © £ um objets INZCO com Be tagetere raatjers: gual ele se ditecionard. IAULTIPLAS refersncis. Uma referéncia é come um nome que seu cédigo usa ere B = pata falar sobre um objeto especie, \S mains tancia de classe uy neirtim uma resere, esse objeto numa veriavel chamade “Papa, es} — Coda um destes nomes € uma varitvel de referencia, mas todas elas ieee apomtam para o MESHAD objeto Guy, R Vocé nunca se refere co seu objeto diretamente. Por exemplo, vocé néo pode escrever Hi mutes referencias codigo como Guy. GiveCash () se Guy for seu tipo de objeto. O compilador C# nao sabe aiferentes ao mesmo ‘a qual Guy estd se referindo, j que vocé pode ter muitas instancias de Guy na pilha. buy persue muites Entéo vocé precisa de uma varidvel de referéncia, como joe, que vocé atribui o uma nttodes usemene pare insténcia especifica, como Guy joe = new Guy()., calsas diferentes. ue Agora eck pede ciemarrastedos/ erallos eGmareeh(). Be relecmematimna insienda COON me especifiea da classe Guy, e seu compilador C# saberd exatamente qual instancia usar. "ome diferente pve E, como vocé viu acima, vocé pode ter varios nomes apontando para a mesma 403 sertide em sev insténcia. Entéo vocé poderia dizer Guy dad = joe e chamar daa.GiveCash() (papai contexte, dé dinheiro). Isso também funciona — ¢ isso que os filhos de Joe fazem todos os dias Se nao ha mais nenhuma referéncia, seu objeto é coletado como lixo Fara um objeto Se todos os nomes forem retirados de um objeto, mais nenhum programa pode acess6-I0. oy yinuay na Isso quer dizer que o C# marca o objeto para coleta de lixo. Isso acontece quendo o C# se livra de objetos sem referéncia e retoma a meméria que os objets usavam para que seu _pilha. ele tem que programa a oproveite. tet pele menos uma referéncia. © Eis aqui algum cédigo que cria um objeto. Quande a iiltima Gay joe = new Guy() sonia referéneia go objeto Name ~ “Joe”, Cash = 50 1; i gt desaparece, o objeto Ar princes the ten one decaragto ost seme também. sue criou oa etigvete, A segunda inka criou 0 abjete ¢colov a ebgvete nel, voeé esté aqui> 127 © Avera vamos criar um segundo objeto. y “Guy ( Name = “Bob”, Cash = 2515 Agora tenes dues instincias de objeto buy e duas verges de referee pare cade Gaye © _ Vamos pegar a referéncia ao prim ‘ponte para o segundo objeto. joe = bob; 1¢ esta apentande paras yjeto ue bob. Cruzadinha de Tipo Dé um tempo, sente-se © dé algo para o lado direito de seu cérebro fazer. E a sua cruzadinha padrao. Todas as respostas séo palavras deste capitulo. Quando terminar, vire a pagina e continue com o restante do capitulo, Horizontais 4. Voo8 pode combinar a declaragio de vardvel e @ ‘num tnico comando 4. Quando um objeto jé ndo tem nenhuma referéncia apontando pra le, 6 removido da pilha com o uso da coleta de 8, Uma declaragdo de varvel sempre comega com isso 410, O tipo que guarda os maiores nimeros. ‘1. 0 fipo que guarda uma tnica letra ou némero 12, Se voo8 nunce estabelecer isso para uma variavel. seu programa nunca compilaré 413, Uma vatidvel que aponta para um objeto 14, O que (in) faz nesta linha de cbdigo: x= int) y oe Sas wy. objeto e mudé-la para que ela t Sorte nde eniste mais Uma refertncie aa primeine objeto buy es adage 0 Cif marca a bj TK. para coleta de nae aes fora, Je eral Verticais 2. Asegunda parte de uma declaracéo de variavel 3. Os nomes de variaveis como myBigNumber e bobTheDog usam esse estio de maidsculas e minusculas 5. O que seu programa usa para trabalhar com dados na meméria 6. O que vocé faz quando usa 0 operador + para ligar duas coisas. 7. ‘namespace’, for. while’, using” e new’ so exemplos de palavras 9. Todo objeto possui esse método que o converte em uma seqiéncia ce caracteres 15. Os quaito tipos de nimeros inteiros que armazenam apenas . ndmeres postivos ———-> Respostas na pagina 146. 128 Capitulo 4 tantas otiquetas tipos e referéncias Miltiplas referéneias e seus efeitos colaterais Vocé tem que ser cvidadoso quando comecar a deslocar as varidveis de referéncia. Muitas vezes, pode parecer que vocé esta apenas apontando uma variavel para um objeto diferente. Mas vocé pode acabar removendo todas as referéncias para outro objeto no processo. Isso ndo ¢ ruim, mos pode néo ser 0 que vocé planejou. Dé uma olhada: @ 29 rover = new dogt); rover.Breed = “Greyhound”; _-# es ae Objetos: / Rover € um otjete Des com um campo Referéncias: / Breed (rasa) chamade Greyhound, @ 225 fide = new Dog)? fido.Breed = “Beagle”; Dog spot = rover; Fide é autre objeto Dos, Mas Objetos: 2 Spot é apenas outra referencia Referéncias: 3 20 primeira objeto, @ es lucky = new Dost) lucky.Breed = “Dachshund”; fido = rover; Lucky um terceirs abjete, Mes Fide este Objetos: 2 agora apomrtanda pare 0 objeto /, Lntite o objet : Referéncias: f 2 fice sem referencias. ao existe mais pela menes em rele ta programe. ‘Agora é a sua vez. Aqui vemos um grande bloco de cédigo. Descubra em hrente geu lapis quantos objetos e referéncias existem em cada estagio. No lado direito, desenhe uma figura dos objetos e nomes na pilha. @ es lucky new Dog): lucky.Breed = “Beagle”? eg te bes seg. aienie & inaey rover.Breed = “Greyhound”; ae Sones bog rinTinTin = new Dog (1 Dog fido = new Dog (}+ Objetos: Dog quentin = Fido; Referéncias: © setinnin = quckys Dog laverne = new Dog): laverne.Breed = “pug”; Objetos: @ es spot = now D0900; Referéncias: Spee eeeees eee @ ctartie = taverne: aE Ed lucky = rinTinTin; Objetos: Objetos: Referéncia: Referéncias: vocé esté aqui> 129 4 Agora é a sua vez. Aqui vernos um grande bloco de codigo. Aponte seu lapis Descubra quantos objetos e referencias existem em cada estagio. 3 Solugao No lado direito, desenhe uma figura des objetos e nomes na pilha. eos Ym nove abjete Dos for criade, mas Spot € a Unica referencia a ele, Gvande Spot <— hyualade 4 Rover, e350 objet € eliminade, al: Dog fido bog quentin Objetos: — Ayer um nave objets Das é code, nas yvinda Fide é Igualade a Raver, a prineirg abjets apertade por Fide ¢ elninade, : Noelia, Chante fo gvatade a Fite oe = tides | grande cle ainda estava sido = rover; sporbude pare atiete 3. NL tatio, depois disse, Fido Objetos: = averse pare oofte/, deinanda Cherie pare tes, Das 2. perdeu sve Uttima referéncia e Foi eliminedo, Qvande Lucky moveu-se pare 0 objeto do Kin th Tr, 0 antigo i no antig ebjers Lucky deseparecev. @ charlie = laverne; lucky = rin?intins Ayer es ceferincias mavem-se por Fade a parte, mas nenkim objets nove € eriade, £ iguelar Lovckg a Rin Ty Tr nto fey, nada porgue eles ja apontevam pare s mesma objeto, Objetos: x Referéncia 130 Capitulo 4 elefante pisando no mou pé tipos @ referencias Crie um programa com uma classe elefante. Faca duas instancias de elefante € obrigue-as a trocarem suas propriedades, sem fazer nenhume insténcia ercicio Elephant ser jogada fora. @ _Comece com um nove projete de aplicative Windows. Aypi cota e diagrame de Faga 0 formuldrio parecer-se com isso: classe pare a classe Elephant Chicar no betta Lucinda chama — ue precisa cian, Wucinda WhofimLO, gue exibe essa NL caine de mensagem, Elephant ae ere Minhas orethas medem 80 centimetros. Cee] J eC) Lassa te dé uma ita sobre o sue WhofmLOdeve retornar: uma Unica segiiencia de caracteres comessa mensigen, @ Crie c classe Elephant. Adicione uma classe Elephant ao projeto. Dé uma olhada no diagrama de classe Elephant ~ vocé vai precisar de um campo int chamado EarSize (tamanho da orelha) e uma String chamada Name (certifique- se de que ambas sejam publicas). Entéo adicione um método chamado WhoAm() (quem sou eu). Ele ‘exibiré uma caixa de mensagem com informag6es sobre o nome e 0 tamanho da orelha do elefante. duos instancias de elefante e uma referéncia. ne dois campos Elephant na classe Form’ (na drea logo abaixo da declaracéo de classe) chamados Lloyd e Lucinda. Inicialize-os de forma que eles tenham o nome e o tamanho de orelha corretos. Aqui esto 0s inicializadores do objeto Elephant para adicionar ao sev formulério: lucinda = new Elephant () { Name = “Lucinda”, Ears. lloyd = new Elephant () { Name = “Lloyd”, EarSize ° Faca os botées “Lloyd” e “Lucinda” funcionarem. Faca o botéo Lloyd chamar lloyd. WhoAml() e 0 Lucinda chamar lucinda,WhoAmI(). Faga funcionar o botao swap (troca). Essa € a parte dificil. Faca 0 botdo Swap trocar as duas referencias, para que quando vocé clicar nele, as varidveis Lloyd e Lucinda froquem objetos e uma caixa “Objects swapped” (Objetos trocados) seja exibida. Teste seu programa clicando no botde Swap e, em seguida, nos outros dois botdes. A primeira vez que vocé clicar nele, 0 botao Lloyd deve langar a caixa de mensagens de Lucinda e 0 botao Lucinda, o inverso. Se vocé clicar no botde Swap novamente, tudo deve voltar ao normal. A coleta de lixo do C#f é feita com qualquer objeto sem referéncias. Entao aqui vai uma dica: se vocé quiser passar cerveja de um copo para outro com gua, vocé precisara de um terceiro para colocar a agua... voce esté aquir 131 rie um programa com uma classe elefante. Faca duas instancias de elefante e obrigue-as a trocar propriedades sem fazer nenhuma instancia Elephant ser jogada fora. Soluedo do Exercicio =——_~ iste cédige define a using system.windows.Forms; cles se Elephant no class Elephant ( arguive peoterie ye public int Earsizes Adicianamas te prejete, public String Names Nite se esguege da linha Public void Whoamt() cone Mscagenox-shov "Minhas, oteliag maemes e eeeiews using System, Windews, stenting east Farms! ne tape da classe, Mane} * diz"); Sem cle, 0 comendo , HessageBon nie funcionara, public partial class Formt Elephant lucinda; Elephant lloyd; public Form! () Form { Aypiestio " cools aco InicialSzeconponent (): ey lucinda = new Elephant () ge tp { Name = “Lucinda”, EarSize - 33 }; Form/cs. \__= Lloyd = new Elephant () { Mane © "Lloyd", Earsize = 40} private void buttont_Click{ebject Eventarge e} { Love. hon ()7 Se vect apenas dineciona Lloyd , private void button Click(object sender, EventArgs el ( pare Lucinda, nite havera is Jucinda.WhoBnd (7 ‘mais nenhume referencia , direcionande para Llayd €,50U private void butron3 (object sender, EventAras e) { 7 Elephant hole! le objets seri descertide. por pices: © ova: Nie existe uma nova de- dss0 gue vecd precisa marter'e [~"Vivovi = iucindar © elarasa para a neferdnct referencia, ibid sesrocrente lucinda = holders range nds nla rerenes a ahets 2 jescageSox.Show (“Objects swapped”); nite Una nave ins tane age Ligtewe buena | Cea posse chegar att ela, PODER DO CEREBRO Por que vooé acha que nao acrescentamos um método Swap() a classe Elephant? 132 Capitulo 4 guarde essa roferéncia tipos e referéncias Duas referéneias significam DUAS formas de mudar um dado do objeto Além de perder todas as referés ‘a um objeto, quando vocé possui multiplas referéncias, vocé pode alteré-lo acidentalmente. Em outras polavras, uma referéncia a um objeto pode alterd-lo, * enquanto outa referéncia aquele objeto nem imagina que algo mudou. Observe: 7 rae Faga tsso @ Acrescente outro botao em seu formulario. is] * ave 8 Adicione esse codigo no botao. Vocé consegue adivinhar o que aconteceré quando clicar nele? Depots de exeeugio deste codige, 05 varitveis Naya & private void buttond Click (object sender, EventArgs e) Este cenendedig as ee papatgonar bar Sige, Wovd = tucindas = 32/ em sees? iene Vecb esti chamande ometede ——‘(Weinda referemnse objeto para o gual WhafinLO do objeto layd. 40 MESIAO objets a referenei | Elephant. L wy Mas Mogd aporrta para oo mesma coisa gue lecinds tLOYD LUCINDA @ OK, va om frente e clique no novo botdo. Espere um pouco, essa é a caixa de ee mensagem da Lucinda. Nés ndo chamamos 0 método WhoAmI\) de Lloyd? mee Mas nis estabelecemas 0 Lar Sise usando a referencia togAl © gre acortece? & a caine de mensegem de Winds, Note ue as dades NAO esis sendo sobreseritas - as Unicas casas mudando ayy sia as referencias. May € ueinda azore sis brbercambitvers, Kudangas enum atetam a abjets pare o gual ALABOS spartam...nia hi mais Uma diferenga real entre loyd KK, ewueinda, pois eles spate pare a MESO objeto, J Veto Ei Vac paderia combinan a declaragie da vaniivel ngbroas cam svt inieaigtgia = assim coma Um caso especial: matrizes Se voce tem que manter registro de muitos dados do mesmo tipo, como uma lista de ‘alturas ov um grupo de cachorros, vocé pode fazé-lo usando uma matriz (array). O que a torna especial é que ela é um grupo de variéveis tratado como um objeto. Uma com sualguer variivel, matriz é uma forma de armazenar e modificar mais de um objeto de dados semter india isso ficaria assim: ve controlar cada voridvelindvidualmente. Quando voc® cria uma mattis, voe8 & _4aa//| my Anny ® ev declara assim como qualquer outra varidvel, com um nome e um tipo: yet é heal /S J Voc declare uma matris especificanda —=Booll] myArray’ seu tipo, segvide pelos colchetes, Se pt eee iste matris possut /S” elementos dentro dele, Vocd usa a palavra-chave new pare eriar ume metris porgye ela € um ebjeto, Ente uma variavel de mat ris Cum tipo de variavel de referencia. free linha estabelece » valor do guirts elemento de mgPrvay came verdadeire,’ 0 vinta pangue a primeire & myPieray[D), 2 segundo € et [A] ee. vocé esté aqui> 133, Use cada elemento numa matriz como se fosse uma variével normal Ma memsria, a man's armasentda cama una irea combve, mesina grt existam diversas varieveis, digemos do tipa int, dents dele, ———w 7 intl] heignts; ie | Aqui vemos um exemplo de cédigo que declara e preenche uma matriz =e o que esta acontecendo na pilha quando voce faz isso. O primeiro ‘elemento na array possui um indice de zero. O tipo de cade heights = new int{7] clemerbs naanray, _ Paigheal0) = 68: nesghts [2] Vect refere-seaestes |heights[3] per indice, mas cade um peisres ts] funciona essencialmente \neignts [6] come uma variavel inte 2; 4: normal, Pn f z Note gue a metris Cum objeto, enbore os sefe elementos sejem apenes Hpes de valor - como agueles nas primeiras dues paginas deste ceprtvio, Matrizes podem conter um monte de variaveis de referéncia também Quande voce apibui ou Vocé pode criar uma matriz de referéncias a objetos exatamente como recupera um elemento de uma voce criou uma de némeros ov seqUéncias de caracteres. Matrizes nao se matriz, 0 niimeto dentso dos importam com o tipo de variavel que armazenam - isto cabe a vocé. Vocé . - pode ter uma matriz de ints, ou uma de objetos Duck (pato), sem problemas. _lchetes & chamade indice. O Aqui vemos 0 codigo que cria uma matriz de sete variaveis Dog. A linha que primeite elemento na matriz inicializa a matriz apenas cria varidveis de referéncia. J6 que ha sé duas peri coe inhas new Dog(), apenas duas instancias reais da classe Dog séo criadas. & Dogi] dogs = new Dogi71;_ tte inka declare vma variavel dogs pare dogs [5] = new Dog(); varder uma matris de referencias « objetes Clasgeto} = See bog: Daye chs Da Daca A oePe dened. de zero. Essas dues linhas criem novas A primeira linha do codise ap@ instencias de Dog0 ¢ colecam-nes criov a matris, nia as insPencies, 5 nas posigies de indice De S. A materi é uma liste de sete wry variaveis de referencia tipo Dog. oo Objeto Dog Metric (a Todos 05 elementos na metnis sia referencias, La mesma é um abjete, Jodo podrio diz: “nao ¢ velho, é um classic” tipos e referéncias Bem-vindo a lanchonete de sanduiches com desconto do Joao Podrao! Jodo Podréo possui uma pilha de carne, um montao de pao e mais temperos do que vocé imagina. Mas © que ele nao tem é um menu! Vocé consegue fazer um programa que crie um novo menv aleatério para ele todos os dias? * * anuiaker i ee See || aor ae Condiments Breads @ __Gomece um novo projeto e adicione uma classe MenuMaker Se vocé precisa criar um menu, precisa de ingredientes. Matrizes so perfeitas para estas listas. Também vamos precisar escolher ingredientes aleatérios para juntar em um sanduiche. Felizmente, o Framework .NET possui uma classe embutida chamada Random (aleatéria) que gera numeros aleatérios. Entéo teremos quatro campos em nossa classe: um campo Randomizer (desordemador), que armazena uma referéncia a um objeto Random, e trés matrizes de strings, que armazenam carnes, tempero e pac! GetMenuttem() 0 campo Randomiser svarde ume A classe possur referencia eum objeto Random, ; Chamar sev metodo NextO0gera tr€s campos paceeroeseeen’ “sginlisia etiam Matis A niweres sleatiries, tres matrices |, public Kardon Randomizer; dherentes de etring!] Meats = ( "Resbife”, “Salami”, ‘Peru’, "Presunto”, “Pastrami” I; string!] Condiments = ( *nostarda anarela’, ‘mostarda marron”, spores as, “mostarda com mel”, “naionese”, “gosto”, “nolhe francés” }; ring, Le ira string{] Breads = { “centeio”, “branco”, “trigo”, “pumpernickel”, ustles pare “pio italiano”, “Arabe” J: ceria os itens } Tc Slane Lembre-se de usar colchetes pare acessar um meas membre de uma metris, O valor de Breads[Z] E wheat trigad. © Acrescente um métode GetMenultem() para gerar um sanduiche aleatério O propésito da closse é gerar sanduiches, entéio adicionaremos um método para fazer exatamente isto. Ele usaré 0 método Next) do objeto Random para escolher uma carne, condimento e pao de cada matriz aleatoriamente. Quando vocé passar um pardmetro int ae Nexi(), 0 método retorna um némero aleatério menor do que este parametro. Entéo se seu ‘objeto Random chama-se Randomizer, chamar Randomizer.Next(7) retornar um numero aleatorio entre Oe 6. Como saber qual parémetro passar ao método Next()? Bem, isso é facil - apenas passe o Length de cada matriz. Isso retornara 0 indice de um item aleatério nela. public string GetMenurtem() ( O metodo string randomMeat = Meats[Randomizer.Next (Meats. Length) }; BefhleniLten rat sade iemaere feng oneds eeageall eee eterna vena segiencit saturn randonlleat +“ com ” + randonCondiment +” no ” + randomBread: de caracteres com um gente erst sam il K elementos aleatori 0 métade coloce um item sletris da metris Meats Cearnes) em randonMheet passande Kheets.Length to mnétade Next© do abjete Random, Ua sue ba cince tens na matris Meets, Herts: Length é Ss mp pes > cetarnach um nimere skeatirta entre D eY, des tres matrises, vocé esta aqui> 135, Come isse funciona... Eu faco todas as minhas refeicées no Jodo Podrao! O métede randomiser.NexH7> sera um nimere elect aria menor sve sete, Meats.Length retarna a nimere de elementos em Meats. inbite randomiser Next Meets Lengt> resuite num numero aleatinia maior ov igual a 3070, mes menor do gue a nomena de elementos ne matris Meets, postmen nme sok Meats [Randomizer .Next (Meats. Length) ] Meats é uma matris de segiéncias de cerecteres. bie tem cinco elementos, de O° Par exemple, Meats[O] é igual « Rosbitee Meet s[ 3) goat « Presunto, ° Crie seu formulario Adicione seis rétulos ao formulario, label até labelé. Entao adicione cédigo pora atribuir valor para cada propriedade Text deles usando um objeto MenuMaker. Voc8 precisard inicializar 0 objeto usando uma nova instancia da classe Random. Aqui esta o codigo: igadan de objers para public Formi() { atritvir 0 campo Randomizer do objeto InitializeComponent (17 MenviAaker a uma neve instancia da classe Rendom. MenuMaker menu = new MenuMaker() { Randomizer = new Random() }; label. nenu.GetMenurten() ; 1ebei2 menu GetMenuTten() : 1abel3. nenu.Getenurten() ; esti, dabela text = ment cettenurten) Peres pects ee eet sgerer seis sanduiches diferentes Label6. menu.GetMenurten() ; ealeaterios sande ometede , GettenvTten0, Qvande voct execu tar o program, 5 seis memes —, mostram seis sendviches diferentes aleatarios, 136 Capitulo 4 ‘seu objeto 6 uma bonequinha tagarela tipos e referéncias Objetos usam referéncias para falar uns com os outros ‘Até aqui, vocé viu formuldrios comunicarem-se com objetos usando variéveis de referéncia para chamar seus métodos e checar seus campos. Objetos também podem chamar outros cada um de seus ‘outros métodos usando referéncias. Na verdade, ndo hé nada que um formulario possa fazer que seus objetos ndo possam, porque seu formulario € apenas outro objeto. E quando objetos se comunicam entre si, uma palavra-chave otil que possuem ¢ this (isso). Sempre que um objeto usa a palavra-chave this, ele refere-se a ele mesmo ~ 6 uma referéncia que aponta para o objeto que chama. @ _Axvi vemos um método para mandar um elefante foler Vamos adicionar um método a classe Elephant. Seu primeiro método é uma mensagem de um elefante. Seu segundo é o nome do elefante que disse: Public void TeliMe(string message, Elephant whosaidtt) ( MessageBox. Show (whoSaidit.Name + “ diz: ” + message); Aqui esta como ele fica quando é chamado: Elephant lloyd = new Elepnant() ( Name Elephant lucinda = new Elephant () { Name Lloyd. Tellme (*0i", lucinda); oyd", Earsize = 40 14 Lucinda”, EarSize = 33 J; Nés chamamos 0 método Lloyd deTellMe() e passamos dois parametros: "Oi” e uma referéncia para o objeto Lucinda. O método usa seu pardmetro whoSaidit (quem disse) para acessar 0 parametro Name de qualquer elefante que tenha sido informado usando o segundo parametro do métode. @ Aqui vemos um métode que chama outro método Agora vamos adicionar um método SpeakTo\) (falar com) na classe Elephant. Ele usa uma polavra- chave especial: this. Essa 6 uma referéncia que permite a um objeto falar dele mesmo. public void SpeakTo(Elephant talkto, string message) { talkTo.TellMe (message, this): q Lote métode na classe Elephant: chama um mitede TRUTAO de vtre instincia da mesma classe, Sle permite lucinda.Speakto(1ioya, “018"); sve um elephant se comunie com vt, Vamos ver melhor como isso funciona. Quando © método SpeatTo() de Lucinda é chamado, ele usa seu parametro de referéncia talkTo pora chamar 0 método TellMe() de Lloyd. talkTo.TellMe (message, this); this é substituido por uma referéncia ao objeto de Lucinda Lucinda usa talkTo (que tem uma referéncia a Lloyd) para chamar TellMe() réncia a Lucinda]); Lioyd.TellMe (message, [uma r Entao Lloyd age como se tivesse sido chamado com (“Oi", lucinda) & mostra essa mensagem: voce esté aqui> 137 Onde nenhum objeto jamais esteve HG outra palavra-chave importante que usaremos com objetos. Quando voce cria uma nova referéncia e néo ¢ atribui « nada, ela tem um valor. Ela comeca igualada a null (nulo), 0 que quer dizer que ndo esté apontando para nada. Dog fido; Dog lucky = new Dog(); fido = new Dog(); ¢ AC Beene guatins ek «ni ie esti mais spantande'e seu objeto, Lege, ele € eliminade pela coleta de i lucky = null; ‘P: Pergunto de novo ~ meu formulério 6 ‘um objeto? R: Sim! E por isso que seu cédigo comega com uma declarago de classe. Abra o cédigo ara umn formal e veja vocé mesmo. Depois, abra Program.cs em qualquer programa que voos tenha escrito até agora e che o método iniaizeComponent( dentro dele - vocé encontrara ‘new Formt() ‘P: Por que eu usaria null? RR: Ha algumas formas tipicas de usar null em programas, A mais comum étestando: Esse teste retomard true se a referencia loyd fornia. if (lloyd == null) { Outra forma de vera palavra-chave null ssendo usada & quando voce quer que seu objeto sejaeliminado pela coleta de lixo. Se yoo’ possui uma referéncia a um objeto € terminou de uséo, qualar a referéncia a null imediatamente iré marcé+4o como lxo (@ n8o ser que existe outa referéncia a ele em algum outro lugar) TP: Vocs fica falando sobre coleta de lixo, mas 0 que 6 isso? R: Lembra como falamos sobre o Runtime {de Linguagem Comum (ou CLR) no comego do primeiro capitulo? Esta & a méquina virtual que executa todos os programas NET. Uma maquina virtual é uma forma de ‘solar programas em execugo do restante do sistema operacional. Uma coisa que ela faz 6 138 Capitulo 4 abjete, Pr nefertei fide 6 igvalede e nv Agora ue fide esti spontande para um objeto, ela sito € mais igual a nuit, nae existe Perguntas Idictas ‘administrar a meméria que usa. Ou seja, ela ‘mantém registro de todos os seus objetos, descobre quando a titima referéncia ao objeto desaparecee libera a meméria que estava usando. ‘P: Eu ainda nao sei se entendi direito como as referéncias funciona. RR: Referéncias sao a forma de voo8 user ‘todos os métodos e campos num objeto. Se ‘yooé criar uma referéncia ao objeto Dog, pode usé-la para acessar qualquer método ‘crlado no objeto Dog. Se vocé tem um método (ndo-estatico) chamado Dog.Bark() (latir) ou Dog.Beg() (implorar), vocé pode criar uma referéncia chamada spot. Entdo vooé pode usé-la para acessar spot Bark() ou spot.Beg(). \Vooé também poderia alterar informagao nos ‘campos do objeto usando a referéncia. Assim ‘voce poderia alterar um campo Breed usando ‘spot. Breed, P: Espere, entao isso significa que sempre que eu mudar um valor através de uma referéncia, estou mudando-o para todas as outras referancias a esse objeto também? R: Sim, Se rover ¢ uma refer€ncia 20 mesmo objeto que spot, alterar rover Breed pata “beagle” transtormaria spot Breed em “beagle”. P: Volte um pouco em tipos de valor. Por que eu no posso enfiar um niimero pequeno numa varidvel, vindo de um tipo ‘maior, mesmo que ele seja pequeno suficiente? R: Certo. A questio sobre variévels € que elas atribuem um tamanho ao seu niimero, ‘no importa o quo grande 6 seu valor. Entdo s@ voc® nomeia uma varivele Ihe dé um tio Jong mesmo que o niimero seja bem pequeno (como, igamos, 5), 0 C# reserva meméria ‘0 bastante para que ele fique bem grande. Quando vocé pensa nisso, percebe que 6 ‘bem itil, Afinal, elas séio chamadas variaveis Porque mudam o tempo todo. O C# presume que voce sabe 0 que esta fazendo € nao dara 2 uma veriével um tipo de que ndo precisa Entdo embora o nimero passa nao ser ‘grande agora, ha uma chance de que apos um pougo de matematica isso acontega - ele pode mudar e o Cif reserva para ele meméria ‘Suficiente para lidar com qualquer faixa de valores que vocé use. P: Repita uma coisa pra mim - 0 que this” faz? R;: this é uma variavel especial que vooé. 86 pode usar dentro de um abjeto. Quando voce esté dentro de uma classe, vocé usa this para se referra qualquer campo ou rmétodo daquels insténcia em particular Ela é especialmente tt quando voo8 esta ‘rabalnando com um classe cujos métodos chamam outras classes. Um objeto pode usé- ta para enviar uma referéncia que aponte para ‘ele mesmo para outro objeto. Entdo se Spot ‘chama um dos métodos de Rover pasando this como um pardmetr, ele esté dando a Rover uma referéncia ao objeto Spot

Você também pode gostar