Escolar Documentos
Profissional Documentos
Cultura Documentos
Use A Cabeça - C#
Use A Cabeça - C#
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 resultgies . 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 2tudo 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> 71ovientem-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 77Miguel 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 3objetos: 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 79mé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 3public 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 81apresentanto 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 3objetos: 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> 85fixagdo 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 3objetos: 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 87O 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 3objetos: 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> 89Vamos 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 3certifique-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 91Dé 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 3classes 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> 93Use 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 95Diagramas 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 3algumas 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 3caras 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 3Joe 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> 101Adicione 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 3objetos: 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> 103solugao 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 2objetos: 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 105algumas 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 3Este 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> 107oe» 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 113nao 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 4tipos @ 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 115vou 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 123oe 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 4operadores 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 125pegue 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 Capitulo4tipos 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 4tantas 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> 1294 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 4elefante 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 131rie 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 4guarde 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> 137Onde 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