You are on page 1of 312
UV PRUJEVOD CETVRTOG IZDANJA Programiranje C# Jesse Liberty Prijevod: Ana Antié Marko Grgié Gexpert O'REILLY" Programirane Ct, prijevod zetvtogindanja Jesse Liberty Sadrzaj Nakladnile Dobar Plan, Zageeb 2a naka: “Temistay Koss Uredall Aleksandar Dagoeateve Prilgodba omors: Maja Halaije Tis Denons, Zagreb Copytight ©2005 Dobar Plan, Zagreb. Autorisiranpijevod engleskog dana knee Programming CM, Fourth Editon © O'Reilly Media, ine. Ova) prievod je oben pode ‘sestdozvolom O'Reily Medi, In. koja je lasik svih pat 28 abjvhivanje’ prods pon REGO eee eee eeeeee eae eees lako je sckom prijevoda | prigrtve ove kage 2a tsa ulate vei rud kako bis cbt pogtetke, ur iadavat ne preveimajx odgovorness a ogres li propase nt za tet koe mola nase pocrebom infra ic ve ki: Diol —Jezik Ct 1. Programsijezik #1 NET kostur.. 200 = tata a a Platforina NET Acton fies flan = Zag NET kostur vor cos eX) Frevodenjei MSIL tana, dese eeu doe nae cai - 2 Pott, Helo Won. hin ton 982.542 Kase objet tpovi lft ela: Fogming ah Raavo) programa ,Hello World” Koristenje programa za ispravijanie pogreSaka 1. eb prograah jeth — Pisani 3. Osnove programskog ezika Ct... ‘oxen Tipovi L al Varijable i konstante lerati Bij prostor Lskazi Operatori Naredbe 2a pretprocesor 4. Klas objet Definiranje klasa Sevacanje objekata Koritenje staid anova ISBN 953-9520711 3.21 Unistavanje objekata al Prosliedivanje paramerara 84 Preopterecivanje metoda i konsteuktora 90 Ucahurivanje podataka sa svojstvima 2 Polje readonly 7 Nasljedivanje i polimorfizam . . Specijalizacia i generalizacija Nasljedivanje 102 Apstrakne klase 109 Korijen svih klasa: Object 13 Pakiranje i raspakiravanje tipova us Upnjezdivanje Klass uy Preopteredvanje operatora. = 120 Koriétenjekijuéne rijeti operator 120 Podrka ostalim .NET jezicima Ri Sevaranje korisnih operatora 2 Logicki parovi 12 ‘Operator jednakosti 12 Operatori pretvaranja 13 Strukture.. 29 Definiranje strukeura 129 Scvaranje steakeura 12 Suéelja . Definiranje iimplementiranje sutelia 137 Pristupanje metodama sudelja M45 Premoséivanje implementacija sutelia. 153 [Eksplicitna implementacija sutelja 156 Pola, indekserikolekije. . eo Polia 166 Iskaz foreach im Inicijalizranje elemenata polia mm Indekseri 184 Suéeja kolekeiia 193 Ogranigenja 196 10, un. 2, Diol B. 4. 15. Liseet> Redovi Seogovi Rjetnici Nizoviiregularizrai. Nizovi Regularni izrazi Obrada iznimki . Lebacivanje i bvatanje iznimki Objekti Exception Prilagodene ianimnke Ponoyno izbacivanje iznimki Delegatii dogadaji Delegat Dowadaji Koriftenjeanonimnih metoda Doha vrijednost iz vieodreditnih delegata Programiranje na jeziku C# Programiranje Windowsapliacja ......... Ierada jednoscavnog Windows Forms obrasca lerada Windows Forms aplikacja ‘XML komentati 2a dokumentacija Pristup podacima kroz ADONNET . .....- Relacijske baze podataka i SQL Objekini model ADO.NET-a Poéetal rada s ADO.NET-om KoriStenje OLE DB upravlianth i2vora podataka Rad s kontrolama 2a podatke Programiranje ASPNET aphikagjaiWeb wsuga Razumijevane Web Forms obrazaca tarada Web Forms obrasca Dodavanje kontrola 201 212 24 27 220 221 235 2 2S 246 255 258 261 267 281 De 295 305 306 310 Bu Br 337 34) 343 346 349 356 357 36 365 ‘Se Soi Povezivanje podataka 367 21. Tokovipodataka 491 Web usluge 377 Datoteke mape 400 SOAP, WSDL i otkrvanje 377 Citanje i upisivane podataka so lerada Web usloge 378 Asinkroni ula iizlaz 10 Stvaranje posrednika 383 Ulaziilaz podataka preko mrete 314 16, Sastavijanjeu gelinu. .. 6... e eee cece eee ee eee ee eee eee 389 ethan 533 Ukupni dizain 389 Serna 536 larada lijenta Web ustuge 389 et a Paikaivanjerezutaca 399 22, .NETiCOM programiranie. . 548 Pretratvanje po kategorjama 308 votenje AciveX kontola 548 Uvodienje COM komponenata 556 Diol. CLRi.NET kostur Ivotenje NET komponenata 564 Piiavoke 567 17. Sklopovirad sinaticama a pesonbocconAd. 9 Pokazivati 570 Mons a Dodatak: C#ljuéne rie. 575 Sigurnosna granica 416 Kalo... oa Manifest 416 Sklopovi vite modula aT Privat sklopovi 25 Dijelen sklopovi 25 Global Assembly Cache 28 lerada dijeljenog sklopa 228 18. Avibuti refleksija. ee al Aeibut a Relea 438 19. Raspoedivane iradna daljnu G00 cee Mt Aplikacjske domene 449 Kontekst 458 Rad na daljina 460} 20. Dretveisinkronizacja. 6000 a7 Drewve mn Sinkronizacja 480 Sanja nagjecania i zasoj 489 wT sai ‘ay | Predgovor COrprilike svakih deset godina pojavise nova tehnologija koja promijenina8 stav prema razvoju aplikacja. Pocerkom 1980-ih pojavio se operacioni sustav Unix koji se mogao pokrenuti na stolnom ratunalu, a turcke ATE®T raavilaje maéan novi programski jezik C. Poteckom 1990-ih pojavo se operativni sustay Windows i jezik C++ Svaka nova th: nologijapredstavljala je veliku promjenu u pristupu programiranju, 2000. godine use dio je novi val koji je donio NET i C#, 2 do raja 2005. godine donjet éei NET 2.0. Microsoft se .kladio na NET. Kada tako velika i utjecaina tvrtka potro8i milijarde dolara i promijenicjelokupnu steukturu poduzeéa kako bi podréavala novo placiorm, to ne ostaje nezapazeno medu programerima, .NET ée ustvari promijenitivaS stav prema programiranju. Ukratko, radi se o novo} s2vojno platform ija je svcha olakati objektno orijentiran razvoj 2 Internet. Programski jezik koji je izabran za ovu plat- forma je C#,smitlen na remelju ranijeg iskuseva sa jezicima C (odlitne performanse), (C++ (@bjektno orijentirana struktura), Java™ Gakuplianje orpada,visoka razinasigur- ost) i Visual Basic (brz razvo),s namjerom stvaranja novog jezika koji éeu potpuno: sti odgovarati vigeslojnim Web aplikacijama temeljenim na komponentama (C# 2.0, jezik odabran za_NET 2005, sadréi abutirane alate novi sna razvojni oko- is. On predstavja najvece dostignace Microsoftovog ulaganja u istrazivanje i razvo} Jednostavno jesajan ok (Ova kojiga je priruénik za C# i pisanje NET aplikacijas pomocu jezika Ci. ‘Ako ste programer koji se dabro sluiijezikom C# 1.1 isamo flit saznati koje su nove znatsjke jezika C# 2.2, odlotite ovu kaijigu i kupite Visual C# 2005: A Developer's Notebook (u izdanju O'Reilly Media, Inc). ‘Ako, s druge strane, Zelive paboljfati svojevjstine programirania ili se dobro slutite Modda ste primijetili da je direktiva using Systew napisana ispred definicije klase Hello, Visual Studio NET 2005 u svaku konzolnu aplikaciju ukjueuje ti iskaza using (Systen, systen.Collections Generic i Systen. Text). lako mozete igjviti da koristite imenski prostor Syster, 2a razliku od nekih drugihy jezika, ne motete izjavti da koristte objekt System.Console, Primjer 2-4 se neée pre- Prinjer 2-4. Kod koi se ne mote prevest (nije dopusten u C2) sing Systen. Console; class Helle t static void tain() ‘ ‘eons 5 snenstog prostora Syston i Uaritetine( Helio Worle); ) ) Generira se pogreska u prevodenju: error C5018: A using ranespace directive can only be applied ‘to namespaces; "Syten. Console’ is 9 type not a namespace ny ‘Ako koristice Visual Studio, wider éete da ste napravili pogretka, jet (iim Stn ets siete, Veli SEE $2005 6 navest pops valjanih imenskth prostora na kojem seme nalezt Console. Kortene Kune oie using mote smanjti Kolin koda koji rebate naps li Inet | oni predhosd imensih prestora je 2agaduje doses brojnimnaavima a se preklapaju, Najéesce reSene je koristene kjuéne niet using uz ugradene imenske prostore i one koje ste sami stvorili, ali ne i uz komponente koje ste nabavili od neke trege strane, 'Neki programeri uj ispisuu cifelu putanju kroz imenske prostore do objekta (npr. Systen. console rite ine), ane sam Console rite Line()) ito oriste kao dodatak dokumentacii To je meuporebv pris- ‘up ako se koriste slofene hijerarhije imenskih prestora Razlikovanje veli malih slova U C# razlikovanje velikih i malih slova je obavezno, sto znaci da writeLine nije isto Molten achusursidaaeawrteue, Netse sanituod 8c eee eis ae pope erin a a AL tunesete malim, a drugi put velikim slovima, unijet éete pogresku u program koju éete imyeame mone S) _Koristan wik je oanaéiti naziv u kojem su pogreino napisana jedino Kako biste sprijtili ovakve pogretke na kojima se nepotrebno gube rime i ener- sje, trebate sastavitipravilnik za imenovanevarijabli, metoda, konstant itd. U ov} se knjzi variable imenuju ,deva" zapisom (engl. camel notation) (npr. imeNekeVari- jable) a metode, konstante svojstva Pascalovim zapisom (npr. NekaMetod). Pascalov zaps od eva" zapisarallkuje samo po tomestownjemu nazi potinjaveikim slovom. Microsoftjerazvioamjerice (ones sto sve Sto vam je zap adres ups microsoft comilibrarydefault ap?ur=llibraryln-usl -pgenrefhtmllepconNETFrameworkDesignGuidelines asp nj koda koje krisnopogledati pottebno). Matete ih prevzt sa Kijuéna rijeé static Metoda Hain() prikazana u primeru 2-1 ima jo jedno odredenje. Odmah ispred deklaracije povratnog tipa void (koji, seat se, oznaava da metoda ne vraéanikakwu ‘jednost) motete pronaéi kljuénu rijeé static: static vod Yan() Kijucna sjet static povori kako Main() motete pozvati bez prethodnog svaranja cbjektatipa Hello. Ova pomalo kompleksna tema bitéedetajnijeobradena u kasnijim poglavlima. Jedan od problema koji se javjju prilikom uéenja novog programskog, jezika je pocreba za koriStenjem slozenijih znaéajki pri njihova potpuna razumi- jevanja. Za sada deklaraciju metodeMain() mozete smatratZacobnom formolom 14 | Pogamianect i Pole: Peek HeloWel™ | 15 Razvoj programa ,,Hello World” Postoje najmanje dva natina na koje mozete napisati, prevesti i pokrenuti programe iz ‘ove knjige:s pomo¢u Visual Studio NET IDE-2ilis pomocu programa za uredivanje teksta i prevoditelja koji se pokreée u odzivniku. Jako programe motetecazvijatizvan Visual Studia INET, IDE vam prusa razne pred- nosti. One ukljueuju podrsku za wslagenje redova, Inelisense, ozatavanie boiamna i incegraciu s datotekama 2a pomoé. Najvaznije od svega, IDE sadezi moéan alat za ispravijanje pogreSaka i mnostvo drug alata. U ovo) knjiz je pretpostavijeno da éete koristiti Visual Studio .NET. Medutim, upute su vige fokusirane na jezik i platformu nego na alate. Sve navedene primjere mogete ‘opirasi u program 2a uredivanje teksta poput Notepada ili Emacsa, spremiti ih kao tekstualne daroteke s nastavkom imena csi prevesti s pomocu C# prevoditeja za odzivnil koji se nalazi u kompletu -NET Framework SDK (ili kompletima razvojnih alata kompatibilnih s plaformom -NET kao Sto su Mono ili Microsoft Shared Source CLD) Napominjemo kako neki od primjera navedenih u kasnijim poglavhima koriste Visual Studio .NET alate za izradu Windows i Web obrazaca, no Zak i te primjere motete tudo upisati u Notepad ako Zelite iti tedim puter, Uredivanje programa Hello World” Zaizradu programa ,Hello World" u IDE-u, odaberite Visual Studio.NET s izbornika Startili odgovarajudw ikon na radio} povrSini, zatim odaberite File + New ~+ Project. ‘Time éete otvariti prozor New Project (sika 2-1). Ako prvi put koristte Visual Studio, -prozor New Project maida ée se sam pojaviti ‘Slika 2-1, lerada C# Renaolneaplikacj u Visual Stun. NET 16 | Poganianjece Za otvaranje aplikacije odaberite Visual C# u prozoru Project Types, 8 u prozoru ‘Templates Console Application (oa) korak ne marate investi ako koristte Visual CH Express Edition —izravno odaberite Console Application) Sada moete upisatinaziv projekta i odabrati mapu u koji éete spremati datoteke, Pritis nite OK i orvoit ée se novi prozoru koji mo3ete upisati kod iz primera 2- sik 2-2), Suaiem oe ssoma™ Sa ‘Slike 22, Editor w koji mozete wpsai program Primijetit éete kako Visual Studio NET imenski prostor sevara prema navedenort nazivu projekta (HelloWorld) i dodaje direktiva using za Systen, 5ysten.Collections. Generic iSystes. Text jer tipovi iz th imenskih prostora biti poteebni za gorovo svaki program koji budete piss Visual Studio.NET stvara klasu Progyae koju slobodno mozete preimenovati. Kada klasi mijenjate naziv, dobro je promijeniti i naziv datoteke (Class). Ako promije ite naziv datoreke, Visual Studio ée automatski umjesto vas promijeniti naziv klase Za reprodukciju primjera 2-1 promijenite ime datoteke Program.cs (nalazi se u pro zoru Solution Explorer) hello.cs te promijenite ime Program w Hellokorl¢ fako mena promijenite obrmutim redoshijedom, Visual Studio &e promijenit ime klase u hello). 'Na kraju, Visual Studio 2005 stvara kostur programa kako biste lakée zapoéeli s radom. Za reprodukciju primjera 2-1 uklonite argumente (string[] args) iz metode Moin). Zatim shededa dva red koprate utelo metode Moin) esa toon Paes ea pa 17 Korii onjektboncole sustave ‘System onsale riteline(eLlo World"); ‘Ako ne koristte Visual Studio NET, otvorite Notepad, unesite kod iz primjera 2-1 i datoteku spremite kao tekstualnu datoteku hello. Prevodenje i pokretanje programa ,Hello World” Visual Studio pruza mnogo natina za prevodenje i pokretanje programa ,Hello World, Skoro svaki zadacak mo8ete obaviei prtiskom na gumb na alatnoj vrpei Visual Studia, odabirom opcie izbornika ili u mnogim slutajevima uporrebom preéaca na tipkovnici ic odabirom opeie izhorntka Pretaci na tipkovniel mogu se pos ji! pretpostavjeno eda koris- ‘Tools-+ Options + Keyboard. U ovo} ite zadane postavke Za prevodenie programa .Hello World" mozete, na priener,pritismuti Ctl Shift B i ‘odabrati opeij izbornika Build + Build Solution. Mozete i pritisnuti gumb Build na alatnoj vepei Build (a bist je vidjeli moda éete morati desnom tipkom mia pritis- nti alatnu vepcu). Alatna vrpea Build prikazana jena slici 2-3. Gumb Build nalszi se sasvim Iijevo i istaknut je Sika 23, alata vrpca Build Za pokretanje programa Hello World" bez ispraviiania pogresaka modete na tip ovniei prtisnuti Cer-P5, odabrati Debug + Scart Without Debugging ili pritisnui gum Stare Without Debugging za alatnoj vrpei Build, kao so je prikazano naslici2- 4 (moda éete mora prilagoditi svoju alatnu vrpcu kako bi ova) gumb bio dostupan). Progeam motete pokrenuti bez da ga prethodno prevedete (ovisno o postavkama pod Tools + Options) ~ IDE ée spremiti datoteku, preveste i pokrenuti(pritom ée moéda od vas zatraZti dopuStenje 2a svaki korak), ea ‘Slika 2-4. Gum Start Without Debugging U pevom redu preporutam da proutterazvojnlokoli Visual Studia 4g, 2005. Tojeza vas, kao NET razvojnog indenera, osnovn ala veloje 4s vatno dase njime znae dobro shtit. Vajeme koje ulofte w upozna ‘ange okolisa Visual Studia viesteuko evar se tsplatit u shedecim Injevecia, Pravovremeno prevodenje Brevodenjem programa hellcskoritti ce tara se iavedbena datoteka, Upamtite daswu eke daorecinsrukcjecapsine « MSI-0, kof opisan upoglavi Zanimljvo je da, ako ova aplikacjynaptere w VBINET-u il bilo koje deugom Jeelkusukladnom s INET CLS-om, dobit ete vige-manjelti MSIL. Reaike med IL koda stvorenog raz jeicims praeiki ne posto {Uzto o svar IL kod, prevodi sevara segment exe datoree samo 28 tan w oj umecestandardno Wing2 iavedbeno zalai, Prevodi zadsjeulanu cotka tinuarsepmenta samo za Gane, Progra 2a utitavanieprelaat na cu roku kads pokrenete program, bat kao kd svakogdrugog programa za Windowse, Operacionisusta, medutim, ne mode ives I kod ia ulazna tote si samo za ptielaz do NET prevoditel (kote akoderopisanupoglalu JT prevoitl fetericaoriginalne instrukcje 2a procesor Kale se mogu pronaé bignim exe datotekama: Kljuéno svojstvo]TTprevoditeha espravo je da se metadeprevode samo prom worstenja, kad su na edu za ivodenje Za prevodenjepokretane programa Hello Worlds pomotu C#prevoditelj2aodzivok kj senalaz u paketima NET Framework SDK, Mono (itp /twww.ono-project.com i Shared Source CLI htip:imsdn microsoft com/netsci pratt sjedece hora: 1, Speemite primer 2-1 u datoreku hells 2. Otvorte NET naredbeni proaoe Start—+ Programs ~ Visual Studio NET ~ Visual Studio Tools ~ Visual Studio Commmand Prom. Ako koristite UNIX, tebate ‘pokrenutitekstualn kortzolu, xterm il neSto Sc Ge vam prikazatiodzivmik uske, 3. Unaredbenom redu zadatesljedeéu naredbu ako koristite NET ili Shared Source CLI C# prevoditej: fe /debg heo.cs ‘Ako Koristite Mono, zadajt sedeéu naredbu. cs debug hello. ‘Ovim korakom pravi se EXE datoteka, Ako program sadrii pogretke, prevodicel eo njima ivijestit u prozora odsivnika, Preklopnic/dbug w kod umecesim- bole tako da EXE datoteku mozete pokrenuti pod programom za ispravljanje pogreSaka ili pogledati brojeve redova koda u tragovima stoga (trag stoga éete dlobiti ako program generira pogreSku koju ne obradujete) 4. Za pokretanje programa pod .NET-om unesite: hele ‘Ako koristite Shared Source CLI zadaite ova naredbu: ix hetlo.exe ako koristce Mono onda ovu: oro hello.exe Sada biste u konzoli treba vidjetirijedi Hello World” 1 | Prine Fogle: Foetal eleWor™ | 19 Koristenje programa za ispravijanje pogresaka Alatzaispravianje pogteSaka virojano jenajvaini lat wsvakom azvojnom oko. Visual Studio ima velo moéan ala 2a spravjanjepogretakai vrijeme koje potrostena jegovo svladavanje vigestruko ée vain seisplat. Osnaveispraljanja pogreSake vrlo ss jednastavne, TeLosngene veitine su: + Kako postavt tosku prekida te kako doi do nije *+ Kako uti u poziv metodei pri preko njega + Kako prover i promijeniti vrijednostvatable, podatka hana nd (Ovo poglaviie ne ponavija kompletn dokumentaciju alata za ispravljanje pogtesaka, ali ave su vjetine toliko vane da se jednostavno moraju ukratko objasniti Alat 2 ispravijanie pogeesaka isi cilj mode se koristti na razlitite natine, obicno preko ‘opeija izbornika, gumba itd. Najjednostavniji natin postavijanja totke prekida je pri- tiskom na lievu marginu programskog koda, IDE rotku prekida oznatava ervenom bojom, kao na sci 25 { tk, jer Koda. Ovdje naveden kod uzet je i poglalja 5 \ nije potrebho da ‘azumijete kako funkcionira (ako ge C++ i Java programet vjerojerno ies ~] 2a objatnjenje alata za ispravijanje pogreSaka potreban nam je prim: 4, 84 shat Cem se ed Za pokcetanje alata 2a ispravjanje pogreSaka modete odabrati Debug -» Start ili jed- nostavno pritisnuti FS. Program se zatim prevodi iizvodi do totke prekida, na njoj se zaustavla, a Zuta strelica oznatava sledetiiskaz za izvodenje, keo Sto je prikazano na sci 2-6 °| antceagt st Deawtindout + for ( tnt d= 02S <97 See) | Slike 6, Dosegruta torka prekida 20 | Preqramaiece Nakon st se dos do tothe prkid,peovjeravtijenoati srt objets je jednostavna. Na prime, vnjednot vale 1 nde ee ako nae pace polauvad mia pitelate eli went ee 22), $e } Stka 27, Prikaz vrjednost jetta UIDE alatu 2a ispravlanje pogrefaka postojii nz korisnih prozora, kao to je prozot Locals w kojem su prikazane vrijednosti svib lokalnih varijabli slika 2-8) {lush mndon—etatltodnmion ‘eaieosr teed uote ter irate ter) nate an | =< Sta 2-8, Prozor Locale Ugradeni tipovi, poput jelobrojnihveijednost,prikazuj viednos, ali objektiprika ju svoj ip uz nih je prikazan znak pls 4). Te objekte modeteprosrit kako biste Vidic njibove unutarnje podacke (ka 2-9). Vigeo objektima i nilhavie unueaceim Podacima mozere stznai u poglavlima koja sljede Pose Piet Hal Wer™ | 21 U sljedeéu metodu mozete uei pritiskom na F11. U ovom sluéaju sliedeca metoda je Drawindow() Kase Window, kao So je prikazano na slici 2-10, Slika 2-10. Ulagka w metodu ee) ron), ob primi akoeshedeisaznaredvenzvodeneteLine) ura Prone Auosse tur sem je prikazan weno staje eta : tog slovak od we 0 ala 2aipravjane pogteaka reba nauiijos mnogo coe ods intimin dnlasagnsk og pane aes ‘ehep ke pbe roge pegtehe hv alt erhonj pea Baber alanine pope jn nel atin, ajc) alas ss were progamslog alk, eee eee eee hOG!AYIIES Osnove programskog jezika C# V poplavlju 2 prikazan je vrlo jednostavan program napisan vjexika Ce Ta je mali Program tolikosloten da smo moral preskottinekoliko vaznih pojedinosti,U over ela te su pojedinesobjatnjene detajnjim prikazom sintaksetstrukture samoy jezika C¥. Ovo poglavjeopisue sustavtipovau jeiku GA, pravediraliku iamedu ugradenih tipova (int, bool itd.) i korisnigki definiranihtipova (ipova koje sami stvarateueblica ‘Kasai suéelja) Unjemu su objainene iosnove programiranja popat stvaranje hors. ‘era varjablii konstanti. Nedale, vu su objanjene enumeracie,nizov,ideneflestor, izrazi i iskaai. 1 drugom dijela vog poglaija motete pronaéiobjanjenaiprimjere kritenjaiskaza 2 konuoly tea $f sitet le, d...yhtt, fori foreach. Objasnjeni su opens Gi ulducuju logit, relaciske, matematike operatoreioperstorepridrutivanje Sled uvod w imenske prostre i kratak voié kroz C# prerpreveditel {ako je glwni zadata jezika CH swaranje objekat i rad snjima, najbole je poteis osnoynim dijelvima: lementima od kojh se objet stvaraju, Utese elemente baja ugradent tipovi koji su remeljn do jecika CH, kao i sintaktigki element jezika CH Tipovi Gi Je vro ipizian jezik. U takvom jezik moratedeklarirat tip (engl. type) svakog objekta kojeg stvorte (np. cjelobrojnth vrijednost,brojeva s pomignim arerone nizova, prozora, gumba itd), a prevoditeljée sprit pojavu popresaka tako So ce inzistrati da objektima budu pridruteni samo podaci odgovarajuceg tip. Tip objekta Bs0vori prevodicelukaliko je abjekt vik (pr. int oznatava objek od 4 baja) koje su ‘fegove moguénosti (npr. gumbi se mogu povut, pritismuiitako dale) 2 | Pograiare ct i ih ais [Napomena za C# 1.1 progiamere:svedo inatice 2 platforms NET bile je vo tipizirana u svemu asim u kolekcjems, Uvodenjem generike sevaranje velo tipziranih klasa kolekcja sada je jednostavno, kao Sto Je prikazano u poglavju 8 Poputjerika C++ i Java, C# tipove deli u dva skupa: ugradene (engl. intrinsic) tipove koji su dio samog jexika i korisnzkédefnirane tipave koje defsira programer. CH skp tipovadijlina jo dvije Kategori: vijednosne ireferentnetipove.* Osnovna raalika izmed vrijednosnih i referentni tipova je natin spremanja nihovih vrijedno- sti umemoriju. Vejednosni ip Eava svoju vrijednost u memorij dodieljeno} na stogu (engl. stack). Napomens za CiCH+ propramer:u CH ne pos cksplisin poke teljdaje objektreleentnog tia (ne korist se operator 8). Takode, 13 w C# obitno se ne koriste pokazivati (iznimkw ovog pravila pocrazite ‘postal 22). a" ‘Ako imate velo velik objekt,njegovo smjeStanje na gomilu ima mnogo prednosti. U poglaviu 4 objainjene su prednosti i nedostaci ada s referentnim tipavima. Ovo se poglavie bavi ugradenim vrijednosnim tipovima koji su dostupni u Cf UCH velitna format pohrane 28 razltteugradenetipove (opt ot) ne ovis o platform i edna su usvim NET eseima, a CH podréava tipove pokazivaza C++ stilu, ali oni se koriste samo kod rada s neu- pravljanim kodom. To je kod koji nije stvoren na platformi INET, na primer, COM objekt. (Rad s COM objektima objainjen je u poglaviju 22.) Rad s ugradenim tipovima C# nudiizobilje ugradenih tipova koji se ofekuju od modernog programskog jezika, i svaki od nih preslikava se u temelni tip kojeg podrlava ‘NET CLS. Preslikavanje CH priminiveih tipova u temelini .NET tip osigurava da se objekestvoren u C# moze kristi naizmieniéno s objektima napravlienim u bilo kojem drugom jeziku koji je w skladu s.NET CLS-om, primjerice u VBNET- * Seager pon ni ec ade opin vu 3st pan upg 14 ‘jeden pon Sua korsmiks defray pov, osm stuktuts popledse poglalje 7 venumeseni ‘pve lpoedse ogi) seen ior Napomera za Jase programe: Ct imo i espon esnovnth ipa od jean Jva Tea ak decimal tp u Ca je hart so Financipke artune ‘Svakitipima odredenu i nepromjenjivavetiny, Za raziku od C++, veligin int tipa Cit je viel 4 bata jer se on presikava w Int32 u NET CLS-v, U tabic 3-1 popisani su ugadeni vriednosni pov dostupm u jezik CH Tabla 3-1, Vriednosni pou w C# nat . a wyte 3 byte ezprednela jens 0804025) car 2 char "eden oo 4 ooleon uefa styte Sayte Span dns 12840127) Short 2 nts Spel (ides ob 32768403276) Ushers 2 Utotrs ——_Bezpedaaedetodo 65535) Int 4 Ints2 Glebe iets prednatamed M7 A368 aM vine 4 ints Gj eet ber penal od 0420496285 Float 4 Single thesponiin xm. avast tai /-1510Sdo tpi 2410 seam ch amen powble 8 Double Bo)sponiain zen rtd pent oa edastod nt S00 ace LM om ecimal 36 Decimal‘ recent 28 neni sas eine arr Kot seu radi nina hte pets A Long 8 Intst eee dno reatom of 2233720368547 008 S92 ASTS AT More 8 Uonted Osborne de et Napomena za Ci C++ programert: u CH vrjednost Boolean vaiabl. mote bitsamo tre false. Gelebnoje rijednoetise ne izjednataj ‘4 Boolean vijednostima w Ci in post impliitn pretvarane. Uz ove primitivne tipove Cf ima jos dva vejednosna tipa: enum objatnjen kastije w ‘vom poglavju) i struct (objasjen u poglavju 4). U poglavlju 4 objaSnjene sui druge ‘ojedinostivejednosnth tipova, poput primjene veijednosnih tipova kao referentnih tipova u postupk bol je poznat pod nazivom pakiranje (engl. Boxing) i éinjenice da vrijednosni tipovi ne nasjeduju 24 | Prgrmiajece Pee One poyamogjelace | 25 Stog i gomila Stog (engl sac) je podatkovna struktua koja se kos za spremanj elemenata na naela poled unutra rv van® (pope gol anjraurstoran).Stog se adnost a podrucje memonije koje podrdava procesor iw koje se spremj lokam varjsble U GE vriednosn tipovi (np. ceobrojne vrijednos) se alciraja na stog. Za nj- hovu vijednost se rezervita podrutjeu memoriina tse podrutleelertaimenom variable Referentnitipovi (npr. objeke)rasporeduju se na gomilu. Goma (engl heap) je pod rutje memorije koje se korist 2a alaciranjeprostora objektima. Kad se objek alocira 1 gomilu, vrada se njegova adtesa i zatim pridruzaje referenci ‘Objekti na stogu se unstavaju kad izadu iz dosega. Okvirstoga je obitno definiran ‘metodom, Ako lokalng varijablu deklairate unotar metode (kao Sto je objatnjeno kesnje u ovom poglavjv), objekti koje stavite na stog unutar te merode bit ée unite kad metoda zavei ‘Objekti a goal se sakuplajo worpad kratko nakon unistavanja posljednie reference koja ukazuje na ni, Napontna 22 C i C+ programere: CH upravlja svom memorijom = ‘pomocu sustava2asakupljanj orpada ne posto operator 2a brisane Odabir ugradenog ipa ‘Odluku 0 tome koju éete vistu cjelobrojne vrijednosti (short, int ili long) koristiti ‘obicno donosite na temelju velifne vrijednost koju Zelitespeemit. Na primer, ushart mote sadréati samo vrijednosti od 0 do 65,535, dok uint mode sadréati vrijednosti 10 0 do 4,294,967,295. Memoria je razmjerno jeftina, dok je vrijeme jednog programera sve skuplj. Veéinu vremena éetevarijable deklarirati kao int, osim ako ne postoji dobar razlog da einite rukeije, CGjelobrone vriednosi su éesto brZe od manjh ipovajer su moder rocesorioprimizian za rads aja Float, double i decinal nude razliite stupnjeve veligne i preciznost. Float je dobar 23 vecinu malih necjelobrojnih vrijednosti. Uzmite u obzir da prevoditelj pretpostavlia dda je svaki brojs decimalnim zarezom double ako ne kaZete druktije. Za doslovau > } Kada pokuSate prevesti ovaj ispis, C# prevoditeljée prikazati poruku o pogresci pr kkazanv na slici 3-1 qi broth et Sa Gi teed cipal isis nit” Ouida ir Slika 3-1, Poruka opogeici nasal zbogkorstenja variable kao) ie dodilenaviidnost ‘Ako dvaputpritsnete poruku o pogreScirazvojni okolisée postaviti earsor na mjestu pogreske v kodu. UE nije dopusteno koritenje varijabli koje nisu inicijalizirane, Znati lito da svaku \arijablu u programu morate iniijalizirati? Zapravo, ne. Ne morate stvarno inicijar lizicati varijabl, ali joj prije koristenja morate dodijliti vrijednost. U primjeru 33 prikazana je ispravna inatica programa, Primjer 33, Pridadivane bx nicalicrania segion Ueig directives using tes Sing spten colecton. Cee; tbirg Sten Tex, seedregon anespace Assigningithoutinitial ining class Assigninghithoutintializing ‘ static void Main(string[] args) ‘ int nytt}, mies Baten cnoleateine( “Assigned, ptt: (0), apt; pines, Spin Cosa Metin Resse, mtn: (0), me) ) ) , Konstante Konstanta (engl. constant je varijabla jase vrijednost ne mote promijenit. Varijable predstavijaju mo¢an alat, ali ponekad je potrebna toéno odredena vrijednost, vrijed- post za koju Felt bit sigurni da € ost nepromijenjena. Na primer, u program 7a simuliranje kemijskog eksperimenta trebate korisittotke veelitai ledifta na Fabren- beitovojskali. Program ée bic asniji ako varijable wkoj se vriednostspremaju nazo vete FreexingPoint i BoilngPoint, line Zelite dopusei da se ninove vijednosti pro: iene. Kako to sprijdit?RjeSene je koristenje konstanti Postoe ti vrste konstant literal engl literals), simbolicke konstante i enumeracije (engl. enumerations) U irazu: xe vijednost 32 je literal. 32 uvijek ima vrjednost 32. Toj konstanti ne motete dodijlit > Uprimjeru 3-4 sevorene su dvije simbolitke ejelobrojne konstante: FreezingPoint i8oi- LingPoint. Nazivi konstanti napisani su Pascalovim stilom, no to nie obavezno. Sutha ovih konstamti je da ws svitm patcebnim izrazima koriste vriednosti 32 4212 2a totke ledita i velista ali, buduci da konstante imaju nazive, one prenase mnogo vise znatenja. Ako odlutite program prebaciti na Celzifusovu skalu, konstante mozete pponovno inicjalizirati prilikom prevodenja na 0 i 100, Ostatak koda trebao bi nor: rmalno funkcionirati, Kako iste se wverii da sekonstanti ne mote ponovna dodijglit vriednost, pokusajte ukloniti oznaku komentar iz poslednjeg reda u kodu (prikazan podebljanim slovima). Prilikom pontovnog prevodenja trebala bi se javiti pogreske prikazana na slic 3-2 cel | Desaiption or ik be variable, property orindexer Sika 3-2, Upozorenje hoje se pojelijekada honstant pokutate ponouno dedi vrilednost 2 | Progamianece Enumeracije Enumeracje (engl. enumerations) su ignimno korisna alternativa konstantama. Enu- smeracija je samostojan vrijednosni tip koji se sastoi od skupa imenovanih konstait {naziva Se i enumerarorski pops), U primjera 3-4 sevoril ste dvje povezane konstante: cent int FreezingPoint = 32; fonst int BotlingFoint «283; ‘opisu mozete dodati razne deuge korisne konscante, popu: canst int LightIackebleather + 60; onst int Sginminglesther = 12; fanst int Wicket (Ova) postupak je pomalo zamoran | izmedu navedenih konstanti ne postojilogi¢ke ve2a, Za rjeSavanje tog problema u C# dostupna je enumeracja rum Tenperatures t Wickedcols Freezigpoint = 22, Lightacketleather = 60, Ssimningaeather = 72, eslinghoint = 212, Iza svake enumeracie nalazi se temeljni tip koji mode biti bilo koi tip celobrojne vri- jedhnost (integer, short, Long itd) osim char, Tehnicka definieija enumneracije je [otrituts) [nodifskators} enum identifikator [aston tip) fonmeratarsté opis}; Neobavezni modifikatori i aributi opisani sa kasnije w knjizi Zasad éemo se usredo- tofiti na ostatak ove deklaracie. Enumeracija potinje kljuénom rijeti enun iza koje obitna sliedi identifikator, na primer: run Tenperatures Osnovni tip je temeljn tip enumeracije, Ako izostavite ovu neobaveznu vrijednost (5:0 se esto dogada), ona ée poprimitivrijednost int, ali slobodno mozete koristti bilo kojitip ejelobrojne vrijednosti (npr. ushoxt, long) asim chat. Sjedeéi odlomak na pri ‘jer, deklarira enumeracijacjelobrojnih vrijednost bee predznaka (uint) nur Servingsizes use salt = Regular Lage = 3 ? Obratte paznju na envmeratorski popiskojim zavrSava deklaracija. On sadrdi pridru- ene konstante za enumeraciju koje su odvojene zarezima. Yogic ppatigiela | 3 U primers 3-5 prikazan je prepravlen primjer 3-4 u kojem se koristi enumeracija Prinjer 3-5, Pojedaostavhivanje Roda koriSterjem emamerci, region Using directives using System Using Sjeten.Collections.Ceneric using Systen. Tests ferdragion rnanespace EnuerateeCorstants t clase Enumeratadonstonts ‘ rum Temperatures WickesCold = 0, Freeringoint = 32, Ughtlacketlesther = 60, Ssimmingleather = 72, oslingPoint = 212, ) static void rain(stringl] 298) Spsten.Console.uritelsne(*Freening point of water: {0)", (int )Tenperatures.Freezingpoint); Systen.Consle.dritelsne( "Bailing point of water: (0}", {(int)Tenperatures. 60 ngrott); ) } Koo Sto mofete primijecti,enun s¢ mora kvalficiraitipom enumeracie (npr, Tenpera tures.kickedCold) Viijednost enumeracie se podrazumijevano prikazuje s pomocu simboligkog naziva (kao Sto su BoilingPoint i FreezingPoiot). Kada Zelite prikazati ‘uijednost enumerirane konstente, Konstantu morate pretv0riti u njen temeljni tip (nt). Cjelobrojna vrijednost se prosleduje u Writel ine i prikazue. Svakoj konstanti u enuumeracii odgovara brojtana vrijednost ~ u ovom slucaju ciel broj. Ako je ne postavite drugatie, enumeracija poginje nulom, asvaka shedeca vrijed- nnost je 2a jedan veéa od prethodne. ‘Ako stvorife siedeéu enumeracij mon Sonealons c fist, ‘acon, Thisd = 20, Fourth ) 4 | Pogamiane ce ijednast First bit €e 0, Second ée imati vijednost 4, Third 20, a Fourth 21, -Enumeraije su formalni tipovi stoga jeza pretvorbu tipa enumeraciew ip jelobrone vnijednosti poceebna eksplictna prervorba, \Napomena 2a C++ programere:u CM se enumerasije kaise na malo valuetwo ) console hrtLine( “vyalueOne: {0} Tanger than WalusTue: (2), ‘elucone, valueto); lee i console rSteLine( “Yaluetvo: {0} Larger thn Valuer: (2)", ‘value, valued) ) valucdne = 30; /7 Postavlja valustne vite iF ( yaluedne > value ) c Valuetso = walusdneee; ConsolesMriteLine( "Vetting valuetuo to valvsne valve, *)s (onsoleshriteLine("and inceeneting Value. \"]; ConsolewriteLine("Valueone: (0) Value: (3H, valuedne, valueti); valasine = valueto; ConsolesuriteLine("Setting then equal. “Ys Consolesrtetsne(‘Valuedve {@) YalveTvo: (2)", valued, valueTs); , , U prinmjeru 3-7 pevim se iskazom 4 testra je i valuedne vege od valueTwo. Relaciski operatori poput veée od (3), manje od () i jednako (=) prilino su jednostavni za koristeje ‘Testianjeje li vatueane vece od valuetwo daje neistnitrezultat (je je valueOnejednako 10, avalUueTWo je jednako 20, stoga valueOne nije veée od valuelwo).Poziva se iskaz else koji ispisujeiskaz: sled: Cio prgramsiogjeria | 38 ValueTue: 204s larger than Valuene: 20 Drugije skar if istniti svi iskaziu bloku 4f se procjenjuju, Sto uzrokujeispis sedeéa diva reda Setting value to valveOne valve, tnd incrementing Valuse ValucOne: 32. ValueTia: 30 Biokovi iskaza Blok iskaza mode se nepisati na svakom mjestu na kojem C# ofekujeiskar. Blok Jskaza je skup iskaza smjeSten u vitiCaste zagrade Stoga umiest: Sf (neswvjet) teksts; modete napisat: ftnekitvjet) { sskazdedan; se; starteh; Ugnijetdeniiskaciit Iskazi if se Zesto ugnjezduju kako bi se upravialo sloZenim uvjetima. Prerpostavimo dda crebate napisati program za provjeru temperature koji vra¢a sede informacje: ‘+ Ako je temperatura 32°F ili nifs, program bi vas trebao upozorti o ledu na *+ Ako temperatura iznosi totno 32°F, program bi vam trebao rei kako moze dost do zaledivanja, Postoji mnogo dobrih nagina za pisanje ovakwog programa. U primjeru 3-8 pokazan Jepristup u kojem se koriste ugnijeZdeniiskazi if Primjer 3-8. Upnijedden ihacl if region Using directives using Systen; srg Systen Collections. Generics sing Systen. Text; encregion Primjer 38, Usnietden’iskae i (natavak) anespace Nesteclf class testeatt static vote Maing) ( int temp = 325, iF (temp ce 22) ConscleerteLine( “warning! ce on road!” ); if ( temp = 32) Congo iteline( Teap exactly freezing, bare of water.” lee ‘ Congelesriteine( "Watch for black ice! Teap: (0), temp 3 ) 1 avrsava else } 17 roars IF (temp ce 32) ) 17 xeursva ain ) U1 aeesaia dass ) U1 amet namespace Nisu svi operatori jednaki Pogledaro li pajviedrugl iskas 4 u prinjerw 3-8, primjei emo vobisjeni pro ler. Ova ska i esti je i temperatura ednaka 32 14 (tem a= 32) Ujericima Ci C++ ovakaviskae mote biti opasan. Niskusm programe eto ume ‘sopra jelaket ote opera tradi tetera sae | 1 (temp = 32) “Tujepogresku tesko primijetiia takvim bise skazom temp pridrutiobro 32132 bise ratio kao veijednost iskaza pidrufivanja. Buduei da uy Ci C++ sve vjedosti koje isu nua istnie,iskaz $f bio bi stint. Tako bi se exp pridruilavijednost 32, bez obzira na to jel tenp izvorno tao cu vejednost il ne. Ovakve pogreske su priliéno {este Lako i je prevdjeti~ no ta2vojoiindenjerijezika CH su predvidjel! ‘UGE ose problem icken ak oar if prvatjn smo Roce vjedest Vjednst 3 oj je vail prievvanje nije Bolen vjednose ee eres vibednow tu Ct njednot 38 nese sfomath preworilu tue, Tako Mora Posrtha ia pimistena tila prevodr ole velicnpedak yodnesu a Co Sen cent dnorave irate plc pet bea weds Boolean vrijednosti. mm eae : 40 | PrayamianieGe Posie 3: Cane pogransingitaC# | Logika u primera 3-8 provjerava eli temperatura manjailjednaka 32°F. Ako je tako, ispisuje se upozorenje: A (te «+ 32) { conle.irsteLino "warning! Tee on 088"); Program zatim provjrava je li temperatura jednaka 32°F. Ako je, ispisuje se jedna poruka; ako nije, temperatura mora biti manja od 32°F i program ispisuje drugu pporuku Primijette da je drug iskaz if, ugnjeBden unutar prvog if, tako da je logika ia else ,buduei da je ustanovijeno kako je temperatura mania i jednaka 32°F ip tom nije ednaka 32°F, onda mora biti manja od 32°F* {saz switeh:alternativa ugijeddenim iskazima if Upnijetdeniiskazi if teSko se citaju, teSko ih je ispravno napisati iu njima ispraviti pogreske. Kada vam je doseupan Sirok raspon moguénost, iskaz switch predstavlja Giljiviju alternativu. Logika iskaza switch glasi ,odaberi cdgovarajuéu vrijednosti i djeluju skladu stim’, siteh (Seraz) case honstantaciera islar {shoe no ko se prelaet [default shoe] ) Kao Sto mozete primijett,izraz se, kao i kod iskaza if, stavlja unutar zagrada na ppotetku iskaza switch. Svaki sluta zahtijeva izraz konstante fj literal,simboligku onstantu it enumeraiu ‘Ako je sluéajzadovoljen, izvodi se iskar (il vie nj) povezan stim slutajem. Iza toga mora slijeditiiskaz na koji se prelazi. Obiéno se korsti break koji izvedbu premjesta invan iskaza sultch, Mote se kristi iskaz goto koji oznazava preskakanje do shede- eg shuéaja, kao to je prikazano w primjeru 3. Primer 3:9, Iskaz site region Using directives using systen; sing Systen-Collections.ceneric; Using Systen Texts endsegioh namespace SwitehStatenent ni class SuitehStatenent ( rin 39 hesitate) iti vid Me steing] gs) " yast int Democrat = 0; Ste tnt esac Ss I epics ist In (eras = iti eae = Sant tnt Popetsive = 5 int choice - Libertarian; suiten (mychotce ) t cate denoerat: ConsoleswriteLine( “You voted Venocratic.\e" )5 breaks case Liberaltepublicen: //propada kror icongle.uritetice( {Liberal Republicans vote Republican); ase Republican Console. MriteLine( “You vated Republican-\s" )5 break; case Keneft “ConsaleteSteLine( “Mosteft is ow Progressive” goto case Progressive; case Progressive ‘onsale ritLing( “You vated Progressive.\" )s breaks case Libertarian ‘Console eiteLine( "Libertarians are voting Repblican™ ); goto case Repblicin; setae ConsolesriteLine( “Yau did net pick a valid choice.\a" break; ) onze. iteLine( “Thank you for voting , ) {Uovom primer pravimo konstante za razlitiepolitgke stranke.Varjablimchoice pikdrulue se edna vijednose (Libertarian) program se prebacuje na wu vrjednost. ‘Ako jemyChoicejednaka vrijednosti Democrat, ispisue se iskaz. Primijetic te da ova) sluta) zavrava s break. break eiskaz 2a preskakanje hojim se iz skaze such prebae ‘cujemo na prvi sededi red koji spisuje ,Thank you for voting” 2] Prograiajece Pose :OnoepopaesegialaG | 8 Napomena za V8 programere: ckvivalent Ci iskazaeu\tehje VBG iske2 Select Case. Takoder 2a tahlkw od VBS kaj vam doputta restranie ‘ijelogcaspona vijednosts pomocu jednogiskaza Cos, C# sintaksa £2 dopuSta, Shedeca dra isksza Case su sintaktkino ispravna ui VBS: (ase 50 to 50 “Tiskaci, medutim, iss vtjanis CU Cif motene estat samo inraz « jednom konstantom. Za testiranje cijelog respona morate 2asebno testratl svaku vijednost | .propasi” do 2ajednikog.bloka cae, Ispod vrijednosti LiberalRepublican nema iskaza i ta vrijednast propada do sljede- eq, slutaja: Republican, Ako je vrijednost LsberalRepubliican ili Republican, izvode se iskazi Republican. Ovakvo je propadanje moguce samo ako iskez nema tijelo, Ako izvuéete iz komentara kriteline() iz LiberalRepublican, program se neée prevest. ‘ie mopude, oxy ake ik cave nije prazan. Stoga, modetenapisai J sjedoce slugs 12 1/ propadanje je woguce slueas 2: (aed Nopomena zt C1 C+ progamer: ropadaje do eet sas Uovom primjer suas 2 je prazan. Ne motete, medutim, napist: Shutaj rekatkes 30005 7 propadanje nie moguce sua ‘Qudje unutar s1vé33 4 postal iskaz i propadanje nije moguée. Ako elite da siveaj 2 propadne do slice} 2, mora izxeta uporsiebit pete sluts} Hekate a); soto 15ka2 2; 1/ espLicttno propacanfe stueas 2: Ako vam je porteban iskaz, ali ita toga fl oto, kao Sto je prikazano usluéaju NeuLeFt: i2vesti drugi sluts), mobeve kort ickaz oto case Progressive; Iskaz goto vas ne mora prebaciti na prvi sljedeti sluta}. U sljedeéoj instanci izbor Libertarian takoder sade goto, ali njime se ova} pur pecbacuje nazad sve do sluéaja Republican, Buduei da je naSa vrijednost postavljena na Libertarian, dogada se upravo ovo. Ispige Se iskaz Libertarian, dolazi do prebacivanja ra sluéaj Republican, ispisuje seta iskaz, zatim se dolazi do break, Sto nas prebacuje iavan saltch sve do poslednjeg iskaza, Ilaz svega ovog je: Liertartans are voting Republican ‘You voted Republican, Thank you for voting. 4 | Progamianjece Cbratite pa¥nju na uvjet default iz primera 3-9; defott: ‘onsale tel ine( "You did not pick a valid choice. \n"); ‘Ako ni jedan od sluéajeva ne odgovata, pozvat ée se sluéaj default koji ée korisnika ‘upazoritina pogresku, Iskazsiteh nizovi U prethodnom primjeru vrijednost prebacivanja bila je integralna konstanta. C# peda moguénost prebacivanja na string, to dopusea da napisete: case “ibertartan”: ‘Ako se nizovi podudaraja, vlaz sew iskan case. Hteracijskiiskazi CH nudi Sirok raspon iteracijskih iskaza, ukljuzujuci peje for, while i do...shile te petlie foreach (nove » C jexicima, no vee poznate VB peogramerima). Uz to, C# pode: {Java iskaze 2a preskakanje goto, break, cnt nue i return, Iskaz goto {skez goto ie izvor iz kojeg porjetu svi ostali iceracijski iskazi. Na 2alost, radi se 0 sjemenu iz Kojeg je potekao ,Spageri kod’ i beskonatna zbunjenost. Najiskustiji pro- grameri vjerojatno se jeZe od iskaza goto, ali kako ne bisteostalineinformirani, evo keako se on koristi 1, Stworite oznaleu, 2, Odere na tu oznak, Oznaka je idenvifikator iz kojeg siedi dvotocka. Naredba goto obitno se povezuies ‘uyjetom, kao Sto je prikazano u primmjeru 3-10. Prinjer 320, Upotrba iskazs geno region Using directives sing System; Using Systen- Collections. cener ic; ‘sng Stentor feeregion ranespace Using 86 Usinglato rl sate void Main( string) ares ) Fogo: Osor popamstgjeiaCs | 45 rinjer 3-10, Upoteba iskaza goto (nastaval) c ant b= 0; repeat 11 oars ConsolesuriteLine( “4° (0¥", 4 5 4 ic) goto repent; // 2odjelo , ? Kad biste pokusali nacrati jek konteole u program u kojem se desto koriste iskazi goto, ezutat, brojne ukriZeneipreklopliene inj, vjerojatno bi vas podsjetio na tanjur pun Spageta. Otude i potjege nazi ,Spageti kod". Tae fenomen doveo do nastanka llternativnih rjeSenja, poput peije while. Mogi programeri drie da se goto treba Korstti samo u najjednostavnijim problemima, w suprotnom je natal kod iznimno abunjujuitetak za odr2avanje Petia while Semantika pete while je ,dok je ovaj uvjet istnie, bavi taj posao™. Sintaksa je: hile (i232) iskaz {raz je, kav tinate, bilo kof iskaz koji vrata veijednost. Iskazi while zaijevajyiaraz Kei odgovara Boolean vijednost (true/false), a takav iskaz moze naravno biti lok iskaza. Primjer 3-11 adurira primjer 3-30 upottebom petlie wie. Prinjer 3-11. Uporeba pete while region Using directives sing system; Using Systen-colections. Generic; tring Systen-Text senaregion sasospace Whieoop clas seloop 7 ‘static void Hain( stringl] args ) reise wine (eae) ‘ ee wi 0", 2 1 rinjer 31. Upotreba pete while (rastavek) on ) } Kodiz primera 3-11 daje ientiéne rezultate kao kod iz primjera 3-10, ali je njegova Jogika neSeojasnija,Iskaz while je jednostavan i Kompletan, a ima znacenje .dok je i rmanje od 10, spisuj ova poruku i poveéavaj Peimjetit ete da peta while testira vilednost i prj ulaska u pet. Time se osigu- rava da se peta nefe pokrenut akoje strani uvjet necotan, toga, ako sei inci pira 13, peta se uopée nese pokeenut Petia do..while Iskazvhile se moda vopée nece izvesti ako testirani uvjet bude neistinit. Ako delice cosigueati dase iskaz izvede barem jednom, korstte petlju do. while! so Sskaz while Garae erozje bilo koji iskaz koji vraéa vijednost. U primjeru 3-12 prikazana je petja do. while, rimjer 312, Pela da. while region Using directives sing System; ning ystenCaldection. Generic: Sing Systen Text serdregion roespace Dahle t class ove tthe fn sta os) ant $= a5, ® 0 Cansobectrstetine( “4: (0), 495 fot Dubie (1 €30 5 Oveje sed imicijalizica s 12 i test wile neve uspjet, ali cek nakon Sto se tijelo perlje jednom izvede. 46 | Proamianece Peale: Osnorepogansag enka | 47 Petia for ‘Ako pazlivo pogledate petlju whe u primjeru 3-11, primjeti ete uzorak kojise esto ‘mode sustesti u iterativnim iskazima: inicijalizacija varijable (4 = 0), restranje varja ble @ ¢ 0), iavodenje niza iskaza i povecavanje varijable (iss). Perla for omogucava kombiniranje tih koraka i jedan iskaz petle: for ({inichjalizators); [42102]; [iteratori]) 39108 Petia for prikazana je u primjeru 3-13, Prinjer 313, Petia for repo Using directives using Syston: sing SystenColections. Generic; sing Syston Texts endregion anespace Fortoop class Fortoop ‘ static void Main stringl] args.) for (int i 2 0; 4 € 100; for ) Console irite( "(0)", 4 i (ieee) 7 Console.triteLine( "\t{o}*, i); ) , ) Ila: 12345679910 10 1112 13 24 35 26 17 18 19 20 20 HD 425 2781930 30 5132 93-04 35 36 37 98 39.4040 HQGME TBO D 0 51-52 93 54 5556 57 58 59 60 6 61 62 63 64 65 66 67 68.69 70 70 11:72 73:24 75 76 77 18-79 80 80 81 82 83-84 85 6 87 88 89 99 90 91 92 53.94 95 96 97 98 | Progamiajece ‘ova petla korst operator modulo (engl. modulus) koji je opisan kasnije u ovom pogla Aju, Mrijednosr {se ispsuje sve dok nije viSekratnik od 20, (iki 0) avr se spsuetabultor, za nega veijednos, Stoga su destice (20,30, 40 itd) ispisane wz dest rub ialaza, $8) napomena 2a VB programas» A seve i pee ela “28 amar ole shoe fri oes ae re pee thers o [gp ca ee ere neta Tie enc oa tes * evan pete. Ise foreacs dealin je objasnjenu poglavly Pojedinaéne vrijednosti se ispisuju s pomoeu Console.Write() koja je sna Write- Line(), al ne unosi znak 2a novi red, Sto dopusta nastavak ispisa u istom redu, ‘Trebaistaknutinekolikostvari: upetli for uvjet se testia pif iavoden iskaza toga se uu primera i nijaliira kao 0, atim se provjerava je li manjeod 100. Buduct da je iskaz i ¢ 100 toéan, i2vodi se iskaz unvtar petlje for. Nakon izvodenja {se povelava (4+). Upameite da je doseg varjable 1 unutar petlje for (to jest, varijtha je viliva samo ‘unutar petle for) Primer 3-14 se nece prevesi Primjer 3-14, Doseevariabl deblaritaih unutar pte for ‘region sing dectives using Syste: Ueing Systen. Collections. Generics ‘ing Syston Texts endregion ranesgace rortoopScope class rorloepscope ‘ static vod Min( string) args ) ‘ for (int 1 0; 4 ¢ 100; to) Console serie "{o) *, 6 5 i (ikaw) { Console iritetine( "\e{0)", £95 ) ? ConsolesriteLine( “Wn Final valoe ofS: (@)") £5 Peale: Osner pogamlogjertaGt | 48 nije dostupna ivan dosega pete for. Podebljani red se ne mote prevesi jer varijabla | Bijeli prostor i viti¢aste zagrade Upoueba blog prostora uprogramiranjyplinojekontroverzn, Na primes vase pela for | © cysate. weiter ine( M0}, Di , ) mote zapisat s vide razmaka imedu operators for (Ant i = 0; 1.61005 +) (itweo) ‘ console ciriteLine("&(0}", is > > Upoteebabelin veéinom estar osobnog ukusa. Visual Studio 2005 omogucava da korittene bijelog prostora konfigurirate odabirom opcje Tools ~ Options ~» C# + Formatting» Spacing. Iskaz foreach Iskaz foreach je novina u porodici C jezika, On se koristza petle kroz elemente pola ili kolekcije. Ova) iznimno koristan iskaz detalije Cemo obradti u poglaviju 9 Iskaz continue break Ponekad se morate vrai na potetak pele bez izvodenia preostalih iskaza u pel. Tokar continue uzrokje preskakanje preostalih korakau peti Druga strana medalje je mogucnost napustanja pelle izravnog zavrSavanja svih ost lih zadataka u petlj, Za tu se srl korist iskaz break a c ialane totke i moe rezulirath raavane, Korsite th pachvo, break i contiave stvaraju vigest slotenim kodom koji jerezaeza 1 pritmjeru 3-15 prikazana je mehanikaiskaza continue i break, Ova Kod mje pred- lofio jedan od mojih recenzenata, Donald Xie, asluZirazvoju sustava prometne sighs lizacje Signal se simuliraju unasom brojeva i velikih slova s pomocu tipkovnice ‘upotrebom Console.Readl ine() koja dita tekstas tipkovnice. _Algoritarn je jednostavan: primitak nule znati normalne uvjete i dalnjeakcije nist rebne, osim 2a biljeBenje dogadaja (u tom sluéaju program jednostavno ispiswle ukt tia Konzoli, stvarna aplikacja mogla bi u bazu podataka uni zapis ve Frenskom cznakor). Po primi signala za prekid (simula ga slovo ¥A") problem se bile i proces se prekida, Na kraju, 2a bilo Koji dragi dogada) pokrece se alarm, koji ‘ota obavjeStava policy (ovaj primyjer ae obavjeStava policy, ali ispisuje poruku za uzbunu na konzoli). Ako je signal .X", pokreée se alarm, ali se prekida i petlja while. Prime 5-15, Upoteba skaga contieueHbreak region Using directives using Systens hing Syston. Collections Generic; ising Syston Tet sevasegion ronespace Coninucbreak class Cortirvesreak state void main( string) args ) { string sigoal = 0") while ( signal be") c Cansolecirite( "Enter a signal: * )s ‘Hgral = Console, Reset ine(}s 1) Inicializita s nevtralnin stan 1) koinatava saustalyonse 11 bara wok posse, nena veze 17 kote signal prin} jen Cowsale.ariteLine( “Received: (of, signal ); 16 ( signal ==) { 1 Pegresno ~ prekida ebrads sigrala 1 biljethproblen 1 prekia. (Console hriteLine( “Fault! Abort\" )s breaks d 46 ( signal c 11 toma stanje 11 biljeds & natavlsa. Congole-mesteLine( “AED As veLLAn" J; canting; ? 0) 1) Probles. Pessina akctju 1 ratle bitjeX protien 50 | Pegramiare Rendern nto esl orepogrnstogjeataG# | 51 rijey 3:1. Upotrebaiskaza continue break (nastava 17 soon toga rasta, Consolecketetine("(0) ~ sos alarn\e", sian) ); } 17 kaa} sie 4} ) pa} ais dT kee} dans ) 1 kaa} espace Svtha ove vjedbe je pokazati kako se prilikom primanja signalai2vodi aka wiskeza 4 iaatim program iclazt iz pele bee pokretanja lara. Kade signal, alarm tako der ne treba pokenutite program nastavha va poéetku petle Operatori Operator je simbol koji uzrokuje da C# pokrene aki. Primitivni tipovi (apr. int) podréavaju razne operatore kao Sto su pridruZivanje, poveéavanje i tako dalje. Operator pridruzivanja Uranijem ode ku ovog pola, 1x2, prikszana je uporebaoperaora ri ‘anja. Org simbol uzrokife promjent viednost operands Ujeve strane opertora \etednos oj e nals dane Sra operator, Matematitki operatori UC# koristi se pet matematidkih operatora: Zetiri za standardne izragune i peti za vra- éanje ostatka pr debe celobrojnevtijednost. Upottebo tih operator obainjena jeu sjedecim odin Jednostavni aritmeticki operator (+, -,*:/) (C# nudi operatore za jednostavne aritmeri¢ke operacije: zbrajanje (+), oduzimanje ©, mnodenje * i dijeljenje (/), Oni funkcionsraju na ofekivani natin, uz moguey ianimku pri dijljenju cjelobrojnih vrijednosti s mulom, Prilikom dileljenja jedne celobrojne vrijednostis drugom, C# dijli poput uéenika w etvrtom razredu osnovne Bkole: odbacuje decimalni ostatak. Stoga, 17 podijeljeno sa 4 vraéa vrijednost 4 (17/44, uz osttak 1). C# ima poseban operator modulo (ajije opisan u sledecem odjeljku) 2a vraéanje ostatka. (C# vinéa decimalne veijednost prlikom dijeljenja brojeva s pomitnim zarezom, bro~ jeva s dvostrukom precizno8éu i decimaine bijeve, Operator modulo (94) za vraganje ostataka Za vraéanje ostatka pu dielenju cielih brojeva koristte operator modulo @). Na priv rmjer, iskaz 17%4 veaéa 1 (ostatak nakon dijeljenjacjehih brojeva). (operator modulo mnogo je Korisniji nego Sto se ro na prvi pogled éini. Kada wporwije- bie modulo n na broju koji fe viekrarnik od n,rezulta je 0. Stoga je 80810 = 0 jer je ‘80 jelobrojni visekratnik od 10. Ta Enjenica omogucava postavljanje pet w kojima se akcia primjenjuje svaki n- put, escirajudi na brojat je li Ra jednnako 0. Ova je strategija korisna za petlju for, kao to je opisano rani ovom poghavio. Uxjecs die Ijenja na cijele brojeve, brojeve s pomignim zarezom, brojeve dvosteuke preciznost i decienalne brojeve prikazan jeu primjeru 3-16, Primjer 3-16, Dijelleni ‘operator modulo ‘retin Using directives esing Syston ting System Col2ections, Generics sing Syston Test; tendregion ravespace Divisiontodulas class Divisontodulas ‘ static void Main( striet] args fine ia, 25 float fa, 5 aouble 6, ds (ecinal dec, deca; asi aoa aoa anu deck » 175 eee = 4; Consahesriteine( “Toteger-\(o) float:ve\t(0)", 0/2, f.7 2p Console briteLine( "double: \evje) agecimak t(8)", at Fd, det / deez ); CconsalesMriteLine( “wodslus:\#0)", 45 8 42 Di ) ) ) Pogledajmo sliedeti red iz primjera 3-16: angle NeSteLe( “Inteper-\() nfloats\t\t(a}e", saris, #8709); ‘On potinje pozivanjem Console. WriteLine() i proslieduje sjededi neporpuni nie: Trop ole: OorememstayeitaGh (53 integer \t{0)\" oe ispisati znakove Integer, zatien tabulator (8), prvi parametar({0)) nak za novi ted (\n). Sljedeéi odlomak niza Alstt\eta}\0 ‘oj litan, On ispisue oats, zatim dra tabulatora (radi osiguravanjaporavnans), Teds) drugog parametra ((3) | ponovno znak 2a novi red, Obrattepaznju ina she deci red: console Mritetine("\ntaduluse\t(0)", 12812); Ova} put niz potinje 2nakom za novi red, Sto uzrokuje preskakanje reda todno prije ispisa niza Modulus: Operatori za uveéavanje i umanjivanje abitajensahjevu programiranu je dodavane vedo varabl, oduaimanie vt Jepcotod vanjble nek droga promsjena roan vednos te pridruivanje nove seat) variubls Mozda cte ak ela rebat dodat sasvim drug} vai TIT su sitajew opsaniw sljedeéadva ode. Operatoriza zrazuni ponovnu dodjelu Pretpostavimo kako varjablu aySalary Zelite weéati 2a 5 000. To mozete wéiiti ako napiete: nysalary = nySalary + $0005 Dodavanie se provodi pri pridrudivanja i ponovno pridrutivanje rezulata izvorno| varijbli u porpunosti je dopusteno, Dakle, nakon Sto se ova operacijai2vede, vried vhost aysalary bit ée uveéana 2a 5 000, Ovu vistu pridruaivanja mozete Kombinirati sa vitn matemati¢kim operatorima yselary = nySalary * 5000; rysolary = aySlary ~ $000; itako dali Potreba 2a uvecavanjem i umanjivanjem varijbiije toliko desta da CH sacri poscbne ‘operatore 2a automatsko pridrutivanje. U te se operatore ubrajaju ty 7, /= 1% ke ombiniraju zbrajanje, oduzimanje, mnoZenje, dijeljenje i modulo s automatskim pr- drudivanjem, Stoga prethodne primjere mozete napisati i na sljedeei naéin: sysalary mysalacy tmsalary -+ S000; Time se aySalary uveéava za 5000, mnodi s 5 000 od variable nySs}ary se oduzima 5000. 54 | Prgamicniect suducida je weeavanje i umanjivanje vrijednost 2a 1 wlogestapotreba, Ci (kao iC {ima idva posebna operatora. Za uveéavanje vijdnost 2a 1 koristite operator ipa za umanjivanje vijednost za jedan koristite operator ~ ‘cogs, ako vaijublamyige Fete uveéati 2a I, motetenapisat sone Operator prefiksaisufiksa Kako bistedodatno zakompliirali stati, variabla mofete uveéatirezulta dod rage’ vaio " farsiale «secon; sad se posta pitanje Zeke Ii pridrutivanje pie wvecavana vijednos ii ctavanja veijednost ili nakon nega? Drugim rijeéima, ako secandValue podinjesveijednost 30, Zlite lida na kraja j frstValue | secondvalue imaju vrijednost 31 ili elite da frstvalue ima vrjednost 1 {potetna veijednost), a da secondValue ima vejednast 12? " ° Gi (baS kao i Ci C+ mudi dij vate operatra xa wed ska i Ci weéavanje i umanjivanje: prefix ii sufix. Stoga mozete napisati: tive: ef fastyalue + secondvsuevss 17 Sufiks 4 Ce ptvo izvestipridrutivanje, a zatim uvecanje (irstVals Modete napisat i 10, secondvalue-1). instValoe = vsecondvalue; // Prefiks 2). Vaino je cazumjetirazitite utinke oj i ova dva operatora koji su prikazani u primjeru i Ps P prim $o ¢e prvo izvesti uveéavanje, a zatim pridrutivane (rst¥aluests, secondValt Prinjer 3.17, Uvecavanespomocu operator pref i supe trogion Using diectives sing system; ing Syston cllecticns.ceneric; sng Spsten Texts erreion sanespace Prefisfostftx © cle Peefiosttix ate vo i sto) ts) sant valucone « 205 Sat valuelwos ‘alueTno = valueoreess Consolesritetine( "After ostfin: (Ob, (2)", valine, valueTae 5 Pee: rier 3-17, Uvedavanies pomocu operatora preci sufx nastavak) valucohe = 285 valueTwo = s#valuetre: CorsoleshriteLine( "After prefix: (0), {43", valueOne, valuelwo 3; ) ? Relacijski operatori Relais se operator krista usporedbu die vijednosii raja Boolean vied nost (istinito ili neistinito). Operator vece od (>)vraéa istinitu vrijednost ako je vrijed- nests ijeve strane operatora veta od vriednost s desne strane, toga 52 waa tue spswiata false Relais operator jeika C#prikazani su u abc 23. Ona petpostala dij var jable: biglalue i snaliValue, gj bgvalue ima vriednost 100, 2 sal Valuevrjednost vo. Tablica 3-3. Relacishi operator jeika C# (retpostavija se da je bsgVelue = 100 iy bar Wiednasistaa ea bigvalue «+ 100 tne bigyalue = 80 false peta bigvalue I= 200 alse bigialue |= 80 true weed > bigvalue > smallvalue tne Weéelipdnte > bigvalue >= smallvalue true swollvalue >= biglalue false Mio < Digvalue « smllvalue false Mayen Walue < bsqvelue true Bigvalue <- snollvalue false Relaciski operatori funkcionraju na uobitsjeni natin. Medutim, obratite pakaju na operator jednakosti (=) koji se pfesdva uzastopna 2naka jednako (=) (j-izmedu nh ‘ne mie biti razmaka). C# prevocltel tj par 2nakovs tetra kao jedan operator. Operator jednakostjezika Ci (++) testra jednakost objekata s obje strane operatora (On vraéa Boolean vrijednost (true ili false) pa iskaz: mms; vraéa vejednost true ako i samo ako varijabla ayX ima vrijednost 5 a (ME | Seater prdeutivana () se Cestomiteés operatorom ednakos¢ rug se sastoji od diva znakajednakort a pried samo ince 4 ae Upotreba logizkih operatora s uvjetima Istasi i (objaSnjeni rane u ovom poglavlu) testirajuistintost uvjeta, Cestoéetete- bat testa jesul cha od dva wet stn, jeliiiniesamo lor east ee Aza to ml sap lgikih operator jv prikaan’w bie 3:1, Uae colt priptavene su dvi vatabl, xy, odoin vedas say vjeane Talia 3-4. Logic operator jecita CH (pretpostaviase da je ay=7) Operator ae iednattaa 1 co =D false ut Gm the x ' Ia) true Operator I testrajesu li obaiskaza istinita. Prvi ted u tablici 3-4 sad prmjer koji prikazuje upotrebu operatora I pane 5) 88 Gy = 7) (Gel je izraz neistinicjer je meistinita jedna st o na be == 3). Kod operatora Itt jena il je strane moraju bit istinite. raz je neistinit samo ako su obje strane neisinite.Stoge, u shigaju primera iz tablice 3-4 = GoD el je iarazistinie jer je istinita jedna strana . Kod operatora not iskaz je istinit ako je iraz nestinit i obenuto. Dakle, unavedenom primera: Seen) ilar iin jer teva are Ge) ein gags: ina jd isting da je x jednako 3"). sees feces Prednost operatora Prevoditej mora znati kojim se redosliedom procjenjuje niz operatoa, ‘jet, napitemo: Cth te WWariable = 567 #3; revoditel treba procijeniti tri operatora (,¢),P 1), Proejena mode, na primer is lijeva eden, ime bse vijednat 5 dodijel arab arabe satn bree) seca 55 (12), Sto bi se onda pomnofilo s 3 (36) -no tabi se vijednostzatim odbacla To oto nije pravi nan. 1 Pema Posave3Osnove programstogjexitaGt | 57 Pravila prednosti prevoditeju govore koje operatore treba prvo procieniti. Kao Sto Je to sla iw algebri, maozenje ima prednostispred zbrajaia, stoga je 5*7"3 jed- nako 26, a ne 36. 1 zbrajanje i mnodenje imaju prednost pred pridruzivanjem pa ée prevoditel prvo rijesiti matematiku, a tek nakon toga rezultat (26) pridewtiti vacijabh mWariable. Zapromjenu redoslijeda operacija seu C#,kaoi u algebri,koriste zagrade. Stogarezul- tar motete promijeiti ako napisete: aylaiabe» (517) * 3: lzravna procjena Pogledajmo sljedeéi odlomak koda: int » = 3; AF (eee 8) HG = 2) COvdje naveden iskaz if pomalo je slo#en. Ciel ska if nalazi se unutar 2aprada, kao | sv iskari Fw jesiku CH Stoga, ca bi iskaz if bio istiit, sve untarvanskih 2agrada mora bit istnito. UUnutar vanskih zageada nalaze se dva iskaza (+8) j(yee22), koji su odvojenioperato- ror 111 ())- Budd’ doje x jedeaks 8, pvt iskaz Gr eistinit. Drug iskav (yeet2) ne treba se provjeravati jer za istinitost cijelog izraza nije bieno jelly jednako 12 Pogledajmo i ova) odlomak koda: int x= 8 if ((x = 5) a8 (yo 22)) Ponovna se drug iskaz ne mora provjeravati, Buduti da je prviskas neistnit,T mora imati vrijednostneistinito (oba proyjerene izaza moraju bit isinta kao bi iskaz T |, biotin. U ovakvim slutajevima, C# ée skratti provjeru. Drugo testranje se uopée nece provest Zhog ovakvog grupiranja elemenata pridrudivanja, preveditelj zbraja 57 7, eezukae ‘oz s 3 zatim dobijenu vijednost (36) dodjeljue vaijblinyVariable. Sazex prikaz prednosti operatora mozete pronatiu tablici 3-5 Tablica 3-5. Preduost operatora ateytin Sparta 7 tama 499 Fa) abe nes-neutypeot stag chcted uncheck Stadattee aan Seperate tote + Tie + tk <> 58 | Poamiane te tabla 5-5 Pechost operate (nastavek) Fras Set Jebus Lei Leds toot edo! ent ve Pra ‘nekim slfenim jednadabama meta Cte mora ugnizdzagende ako bine esigurlispravanredoshjed operacij. Petpostavimo da elite saznatikolikosekunedi ing biel agi svaog jute. pes eda oda srakog jut potrote 20 minute ws kava i 10 minute raj novine, Djeca na lenéarenje potrose 30 inate, ana svadu 10 mint, aa “ Exo 9g algoritma (Coon ireingcoFfee_ + simeatiginspaper * nuadits ) © Cvioaating* intgsig) *rethidee)) Soansteste Tako ova algortam funkcionita,teskogaje profit ; teSko ga je prottaiiispravno sastavti.Shededi natin ocgtenja meduvarijabl mnogo je ednostaviji ostedtytanilt = ainvinkingotfee + minkesdegrospapers vestedByAlalts « asteatyschaalt © mamas Sestedyfochtté = winbaling + intgugs sestedyAEids + sosteamyéaenid* nach een: sostedanily's wastedyslladilts » mstedyh ds fotalsecnds « stedyaniy * go) MAS: U drugom se primer korsti mnogo vi8e varjabli, ali je rj primer minogo lake prottat i razumieu te (najeazade od vega) u njemu ispraviti pogreske. Pilikom pre- Bledavanja ovog programa alatom za ispravjanje pogteSaka mozete lako wotiti medu vrijednost i proyjeritijesu li one ispravne, Ternari operator lo vedi operator aera jedan (ope atte) il aie. pst ‘van operator koji zahyjeva ti: ternatnl operator (@:) lvjetnt raz ? intent + ierarz bel operator proces uj ie (ira Kaira vijednostpa te), a2atim zivafzxazt ako je wvjetnieraz vratioistinit vrijednostilitzraz2 koje wagena nel, Fautt vednost. Logika je ,ako je ovo istinico, ini prvo, usyprotnon uc deugo Toje prikazano u peimyjeru 3-16 Pole sno wogramstgjaiae | 59 Primjer 3-18. Ternarni operator region Using directives using Syston ing. Sten. Collections. Generic; using Sten. Text; ferdragion ranespoce Termaryoperator cass Ternaryperator : ; static void Hoin( string] ares ) Oo soe {nt valet nt mawalue = valueOne > valueTuo ? valueOne © valveTuos Console-riteLine( “ValucOve: (0), valueTwo: {2}, mawalue: (2)*, ‘alueOne, valveTio, valve J; ) f li valueOne veée od val: Naredbe za pretprocesor U sviim dosad navedenim primjcrima prevodi ste celokupni program. Ponckad je medutim, potrebno prevesti samo dielove programa —na primer, ovisno otome lpr ate i pogreske ii prevodite finalni kod, Prije nego Sto je kod preveden, pokrece se drugi program koji se naziva pretprocesor i pipes program 2s prevde, Pretproceser powers posto kod posebne naredbe za pretprocesor koje wijek potinju znakom hestve (#). Ove naredbe omg ¢avaju zadavanje identifikatora i testiranje njihova postojanja. Definiranje identifikatora [Naredba define DEBUG definira identifikator pretprocesora DEBUG. Iako se druge direk- tiveza pretprocesor mogu nalazii bilo gdje urutar kod, identifikator se moraju def nirati prije svakog drugog koda, ukljueuju iskaze using @ | Pregramianjece | Napomena za Ci C+ programer: CH pretprocesor prinjejuje samo [= 1 p Progr retpracesor primjenj |, Podskup C+ pretprocesoraine podrdava makronaredec Modeteprovjeriti eli DEBUG definiran siskazom #46, Dakle, modetenapisati eine OEBUG Hs norman Kod na ka}s pretprocesor ne djeluje i oeeus 11a tojh ce biti Udjugen u ublanjanje popretaa reise 1 kod kofh ee biti ukdjucen ako se ne radi isprovjnje popretska tends 7 noarank ed a haji. pretprocesor ne djeluje Kad se pretprocesor pokrene, vidjetée iskaz Adefine i zabiljtitiidentfikator DEBUG Pretprocesor preskaze uobitajen C# kod i prosalazi blok #if— Helse ~ tend? Iskaz 14 provjerava postoi I identfikator DEBUG koji wistina posto i stoga se kod iamed #if else prevodi u program ~ali se kod izmedu tes tendit ne prevod ‘Ts sekod uopce ne pojaviye u sklopu ~ kao da ga wopée niste ni napisa Daiskaz 84 nije uspio to jest, da st tesial posto iidentifkator koji nije postoja0 ~ kod iamedu tif i else se ne bi prevodi, za razliku od koda izmedu tif i dendi Pretprocesor ne utjege na kod koji se ne nalaziizmedu #Sf/tedit ion s¢ prev program. Ponigtavanje definiranih identifikatora pelican identifkator mozete ponistiis pomoeu mundet.Pretprocesor prolai kroz kod od vrha prema dnu, stoga se identifikator defnira od iskaza #defne do iskaca undef ili do zaveSetka programa. Stoga, ako napisete ‘Metine oes iF enue 11 oa} ese kod prevests tena tune oeaus iF eu 11 005 kod se rege prevesti senate Div iskaz #1 €e uspjeti (DE2UG je definirano), ali drugi neée uspjet (definirano DEBUG ie ponistenc), Poglae 5: OnovepogramshegjerkaCe | ot #if, #elif, #else i #endif Za pretprocesor ne postojinaredba switch, ali naredbe #eli¢ i felse prutaju veka prilagodlivost. Naredba #elif omoguéava logiku ju suprotnom-ako" tj. .ako 0606 ‘onda prva akeja,u suprotnom ako TEST onda druga akeija, inate creéa aki" ‘if cae 11 preveds aj kod ako Je definiraro debug seit TT 711 prevoti ova Kod ako debug nije tefintrano 17 a1 fe eefinscone TEST eise 17 prevadt oa) tod ako nl DEBUG of TEST 17 nije deinitone senatt ‘Uovom primjeru pretprocesor prvo provjerava je li definiran identfikator DEBUG. Ako jest, prevoditée se kod izmedu #if i telif, a ostatak koda sve do #endi se nece pre- voit ‘Ako (i samo ako) identifikator DEBUG nije defniran, pretprocesor€e provjerit je lide. niran TEST. Presprocesor ée postojanje identifikatora TEST provjeriti samo ako DE6uG nije efiniran. Ako je Test definiran, prevodit € se kod izmedt direktiva #elif i else. ‘Ako se ustanovi kako ni TEST ni DEBUG nisu definirani, prevoditée se kod izmedu iskaza felse i endif. #region Naredba tregion polie teksta oznatava komentarom. Ona se u prvom redu upotte- bijava da bi se alatima kao Sto je Visual Studio INET omoguéilo izdvajanje odredenog dlijela koda i njegovo saZimanje u programu za uredivanje ako da se vidi samo naredbs ‘region i njen komentar. Kad, na primjer,piete Windows apikaciju (10 je objadnjeno u poglavljy 13), Visual Studio stvara podruéjeza kod koje upistiazvojn indenjer. Kad se podrufje pros ‘ono izgleda poput podrutja prikazanog na slici 33 (napomen: na slic je rai lakes snalazenja podrugjeistaknuto i oznateno detverokutom), “Motete vidjti podrutje oznaéeno naredbama fregicn i tendregion. Medutim, kad podratjesamete, vidjet cere samo komentar podrutja (Windows Fora Designer gene- rated code), kao So je prikazano na slici 3-4 Slka 5-3, rotirvanje podradjakoda u Visual Sadie t Slka 3-4, Sato podrutje hoda @ | Pegomiane Pale Ono pegranstgjedlacy | 6 POGLAVLJE 4 Klase i objekti U poglavlja 3 objasnili smo primitivne tipove koji su dio jezika C#, poput int, Long i char. Bit jeaika C# zapravo je mogucnost stvaranja novih, slozenih tipova koje defi. nira sam progeamer, a koji asno preslikavaju objekre od kojih se sascoji problem koi) pokusavate nisi Upravo je ova moguénost stvaranja novih tipova glavna karakteristika objekino orijen- tiranih jezika, Nove tipove u jeziku C# zadajete deklariranjem i definiranjem Klasa, Tipove mozete definirati i s pomocu sucelja (engl. interfaces), 30 je detalnije obj nnjeno u poglaviju 8. Instance klase nazivaju se objekti (engl. objects). Objekti se stva- :aju u memorii prilikom izvodenja programa. Razlika iemedu klase i objekta jednaka je razlic izmedu koncepta psa istvarnog psa koji vam modda sjedi kraj noge dok ovo titate. Definiciji ps2 ne mozere bacti Stap, 0 _modete utiniti samo s instancom, ‘clas Dog opisue kaki su ps: oni imaju svoju cetina, vsinu, bojuodiju, boju dlake, natavitako dalje. Karakterizrau ih i akejeKoje mogu izvest, na primjer, mogu esti hodati,ljatiispavai. Odredeni pas (npr. mo} pas Milo) ima odredenu tedinu (31 kg) i visina (55 er, boja ofiju (ern, ooju dkake Chun), aay (praviandeo) i cako dale. (On ima iste sposobnost kao svi psi (ako ont koji ga poznaju misle kako primajenjuje samo metodu jedenia. (Ogromna prednost klasa u cbjekino orijemtiranom programizanjs je da 2% 1 njima ‘osobine i sposobnosti entiteta uéahurene (engl. encapsulated) a jedinstvenoj, samo- stojnoj i samoodrZivojedinici koda. Kada, na primjer,Zelite sortirati sadr2aj instance ‘paclajéeg popsa, sama popisu kazete da se sortira. Kako ée wo utiniti nije bitno ~sye §to jebitno je da je sorviranje izvedeno. Uahurivanje,zajedno s polimorfizmom (eng. polyrorphisi) i nasledivanjem (engl. inheritance), je jedan od tri osnovna nagela ‘objektno orijentiranog progeamirania.. Stati programnerski vic kaze: ,Koliko je objektno orijentiranih programera potrebro da bise promijenila Zaculja? Odgovor: nijedan,Zaruljjednostavno kadete da se sama promijeni (drugi odgovor:nijedan, Microsoft je standard promijenio na mrak)*. {y ovom sit poglaviju opisane znatsjke jezika C## koje se koriste za zadavanje novih asa. Elementi klase -ponaSanja (engl. behaviors) i swojstva (engl. properties) ~2ajed- rake nazivaju lanovima klase (engl. class members). U ovorn poglavijuopisat éemo kako se metode koriste za definiranje ponaSanja klase i kako sestanje klase odriava u varjablaroa Clanicama (koje se festo nazivaju poja (engl fields). Pored toga, poglavlje sebavi i svojstvima koja razvojnim indenjerima izgledaju poput metods, 2 klijentima lase kao pola Definiranje klasa a definiranienovogtpaili klase prvo treba deklaritai, a zatim definiratpripadajude mnetode épolj. Klasa se deklaria s pomocu kijuzne rijet class. Poepuna sincaksa las {atrituts) (aod ittorpristap) cass Sdetstator [sana Eas (5813(@]] {tijere Kasey rit ss objanjeni u poplasla 8; modifkatortpristupa su obiainjen usjedadem xj (kao moddfkatorpeistupa klaseobitna se Kors kuna red publi) det ator je naziv klase koji unesete. Neobavezna osnovna klasa objaajena eu poglala 5, Defincje lanovs od koji se sastoji tijelo Kase pil se izmed viiastih zagrada ©. ie 8) Napomena za Ci Cr programere: u CH defines Klase ne zavriava AB da, totkom2are, no ako je tugsino dodate, program ose eedno pe: UGH se ve dogada unurar Has, Dosad, medutim, nismo intanciralinjednu inseancu las; to jest, nismo stvorlinijedan objekt. Koja je tazlika iemedu klase i instance te dase? Kako bismo edgovorili na to pitanje, krenut Cemo od razlke iamedu tipa int i varjable tipa int. MoZete, na primjer, napisati nt wyintoger = 53 no ne moBete napisati int «55 Veljednost se ne mode dodijelititipa. Cina se dodjljuje objektu koji pripada tom tipu (aovom sluéaju, varijablitipa nt), Prlikom dektarirarja nove klase programer definira svojtva svih abjekata kaj pina daju oj klasi, kao injihova ponaSanja, Na primjer,stvarae i okoliésprozorima trebat ete stvoriti standardne elemente prozora (u Windows programiranju oni se nazivaju ontroe (eng). controls) kako bist korisniku pojednostavliinterakeju saplikacjom, Jedna od zanimljvijh kontrola je padajuti popis koi prikazuje ni opcija i korisniku ‘omoguéava da odabere neke od niih. ole ase | 65 Padajuei popistimaju tuzititekarakceristike—na primje,visiny, tina, polo baju teksta, Programeri od padajuéih popisa obitno ofekaju | odredena ponaanja: oni se rmogu otvort, zatvort,soerai i tako dale Objektnoorjenttano programitanje dozvofava stvaranje novogtipa, ListBor,u kojem sa utahurene sve ove karakterstke i moguénost. Taka klasa kao Ganove mode imat ‘vatjble height, width, location itext_color te metode sort(), adi), renove() id Tipu Listtox ne motete dodieit podatke. Prvo morate stort objekt tog tipa, kao sledecem odlomics koda ListBox aston, Kad ste stvril instancu ListBox, njenim polima modere dodijlit podatke. Uainimo za primjer klasu Koja sluai 2a pracene i prikaz vremena, Unutarnje stanje klase mora moti prikazatitekuéu godinu, mesee, datum, sat, minuta i sekundh ‘Vjerojcno éete hyjeti da klasa veijemse prikazuje wrazlittim formatima. Takvu Kase maodeteimplementirati dfiniranjem jedne metode ist vaiabli, kao to je prikazano uprimyjeru 41 Prinjer 41, Jednostauna hlasa za prazivanj vremena region Using directives sng Systems sing SystenColections.Genecics sing System. Texts endregion sanespace Tinelass ¢ public class Tine 11 private varijable nt Months fn Date; int minstes Ant Second 11 ame wetote ppblic vod OisplaycurrentTine() ‘ongoe.urstelne( “stub for DisplayCurrentTine™ ppblic class Tester rine 4-1. Jednostavna Basa za prikacuanevremena(nastova) static void Mata) Tine t + nee Tine() {DisplaycurrentTine); Prillkom prevodeje ove Klse primi Exe ypozocejao tome dase ‘arinbledlaice Tine (ea, rit) kad ne korste Zsa apes Eff rea upozoreneGako upozorenja uglayaom nije dob sanemariati, tim ako nist porpuno siguen fem sera 8th ‘arid. U avr sgajuprovimo samo kor kas ine da ado Stvano| des, oe danove i loi u drug meta. Jedina metoda deklarirana unutar definicie klase Tim jeDisplayCurrentTine().Tijelo metode je definirano unutar definicije same klas. Za raliku od ostaih jezika (kao Bio je C+), C# ne zahtijeva da se metode deklariaju prije nego Sto se defniraju, ni podrdava stavjanje deklaracja i koda w ratte datoreke (u C# ne postoje datoteke zaglavlja). Sve metode jezilea C# defnirau seu kodu, kao Sto je prikazano u primer ‘£1 kod DisplayCorrentTine() Metoda DisplayCurrentTine() definirana je tako da vra¢a void (ona metodi koja ju pozove neée vrai vrijednost.Zasad je tielo ove metode izbrisano, Definiija klase Tine zavrsva deklaracijom nekoliko varijblilanica: Yea, Month, Date, Hour, Minute i Second, akon zatvorene zagrade defini se druga klasa, Tester. Ona sadréi veé poznatu metodu Main(). U metodi Main() je svorena instanca varjable Tine i njena je adresa dbodijeljena objektu t, Buduci da je ¢instanca vaijable Tine, Main() mode s objektima tog tipa iskorisit metodu DisplayCurrent*ine() i pozvatije ako bi se prikazalo vei- jee: *.isplaycurentTine); Modifikator pristupa Modifatorpristupazadse koje metode drugihklsa moguvidjet kort odredena varjabla il merodu unutarklase:U bli 4-1 motete vide! sazetak modlfkatora pristupaujecika CH 66 | Pogramiznjece Posie Maelo | 67 Tablica 4-1. Modifitatorpristupa Matpstups Opies pablic ena crane, Cane osmotic wal su stin tofana ih iiss petite nevina sets ean mnt private agp sanometodekise protected (laein bse ij sues maiiatoron protected mage print metee b ete on lst loesuizvedene tse Snternad ‘apnata ou canenlmeétoom internal mquptsptinetde sia realoaisen protectes Ctaovnae Abo suedesimodiflatoom protected interna magus fnteran seeded tases eedee ine Rede sh sa lesopalise 8 Ose FRusparprorecteat internal fe pst lweptpracecteg\anterna) ‘Clanove klase je potelina oznatiti modifikatorom private. To znaéi da njihovoj vr jednosti mogu pristupiti samo metode koje su élanice te Klase. Buduti da je private podrazumijevana razina pristupa, ne morate je eksplicitno navoditi, ali var prepo: rugujem da to ipak atinite, Dakle, deklaracije varjabl iz primjera 4-1 trebale su bic: napisane na sledeei naéin: 1 peivatne varsfoble private int Year Private int Months Private int Dates private int Hours Private int Minit; Private int Secon; Klasa Tester i metoda isplaycurrentTine() deklarirane su kao public kako bi ih rogle koristiti druge klase. Arqumenti metoda Metode mogu imati beskonaéan bro} parametara> Popis parametara alazi se iza naziva metode unucar zagrada, a ispred svakog parametza stojinjegov tip. Sliedegom se deklaracijom, ma pricaer, definica metoda MyHethod() koja vraca vrijednost void (Gj. ne vra¢a nikakvu vrijednost) i koja ima dva parametra: cjelobrojnu vrijednest | gumb, bea je progtamerske prakss arto anda dastupnostsvih metods { lanova klase.Iaka se moteteoslonii na injec da se sve klase prema zadanim postavkama deklarrau kao privat, jertito radavanje Dristupa eanataa syjesi adlulk olakéava pregled kod * Termin argument” i paramere” sto hoist a ty svar ink net programen nnn a ovaj detarale partmetra argutentprosjedenh elicom possvan toe, 6 | Progamianiece void Method (int FizstParan, Button secondParen) } Pararneti una ijela mecode funkcioniraju kao lokalne varijable, kao da st th dekla- riraliu ejelu metode ‘inijalizirali ih s proslijedenim vrjednostima. V primjeru 42 prikazan je natin prosledivanja vrijednosti u metodu ~ u ovom sluéaju radi se 0 Vr jednostima epa ink Haat, Primjer 4-2. Prosledivanjevrjeduostu SomeMethodl) engl Using dizectives sing System; sing Syston CoNectins. new Cl355(); ceSonenethod( hadtanyPeple, pi}; ) Metoda Sonetethod() prihvaca int ifoatiprikazujeth koristetiCensote.tiritel inet). Para ‘metrifirstParan i secondParan se tetiraju kao lokalne variable unutar Sonettethos), Napomena za VB6 programers: metode esika CH ne dopustaju deka nje dodanih argumenata, Umjest fogs za stvaranje metoda koje gh dcklarcajy deuge kombinacie argumenata mora Koristt pteoptere: at Seeaed > } public class Tester t static void taint) ( systen.Datetine cartentTine = Systen-oteTine Ao “hae ts cen ine( curtentTine eDispaycureentine(); ? , U ovom primjeru konstruktor prihvaéa objekt DateTine i inicjalizia sve pripadajuce varjable na temelju vejednosti unutar objekta. Kad konstruktor zavrsi, objelt Tine posto} i vnjednosti su inicjalizirane. Kad se w Main() pozove DisplayCurrentT ine), prikaza se vrijednost Pokus jedno od pridrusivanje i2dvoji u komentar i ponovno pokrenuti program. Vidjer cere kako je prevoditejvaijablu elanicu inicijaliziracw @.Clobrojne variable Alanice se pastarjgje oa 0 ako itn ne dodielte neku drugu vijednost. Upamtite inc jalizacja vrjednosnih tipova (npr. celobrojaih vrednost) se ne mote ponistt. Ako ne zadate Sto konstruktor treba ration ée pokusati utinti neSto bezazleno U primjeru 4-3 objekt DateTime je stvoren u metodi Maind Klase Tester. Ovaj objekt, koji daje biblioteka System, nudi nekoliko javnih veijednosti~ Year, Month, Day, Hour, Minute i Second ~ koje odgovarau privatnim varijablama objekta Time. Uz to, objet DateTime nudi i staticko svojstvo Now koje je referenca instance objekta DateTime in- cijaliiranog s trenurnim vremenom. Popledait istaknuti dio koda una Maint geje je objet DateTime stvoren pozivanm staitkog svojstva Now. Now stvara vrijednost DateTime koja seu avon sluéaju kopira uvarijblu curensTime na stop. \Vatijabla current Time se kao parametar prosleduje konstruktoru Time, Parametarkor- struktora Time, ds, je kopia objekta DateTime, 72 | Propamiajece Inidjalizatori Veijednosti varjabli lanica mogu se iniijaliziratiu incjalizatoru (engl incijalizatoru (engl. initializer) uumjesto u svakom konstruktoru, Inicjlizator mofetestworti pridrudivanjem potetne vrijednosti@lanu klase: ae private int Second = 305 // inicijelizstor Prposavno d je semantka nae objeta Tne av da be ocean pos ‘en me, skande unk inipaijune 30 Kad lsc borne nea tak dh Kort inalzatr, ber obs naw kaj Selamat pen ean second bi se wvek icine ehopcin spooca heneraie pom iniinzatos, Popedae pr 4 alt implicitno s U primera 4-4 kos se preqpuerecen (engl overloaded) konstrukor, 2 anati da postoje die inaicekonstruktoa koe se rzhkajs oo broj iow prametars Preopeeréeni konstruktoricealnjesu coe jen kasnijev ovom poglaljy. a Prinjer 9.4, Koritene iicijalizatora region Using directives sig Syste sing Systen, Collections Generic; sing Systen Text; searepion initializer puolic class Tine c 11 privatee vorijable clanice Private ine Yeors private {nt tenth; private nt Date, private int Hours peivate int ina peivate int Second = 30; /7 inieatizator 1 jaw netode 20 pristipinje pic etd Sinan) Systenstetine noe = Systen.Dateine. Now; Systen. Console brite ine "woeboants (0}7(4)/(2) ()2(4)265)", rotor, now03), toner, now lb, moma, now.Second Syren gta stein “it (11/0) 6 ron hte Yea, tar, Mats Sea) OMICS Peale Kaseiebjt | 73 Medutim, ako je Second dodijelena vrijednost, kao 3to je to utinjeno u konsteukrora kai prlvaca objekt DateTine, podebijan uw ispsu), ea Ge vrijedvost zamijeitinicija Tirana vrijednost. prilikom prvog pozivanja DisplayCurzentTine() pozivamo konstruktor koji prihvaca cbjeke ateTine, a sekunde se inicijaliziraj s 54. Prilikom drugog pozivanja poziva se rmexeca, i2titto postavamo viijeme na 12:45 (bez sekundi) i dalje preuzima inicije lizator. Primjer 4-4. Kenitenjenclaizatora(nastaval) 1 konstaeatort otic Tine( systen.oateTine &t ) ‘ Year = arteans ath » .senth Date = d.02ys ovr + etour inate = dt-Minute; salons dteseconds — /7ekspiiehino paidoutStanfe 1a u programu nije bilo inicijalizatora i da se 2a Second vrijednost nije dodielila na ‘neki druginadin, CLR bi vrijednostinicijalizirao so ) pubic Time int Year, int Mont, Hat Cate, nt Hour, int Rinate ) Napomena za C++ programere:w C# nema konstrvktors 2a kop ranje, pa se semantka Ropiranja posiseimplementacjom sugeli, Thode ‘ oer ones Sucelje ICloneable Sear INET kostr defnita sue Towable radi podrskekonceptkonstruktora 2 kop en as rane Gute su dealin obradenau poglav 8), Ovo sutce definirajedna edna mnetodu: Clone(). Klase koje podréavajy zamisao Konstruktra za kopitanecebale ) ‘Himplemersira YChoneable, x eatim implementa il lite kopla (pslvanie Hon perwselone) ii dubolea kop (npr. posivajci konstruktora za koprae i rueno panic auass ester kopirajuti sve clanove) sotic wld aint) clas Senet: Tomble etenateTine curtertTine « SystenDateTiae Ne public Object Clane() eT Tet corentine J, ? Uelptgerertine; | ho edi) 1 pt ‘Time £2 = new Tine( 2005, 14, 38, 14, 45) } Ueidhgeanentinets 7 Kijuéna rijeé this i jut jet this pokazuj a trenunu instancu objekta. Rlerenca ths ponekad se ) ‘Ako ne navedeteinicijalizator, konstruktor cjalizirati s mula (0). U navedenom prinjera, je 530: private int Second + 205. inttfallzator _Ako 2a Second ne bude prosiijedena vrjednos, viti a3: ine £2» new Tine(2005,12,18,22545)5 Crincaplytarsent Tine (5 naziva i pokazivaé this) je skrivena referenca koja se prosheduje vim metodama klase koje nisu statitke. Preko reference this svaka metoda moze reerirati drage metode i variable abjeka Referenca this koristise na razne nagine. Prvi je kealifikacijaflanova instance koji su nage skriveni parametrima, kao Sto je to sludajw sjedecem primjeru: svaku cjelobrojnu varjablu dlanicu in edutim,2lanica Second inicijalizirana ‘ona ée se prilikom stvaranja t2 posta + Pokuri sade ocean £9 nor haat gin se tina Ness pore ko use narhlnapatae saga ooo kate wc ; Pounce oki | 75 | Poseitanie ct t public void Sonetethod (int hour) ‘ this.hour = hours ) ‘Uovom primjeru SoneNethod() prihvaéa parametar (hour) sistim nazivom kakvog ima varijabla elanica klase. Referenca this se koristi 2a rjeSavanje viSeznaénosti naziva ‘this. hour referira varijablu ¢lanicu, a hour ceferita parametar. Unavedenim primjerima koriStene reference this snitinamjetu programera a da pritom ne tint nl éenia kode} je sino, ali mote dodatno poja ikakvu Stetu (osim moguéeg optere Koristenje statickih dlanova Clanovi klase(varijable, metode, dogadaii, indeksi itd ilistaticiélanovi. Clanoviinstance povezani sus insen novismatraj dielom ase. Stati¢kom dlam Slanu modete pristupitis pomotu naziva klase tskojo| je deklarian. Na primjer, pretpostavimo kako post klasa Sutton kale oe instanciraniobjeti te klasebtnlpdatei beaDelete-Pretpostavimo i kako Klar ator sma caickuGanicu Sonetethod(). 2a prisup saith} metodi nape button. Somatethod); Dobra strana ovakvog stilaje odabir dobrog naziva varijable koji se zatim korist 2a parametar i za varijablu tlanicu. Lota je strana korStenje istog naziva za parametar i varijablu dlanicu, Sto ponekad mofe biti zbunjujude Drugi natin upotrebe reference this je prosledivanje crenutnog objekta kao parametra ‘udrugu metodu. Na primjer: late myclase ‘ ) mogu biti il lanovi instance incama tipa, dok se statigk de public void Foo(OtherClass otherobject) ane { update. Soman otherObject-Bar(thi)s tmp Sonanet ha); ) UC# nije dopusten pristup stati¢koj metodi i varjablilaniei putem instance ito ée ) (Ova) primjer pottebno je pojasnisi. imamo metodu myClass.Foo. U tijelu metade poziva se metoda Gar instance OtherClass i prosljeduje joj se referenca do tekuce instance ayClass. To metodi Bar omogu¢ava rad s javnim metodama i élanovima tekuée instance nyClass. ‘Treéi natin upotrebe reference this jes indekserima, Sco je objaSnjeno u poglavli 9. seneirat pogreSku prevoditelia (C++ programeri pesehno pripaite naw) [Nek jesici prave razliku izmedu metoda klase | drugih (globalnih) m dosupre i2vankonteksa bil koje Klas. U CH ne eos eke tes to 8 metode klase, ali odgovarajuéi rezultat moves uunutarklase C# ne postoje globalne metode, samo © postii definiranjem statigkih metoda Cervrti nagin na koji se referenca this moze koristt je 2a porivanje jednog preoptere enog konstrukcora iz drugog, na primjer: class wyclass ‘ public aylass(int 2) { //e0. } Public ayClass() = this(42) (17...) Napomena za VB6 programer: juin et statieu C# statieu CF nije ito soi dy Heart sic B61 VB.NET. UVB kjutanjetsea ied sia varjablalojeedosupea samo meted ulojgeaaion ee Bi seta, alas Stic ne die sin er nee He i. svakainstana variable Static ta sve eg jlnos). Ova vara. bie, meduin, posta tekom ean programa esigeroorne a doped trae od jednog pose mete dudes UGE etna eet static ornare lan lst. Og ‘ijet u VB je Shared. ae U ovom primjeru podrazumijevani konstruktor s pomoéu kljugne sijeti this poaiva preoptereéeni konstruktor koji uzima cjelobrojnu veijednost. Naposlietku, kljugna rijeé this mote se koristti i za eksplicieno pozivanje metoda i lanova klase, kao oblik dokumentacije: bc void method (int y) ‘ Statice metode uglavnom djeluj jena nstancu objelta, Prednos statickih metoda pred glabslnim metodamna fede 11 prSatutuje Loalno$ varijeblé 11 pridruivje paranet this.a = 55/7 pridruuje meted: clanich ‘this.Oran(}; 77 porivanetodu Elonica ? 1 Kuo io rae navedeno, tet ‘ngancens gm Ra alse Riana foal Ra edanaoent one sa oie naeiene Fo ash cian he aren ates vaiabl kj eferiju na nemenovancnsiance na seth 76 | Pegomianie — Poses | 77 Us to, statigkim metodama se kao parametri mogu proslijeditiélanovi instance (i same mogu stvorititakve instance unutar staitke metode). Kako im doseg nije globa Tan, vee je ogranien na klasu, one imaju pristup privatnim Clanovima instance COdupritese eli da w programu napravite edu Kast ukoju ete sme Ag. situsve metode. To je moguee al nije preporutlivo i protv se naéla Ueahurvanje v objektno olentiranom programianju Pozivanje stati¢kih metoda ‘Metoda tain() je statigka, Kage se da statitke metode djelujuna klasu,a nena instancu Ielase. One nemaju referencu this jer ne postojiinstanca na koju treba pokazat re 4, ‘Napomena za Java programere: u C# nije dopuiteno pozivanje stati: AB 4, kh metoda toe vajable insane Statitke metode ne mogu izravno pristupiti Elanovima koji nisu statiki, Kako bi ‘metoda Main() pozvala mecodu Koja nije statigka, ona mota instancirati objekt, Pogle dajte ranije navedeni primer 4-2. SoneNethod() je nestaicka metoda MyClass. Kako bi Main) pristupila toj metodi, ona pprvo mora instancitati objekttipa MyClass i zatim pozvati metodu kroz taj objet. Koristenje statickih konstruktora ‘Ako klasa deklarira stattki konsruktor motete it sigur da Ge se on pokrenut pre scvaranja bilo koje instance ase” “Trenutak poketanja staickog konstruktora ne motete totno znati, hho to €e Se dogoditi nakon pokretanja programa i prilestvarania, prve instance. Zbog, toga se ne mote peetpostavii (itl wtvedit) da je [Na primer, klasi Tine iz primjera 4-4 mozete dodat siededt stati¢ki konstruktor: static Tine() ‘ ) Zapravo, CLR jum da Ge porn saith Konstrabtor pie bilo kakveoperaciesKlasom, Dale ema tae pobrnat evodene Konstukcors, anes dade Lert ngovoievodene. Mogude “Emil primer vkojem advise ovine jedna 9 drug), Unjesto da ude sijep lio, CLR mate ‘elrens Lorsrobire acim drcvama ko ds epunjamsto dae br 2apoce: evodenje kr Salter preilnim edoljedo 78 | Pogamiane Frimijetie ete kako ispredstatitkog konstruktors nema modifkatoraprstupa (np public). Korstenje modifikatora prstupa uz sttitke konstruktore nije dopusteno Fada, buduti dase radio statitko) metodidanci, ne mo2eteprstupt varablama dlanicatna koje nisu satgke pa se Nase mors deklarirai kao scaticka variable private static string Hone; roslednja promjena je dodavanje shledeveg reda u OisplayCurrentTine() fublic void DisployCurrentTine() a systen.Console.riteLine( "hare: (0), sane); syste Coote arti (0 (42) 0: , 5 oate, Year, Hour, Mite, Secon akon svih promjena, ilazjesljedeci: 34/1/2005 7:52:54 19/1872005 21:45:30, 16), (Va8 €ese ilaz razlikovati ovisno o datum i vremenu poketanja koda.) Isko ovaj kod funkcionita, swaranje staickog konstruktora nije obavezno 2a postiza rie ovog.cilja. Umjesto toga mozete koristitiineijalizacor: private static string tne Iejim se dobija iti rezultat. Statigki su konstruktori, medutim, Korisni za pripremu Ioja se ne moze post€iinicijalizatorom, a treba se izvesti samo jednom, [Naporena ea Java programere:u Cit se tatizi konseuktor korst ma oni mjestima na koja seu jezik Java Kors state inijalizaor. Pretpostavimo, na primjer da v starom DLL-t postoji dio neupravijivog koda. Za ta} kod Zelite napraviti omota® klase. Modete pozvati LoadLibrary u seatithom konstruk: toru i inicjalizirati tablicw preskakanja (engl. jump table) unutar statigkog konstruk- tora, Obtada starog koda i rad s neupravjvim kodom abjalnjen jeu poglavju 22. Stati¢ke klase U CH ne postoje globalne metode ili konstante. Moda éete morati stvarati male pomoéne klase tija je jedina svrha da sadrdavaju statitke élanove. Zanemarimo li Posliedice tog postupka, ako uistinu sevorice takvu klasu, trebat Cte izjeci stvara ‘je instanci. Klasu oznatite sa Static kako biste osigurali da se neée svoriti nijedna instanca klase. Staite su lace zapeEacene i singa sp ne magn stunt invedeni ripavi Elase static, Upamtite kako statithe klase ne moraju sadr2avati nestatigke Zlanove ili mati konstruktor Fostane Neb | 79 Koristenje statigkih polja Uobigajen nadin za prikaz upotrebe statigkih vaijabi tlanica je pragenje brojainstanci oj erenutno postje za Klasu, To je prkazano u primjeru 4-5 ini 45, Korie stati poli za roan stan Arepien sig ness sing Syston Sing ster colecon. ners Cy Sten oc tendepin samspace Stat iohields public class Cat ¢ private static int instanes = 6; pubic Gt() ‘ anstancests5 > public static void Hoatarycats() Console riteLine( "(o) cats adopted", Sstances ); ) ) public class Tester static void Main() t HettnyCats0); frisky = now €t()5 HetnyCatsQ)s at whiskers = new Cat()s Gat stanycateOs y ) ? Klasa Cat je svedena na najosnovnije elemente. Stvorena je staizka varijabla élanice Anstances i iniijalizirana je s 0. Ako pogledate primjer, vidjet ete kako se staticki ‘lan smatra dijelom klase, ane élanom instance te ga prevoditelj ne moze inicijlizi ati prilikom stvaranja instance. Stoga, ako Zelite incijaizirati statieki lan, morate sigurati eksplcitei inicijalizator, Prilikom stvaranja dodatnih instanci Cats (unutar konstruktora) broj se povetava. 0 | Prgramiraje Ct Podatke elanove nije dobro oznatt s pblic. To se odnosi ina staitke variable rice. Jeno je teSenje ozmatcistaxikog danas private, kgo Sto smo to maloprije Utils instances. Svorena je avis metoda HewtaryCats() koja omoguéava pristap ‘ovom privaenom lau, l Unistavanje objekata Bududi da C# osigurava sakupljanje otpada, objekte ne morate sami unistavati, Medu- tim, ako objekt kontrolira neupravjve eesurse, te resurse Cete moti eksplicitao oslo boditi ked vam vite nisu poteebni. Implicienu kontrolu neupravjvih resursa omogU- fava destruktor kojeg sakupljae otpada poziva kada je objekt unite. [Napomena ex Cs Ch-+ programere: destuktor se ne parva chuvexe rakon Sto objck izade i dosega, vee kad bude sakuphjen kao orpad (Go se moze dogodit mnogo kasi). To se nazivai nedeterminisiea finalizaca Desiruktor bi trebao osloboditi samo one resurse na koje se objekt oslanja ine bi ‘rebao referencirati druge objekte. Ako se radi samo o upravjvim referencama, ne tre bare, ine tise smjeli, implementirati destruktot: On je potteban samo za rukovanje neupravjvim resursima, Buduéi da koriStenje destruktora ima svoju ier, niegova implementacija se preporuéa samo u metodama u kojima je obavezan (tj metodama koje cose vrijedne neupraviiveresurse) Descruktor objekta se ne moze izravno poavati. To ée ueiniti sakupliat otpada, Kako destruktori funkcioniraju Salpj¢oxpada im pops obekaa ojlimajudestrukor, Taj se pops aria pri- likom svakog stvaranja ili unistavanja takvog objekta, Kad se objets pois sakup ao otpad, ons sta ced ajo dug obj vima oj kaj onfeavajeSakupaéetpada Ge nakon ivodena destrktora aka pit objet adurirat ed ao odgpvarajupopi objkata a unitvane G#destruktor Destruktor jezika C# sintaksithi naikuje C++ deseruktor, no ponaga se drugacile. CCH destruktor deklarirajte znakom rida, na sljedeéi natin: ycass(00) Fogovetse jae UC# ova sintaksa predstavija pregac 2a deklarairanje metode Finalize() koja se pove. zu sa svojom osnovior klasom. Stoga, ako napisete yclass() c 11 ebavhja poss0 ! C# prevoditeljée to prevesti kao: protected override void Finalize() i ty i 11 baja posse ) finally base-Finalize(); ’ Razlika izmedu unistavanja i odlaganja Eksplcino pozivane destruktora nije dopusteno. Destruktora Ge porvatisakupljt expada. Ako koriste vrjedne neupravane resutse(poput idenitiatora datotela) koe Selte Sto prije atvori i odlott, rebate implementa suzelje 10ssposable (ge osuéeima motetenautitu poglavju 8), Pilikom implementacje sel 0 sposable() ttebat obavezno defnirati metods Dispose() koja é obav at va vaina éiscenja. Dostupnost metode Bispose()klijentima omogucava da ade nanacely Ne eka} na pozvane destrultora, wet otis odmahe ‘Ako pruite metoduDispose() tebate sprit dasakupljaéotpada ponovedesrukor abjekta, To moder uni porivanjem merode Cc. Suppcessfinalize()prosjeduu pokazivaé this objekta. Destruktortada mode porvati metodu Dispose(). Mozete na Drinje, naps shedece: sing Syste lace Testing + 1Dlsposable t tool is disposed « false; protected virtial void Dispse(bool disposing) 46 (1is_sposed) 1/ Odlaze sano jednoet 36 (hsposing) c Console weteLine( * Vedi vemenanedte cat fro svar ase hoje ie 28 ta sneuprjivi resosi port SiroihWenikatora. Mofds Ete, medatin, kari laze orotate poput Flesteam ect ate ase ne implemenuajuIispssbe pa om slacaa cate ues implementa rspsate line finale MetodaBspoe dose suse kis aba slot parva Ospore 2 | Regaine ot 9 destructor, O€ to reference other ebjects"); 11 ‘vot CiStenje 29 ova§ abjekt onslesWaiteLineDisposseg75 ) thisis_Sisposed = true; ) public vod Dispose() Dsose( true): 11 bot sokip atu otpads ta ne Flnalinira (GSipressFinalize( this); ) restive) spose( false); Corbole steline("In destructor," ) ' Implementiranje metode Closet} Za neke objekte mofda éete radije omoguéiti klijentu da pozove metodu Close(). Na prj, ta metoda vjerojaino ima vse smisla za objekte datoteka nego metoda Ds pose), Metod Close() mofeteimplementiatstvaranjem privatne metode Dispose) Fave metode Close() koja ete napsai tak da pocivaDispose() Iskaz using Kako bi Kien lake ispravno odiodil objekte, u Cit je dostupan iskaz using koji os: gurava najranije moguée pozivanje metode Dispose(). Trebate deklarirai objekte koje Jeoristie i zatim napraviti doseg za njih s pomocu viti¢astih zagrada. Kada se dosegne 2atvorena vitifasta zagrada automatski ée se pozvati metoda Dispose() 2a objekt, kao $o je prikazano u primjeru 4-6, Prinjer 4-6, skae using region Using directives usteg system; Using Syten:ColLectiens.Ceneri; sing Systen Drawings sing Sten, Texts, tesaregion anespace usingstatenant class Tester Pogue cteiobett |e Prnjer 46, Iskax using (nastavak) public static vold ain() using ( font thefont « new Font( "trial", 10.0F ) ) 11 katisththefont ) 11 prevoditelj ge posvatt Oispose na thefont Fant atotherFont = new Fant( "Courier", 42.0 ); using ( anethertont ) 11 kotsstt anathrront ) 17 prevostel) poeive Ofspase na anotherfont ) y U prvom dijelu ovog primjera objekt Font je stvoren unutar iskaza using. Kad iskaz using zavrSi, za objet Font pozvat e se metoda Dispose() ‘Udrugom dijeluprimjera objektFont je stvorenzvan skazaus ng Kada odlutimo upo tnjebit upravo to pismo staljamo ga unutatiskaza using, Kad iskaz zavrSi, ponovno se pouiva Disposed) Drugi je pristup pilino opasan. Ako se i2baciiznimka nakon stvaranja objekta, no ptije potetka bloka using, objekt se ne¢e odio. Drugo, vaiabla ostje u dosegui nakon zavretka bloka using, no ona neée uspjeti ako joj se pristupi Iskaz using Siti j od neoekivanih jenimki. ispose() se poziva bez obzira 1a to kako ‘onteala napusta iskaz using. Stvara se umplicint blok txy-finally (Pogledajte pogla ve 11 za vise informacija) Prosljedivanje parametara Prema zadanim postavkama vrijednosni tipovi se u merode prosljeduju po vrijednost To znati da se, prilikom prosijedivanja objelkta vrijadnasti metodi, unucar te metode stvara priveemena kopija objekta. Kad metoda zavei, kopija se uniStava. lako je pro: sljedivanj po vrijednosti uobigajen postupak, ponekad se objektiprosledujui po rele- renci. C# za prosledivanje objekata vrijednosti u merodu po referenci mudi parametar ef, a 2a prosiiedwvanie varijable xef bez prethodne inicijalizacije postoji modifikacor out. C# podr#ava i modifikator parans koji metodi doputa prihvacanje promjenjvog broja parametara. Kijuéna nijeé params poblide je objainjena u poglacliu 9. | Programe Prosijedivanje po referenci © Metode mogu vratiti samo jednuvrijednost Gako ta vijednost mote biti kolekeija vr. ‘dno Poledamo ponowno klst Time tod cetine( Koja rast, mite Xecnele 1] [Nepomena 2a Java programere: u C# se 2a osnovne tipove poput int 43, Gelobrojna vriednosd) ne treba kos klase omotad, Unjesto ah Sf se korst paramere celerene : ‘ax da nije moguée vrai ri vrijednosti, mo¥da se mogu proslifedititriparametra, pustiti da metoda modifcira paramete izatim provjertirezulatu pozivad metodt 1 primjeru 4-7 je prikazan ovakav pristup. rier 4-7. Vracone vriednost uy paramerima sion Using cirectives vine ster rng Sten ColLectins. Gener ing Syston Text endregion ranespace ReturningVauesToParans ¢ poblic cass Tine ¢ 11 privatne vorijable Canice priate int Year; Private int Months private int Cate; pistons Sot Howes Peivate int Pinot Private int Second; 1 Sai netode 20 peistupnie pbb void Displaycurrenttise() t Systen.Console.riteLine( “(0}/{2}/(2) ():(6)s651", Hoth, Date, Year, Hou, Minute, Second) , public int Gettour() ( return Hour ) public void GetTine( int hy dnt my int s ) Poni dMlaseicieth (05 Prinjer 4-7. Vracanj vnjednosti w parametrima (nas = Seconds ? public Tine Systen.OateTine ct) Year = dtear; Yth = dtenths Date = 8.4; Finute = ot Mines Second = at. Second , pic css Tester t seni vid main) ‘ DateTine cursentTine = Systen.Datetine.jtos, tow tine eerie J {olsen ee Lin «6 tnt tesectnd © 6 Seti tne, tana, thse see stteetne encet ies (150): po, thine, teed , , ratte porortst Curent tie winlan je 00:0, Ov pols obit nije dao Helene So eee pumetina cette) se poled jbo pe seen se parametwcetTive() mdi, aad se wijednostimaponoro remap nein) one sau promenene, Tose dopo bog toge St ch bre reed erjednosnom tip eo mat da se proshedu po wiednost:w catia) arestathople. Mie vejedbostcebamo prsifedit po tfeen Za ou pottebne dvije male promjene.Prvo parametre metode GetTine() promijeite tako da oxnaéavaju kako se radio parametrimna ref pubic vold Getine(ef int tf Ant ref it 5) Sn tues 2 Nine é: 6 | Progamianie@ axim mosiiciate pozivCetTine() kako bis argument prosijedili po referene: Cucttine(cef thebur, cof thetiut, nef theSecon); Ako ivestavite drugi korak u kojem se argument oznagavaju kljucnom rijeti ref, pee~ ‘altel javii da se argument ne moze pretvorit iz int u ref int. Novi ezultat pokazuje Cotno vrijeme. Deklariranjem parametata kao ref parametara prevodi cere uputt da ih prosliedi po referenci Umjesto staranja Kop, pars rear u GetTine() je referenca do iste variable (thetour) koja je stvorena u Main(), ada te vijednosti promijenite u GetTixe(), promjena ée se odeaziti i usin) Svladavanje definitivnog pridruzivanja s pomoéu parametara out C# nameée definitivno pridruzivanje (engl. definite assignment) koje zahjeva da se fui upoucbe svim varjablama dodijeli vrijednost. Ako u primjeru 4-7 ne inicil Ete thetou,thetinute theSecond pie nego St th kao paramette prosiedic Get Toe), prevodi ee javt pogresieu. Medutim,sprovedenainiialzacia samo posta- ‘lanjhove vtjednost na O prj neg Sto se prosjede metodi dnt thibur + 0; At thauuee 0; sme thse +0; Clettine( ref tout, re tee, ce seca); Iniijalizacia ovih vrijednosti ini se beskorisnom jer ih odmah prema referenci pro- shedujete GetTie gdje €e se promijeniti. No, ako to ne utinite, javit €e se sljedece pogreske prevoditeja Use of wrassigneé local variable “theour' Ue oF urassigned local variable “thekinte Use of urassigned local varlable "theSecond UC# 2a ovu situacju postoji modifikator parametra out. On uklanja zahejev 2a inici- [alizacjom patametta reference. Parametti za GetTine(), na primjer, mezodi ne daja nikakve informacije, Oni sa samo mehanizam za dobivanje informacija od metode. Stoga, ako sva ti parametra oznatimo s out, eliminiat éeena poteebn za njihovom inicjalizacijom izvan metode. Unutar poavane metode out paramettima mora bith odielena vriednast prje nego Sto metoda vrati. Navedene su promjenjene deklara- cije parametara 2a GetTine(). pic void GetTine(out Sat hy oat Snt ny aut int =) Pounce lobes | a7 ‘Ovo jenovi poziv metode u Main() ‘GetTine( cut thetour, out takin, out theSecond): Dakle, vrijednosni tipovi se metodama proslieduju po vrijednosti. Parametti ref se koriste 2a prosliedivanje vrijednosnih tipova po referenci. To omoguéava uzimanje nijhove modificirane vrijednosti u pozivno} metodi. Parametri out se koriste samo 23 vraéanje informacija iz mecode, Primjer 4-7 je modificiran u primjeru 4-8 gdje se kor ste sva trl parametra Primjer 48. Kovistene parametara in, owt ref ‘region Using directives using System; Using Systen Collect fons. Generic; teing SyetenTexts ‘endregion anespace trouteef public class Tie ‘ 1 private vars jable elanice private int Years private int Hoth; private int Cate; private int Hour; private int hinate; Drivate int Seconds 17 jaune netode 2a pristupanje public voud DisplayCurrentTine() systen.consolesrittine( “{0}/{2)/(2) (3}3(4)51", Yonth, Date, Year, Hour, Minute, Second): public Ant cetiour() ‘ : public void SetTine{ int he, cut int ain, ref int see ) { +11 ako Je prostijedone veijone = 30 11 povedova inate 4 postavlja sekinde #2 0 11 0 suprotaen ne aijenja nista i# ( see 30) ( inatow Second ) 8 [ Pesamianece 1 primi 4-8. Koritenjeparametara i, ot iret (nastavak) hur = hes //postavlja na proslijedeny veednost 1) prosijeduje minute 1 selande natrag win Hine see» Second ) 11 konstzaktor folic Tine Syston.baterine ot ) ‘ear = dear; orth » dt.tonth; Second = at. Second; ) pic class Tester i static void ain() SystenOatetine current Tine = Systen.OsteTine. ow; Tine t= ew Tine( cutzentTine );, eDisplaycureenttiot); int thetour = 3; nt theinute; int theSecond = 20; f.SetTine( thetour, out thetinute, xef theSecond Systen. Conga. te ine the Minute 1s nos {0} and {a} seconds", ‘eohinate, thesecnd ); thesecond = 40; t-SetTine( thoour, out thatinute, ref thesecond ); systenConole.uritetine( "the Minute 45 ows" + (0) and (3) seconds", ‘hahtrute, thesecnd )s ) SetTine izgleda pomalo neprirodno, ali prikazuje sva tr tipa parametata.theHour se prosjeduje kao parametarvrijednosti. Njegova jedina funkeija je postavlanje variable lanice Hour is pomogu tog se parametsa ne vrada nikakva vrijednost, "ef parametar theSecond se koristi za postavljanje vejednosti w metodi. Ako je these. and ved ili jednak 30, varjabla¢lanica Second se ponowno postavljana mula vaijabla lanica Minute se poveéava Peale tse | 69 Kaclakoritte paramette reference, moratezadati ref {za posi za dedi [Naposljerku, parametar theknute seu metodu prenosi samo da bi se vratilavrijedost varijable Clanice Minute, pa je stoga oznazen kao parametar out Porpuno je razumljivo da se theHour j theSecond morajuinicjalizirati. Njihove su vi jednosti pottebne i koriste se. thekinute nije pottebno inicjaizirati jer se radi o para. ‘metru out koji slufi samo za vra¢anje vrijednosti. Pravila koja su se isprva Cina ari ‘rarnim i musigavim sada napokon imaju smisla. Vrijednost se rrchajuiniijalicinas, samo kada njihova poderna vrijednose inva sista. Preopterecivanje metoda i konstruktora esto ée vam biti potebne dvjerarligite metode ali saistim imenom. NajéeSi pi imjertakvog imenovanja je kad imate vie konstruktora. Konstruktor iz dosadnave- dlenih primera imali su po jedan parametar: objekt DateTiee. Bilo bi korisno kada bismo objeke Tine mogl postavitinaarbitaeno vijeme prosjedivanjem vejednost 2zagodinu, mjesec, dacum, sa, minut sekundu, JoS bi korsnije bilo kads bi neki ki jenti korisii jedan konstrukto, a ostalineke druge konstruktore. Preopterecivane ‘etode omoguéava uprave to Potpis (engl. signature) metode definiran je njenim nazivom i popisom parametara Dvije se metode razlikuju po svojim poxpisima ako imaju razliita imena ii rezlige popise parametara. Prva se metoda u sledeéem kodu od druge razlikuje prema broja parametara, 2 drugs se od treée razlikuje po tipu parametara id ayethodint 92); id aytethod int oid mytethod(int ps, string $1); Klasa mode imati neograni¢en broj metoda, ali se njihovi potpisi moraju medusobno razlikovati U primjeru 4-9 prikazana je klasa Tine sa dva konstruktora: jednim koji prihvaca objeke DateTine i drugim koji prihvaéa Sest cjelobrojaih vrjednosti Primjer 4-9. Preoperetivanje honstruktora frepion Using directives Using system: Using SjetenCollections.Cenerics sing Syston Text endregion ‘ verloadedConstructor 50 | Pegamianece raner #9. PreoplerecivanjeRonsiruktora(nastavak) public class Tine Frivate int Mindte; 11 jae retode 2 pristopanje pbb void OispiycurrertTine() systen.consslettetine( *(0}// (2) (3): (4)s(5)"s ant, Date, Year, Hour, Mloue, Second } 1) konsteuktort public Tine( Systentatetine dt ) t Year = t.tear; Month = .nonths tate ~ d8.03y5 inte = dt-ninute; Second = at Second } public Tine( int Year, int Month, Sat oate, int Hour, dnt Rime, dat Socond c this.vear = Years {is.ronth = Yon this.Oate = bate; thisiiour = Hout, thissminute = hinate, ‘this Secon = Second; pubic class Tester ‘ static void Main() ( syst Dateline curertTio, ~ systen.bteTine. tow; Tine tx = now Tine cazrenttine tDisplaycurrers tine); Tine t «new Tine( 2005, 28, 18, 28, 03, 30 )5 ‘x.Displaycorzenttine(); lie Hse bjt | 99 ao sto mozete primijetiti,klasa Tine u primjeru 4-9 ima dva konstruktora, Kad bi se potpismetode sastoja samo oanaziva metode,prevoditl ne bi zna0 koji konstruktog treba pozvati prlikom konstrukeije ti t2, Buduét da seu patpisu nalaze i tipovi argu. nenata metode, prevodite mode poziv konstrukcora za th uskladitis konstruktoror, {ji potpis zahtjeva objekt DateT ine. Isto tak, prevoditel} moze poziv konstruktora za {2 povezat s metodom konstruktora u éijem je potpisu navedeno Sest argumenata, Prilikom preoptereéivanja metode morate promijeniti njen potpis (fj. naziv, bro i tip parametara). Modete promijeniti i povratn tip, no to nije obavezno, Ako promijenite Samo povratni tip, preoptereéenje metode se nece izvesti, a swvaranje dvije metode s, jstim porpisom i razliitim povratnim tipovima generirat ée pogre’ku prevoditela (pogledajte primjer 4-10) Primjer 4-10. Preopterecivanje metode sazliitim povrainim tipovima region Using dizectives using System Using Syten, Collections. Cenerics being Syston, Texts sencrepfon ranespace VatySngRetueeyp pubic clas Tester ¢ private int Triple Sst val ) setuin 3 ¢ vals ) private Long Triplet long val) ( return 3 * vals : sublic vote Teet() 1 int y = Triple( x )s Systencconsole.testetine( "#2 (0} ye (1D, % Di ag 1 = 105 Tong Dy = Triplet Yes Spence aciteLna( “Ix: (0) £2) bey Ds static void Main() i Tester t = nee Tester()s | Progamiane rest: } ov] over primera klasa Tester preoptereéje meroda Triple()tako da jedna pribvaca | jdlobeojnu veijednost, a druga long. Dvije metode Triple() imaju razltite povratne Shove ako to nile obavezno, u ovom siuéajuje vl korsno. Ucahurivanje podataka sa svojstvima Siojseva doputaju kljentima da pristupe stanju klase kao da izravno pristupaju polis dlanovima, dok zapravo implementiraju pristup kroz metodu klase “Tj je postupak savrSen. Klijentu treba izavan pristp stanju objekta, a Zeli ibjeci metode. Dizajner klase, medutim, Zeli u Ganovima klase sakeriti unutarnje stanie 4 ‘sigurat iarivan pristup putem metode. COdvaarem stanja klase od metode koja tom stanu prstupa, dizajner mofe prema potrebi promijenit unutarne stanje objeto, Pilikom prvog stvaanjaklase Tine, vi Jenst Hour mogla bi se spremiti kao vaijaba ania. Kad se klasa prepa, vied- ost Hour mote se jzaunat ili preuzet iz baze podataka, Ako Kljent ima iravan frist izvornoj varjabli Qlanici Hou, prebacivanj na izratun vrjednosti prekinulo Binjego rad. Odvsjanjem prisijavanjem kljenta da prode kroz metodu Gi svjstvo) asa Tine moZe promijnit natin na koji upravana incernimstaiem bee naruSava- riakoda kena Svostvazadovoljavajuoba uvjta:Klijentu prutajajednostavno sutele jr izgledajn ia variable ance. Meuron, implementraju se kao merode, omoguéavajutisaki- sanje podataka koje zahtijeva dobar objektno orjentiran aaj, aa Sto je prikazano sprimjeru 4-1. Prinjer UL Korte svojstoa ‘Frogon Using directives sing Syste; Ising Sten Collectons.Cenersc; ‘sing Stow Text tearepion ranespace UsineAPoperty ¢ pric eas vise t 11 privatne varsjable dlanice private int year; Fesavescnaeiebeki | 93 je sejstva (nasa) Primjor 4th Kor private int worth private int dates private int hor private int mites Private int seconds 11 jawre netode 22 pristupanje public void Disploycurrentine() t systensConche.teitaLine( ets (0)/(8072) ICO20Y"s ronth, date, year, hour, ute, Second ); Second = dt second; } 200 pubic Sok Youre ' | ve | ; ; ) public class Tester static vod nain() ‘ systenDaterine curzent Tine « SystenbaeTine. Now Tine? rev Tie( earentTie 5, Ebtspibeorertiae(); Sircacuaotecitedine “oteteteved the hour: (Oo their 8 | ProyariajeGt TF jer 4-11. Kosten soja (asta) Hoar = eet; Systen-Consate.t ) y S ‘a deklatiranje svojstva napiste tipi nazivsvojtva | iza nih stavite par vitgastih Jperada. Unutar2agrada mofete deklarzaipristupnile (engl accessors) get set, Nije- Janod nih nema eksplicitne paramere iako metoda set() ima implicitniparametar {alve, ka to je prikazano u shedeéem prmjeru LU primjeru 411, tour je svojstvo. Dellaracijato svojstva vara dva pris get pote it ur i et t return hour; haut = valves , Svaki pristupnik ima svoje ejelo koje uzima j posaula vijednost svojstva. Vijednost stojstva mofe biti pohranjena u bazi podataka (u tom ¢e slugaju glavni dio pristupnik tginiti ono Sco je potrebno 2a interakeiju s bazom podataks) ili moze biti pohranjena uprivatnoj varijablilanici private nt hour; Pristupnik get “Tieloprstupnia get sign e metodi Kast koja vagaobjek tia soit. Svojtvo four iz navedenog primjera dio je meods kj vrata int. Ono vata veednost pri vtnevarjable Elance u koje poranjna vtednost vest r 4 Uovom primera ve se loana varia nica int, ali mogl bist isto take uzeti sjlobroinu vriednost i bave podataka ie iratunat Prilikom svakog &itanja svojtva poziva se pristupnik get: “ne t = no Tie(curventTine); ine theour » thou; Peal cre obit | 95 Uovom se primjeru vraéa vrijednost svojstva Hour objekta Tine i poziva pristupnik get radi izdvajanja vrjedaosti koja se zatim dodjeluje lokalnoj varijabli, Pristupnik set Pristupnil set posta viednost svojstva lian je metoi koja vata void Pelikan defnianja priseupoika set morate Korii kjudnu rij valve koja ée predsavoy argument tj se ijednostprosieduje i koju svojstvo sprema fi our = value; U ovom se primjeru ponovno 2a spremanje vriednosti svojstva korsti privatna vag jabla glanica, no pristupnik set moze prema porrebi zapisivatiu baza podataka i ‘aturrati druge variable dlanice Kada svojstvu dodielite veijednost, automatski se poziva pristupnik set te se imp citni parametat value postavija na vaijednost koja dodielte: ‘Choc » tahoe; ij lave prednost avog prstupa su Sto klijent mote izavno radii sa svojstvima, bez Zrtvovanja neprikosnovenost sakrivanja podataka i ufahurivanja u dobrom cbjektno orijenticanom programirenju, re moguénost da autor svojsva osigura val ‘ost podataa Modifikatori pristupa svojstvu Modifikator pristupa (protected, internal, private) mote se postavtii za reguliranje pristupa pristupnicima get ili set. Da biste to utili, svojstvo mora sadr2at i pristup nik set i pristupnik get, a modificirati moZete samo jedno od njib. Modifikator mora biti restrikeivniji od razine pristupa samog svojstva ili indeksera (Stoga, 2a razliku od privatnog svojstva, pristupnikeu get ili set javnog svojstva moZete dodati protected) pte stig serine protected get { return syStrings } Set { nyString = value; ) ) U ovom je primera pristup pristupniku get ogranigen na metode ove klase i klasa koje su izvedene iz nje, dok je pristupnik set javan. “Modifkarorpristupa ne motete primijenitinasuéelje(pogledate poe ‘je 8) nit veksplicieny implementa alana sugeia, Uz to, ako pre motajetevirualno svjstvo ill indeks (to je abjanjeno u sljedesem diet), modifkatorpristupa mora odgovarasi modifikatorupristapa cosnornog svojstva. regan © gregion Using direct Polja readonly { Motda cee treat stvoriinaticu klase Tine koa 6 prudatjavne statcke vijednost Se sm poten Lamm primer 4-12. KoriStenj stuck jayh onstants sing Syston fing ysterCllections.Genersc ing Syste Tent © genaepion " samapace Staticbbhicconstants public class Rightow t 11 Same variable Canice pli static int Year; ppalic static int Nanth; lic static int tate; public static sme Hour; piblic static Int Mints; ble static int Second; static Right) ( SystenateTine dt ~ Syeten.batetine Now; Year = dt-Year; nth» dont Date = d.tay, our = stow; Ninwte © dt.minutes Second = dt Second; ) ) polic class Tester static void taint) { SystenConsolesriteine( “This year: (0}", Righter Year-ToString() ighttoncVear ~ 2006; Spsten.Consolestritl ine “This year: (0), RightNow Year. Tosteing() }s Fogle Hsebjeet | 97 COvakav kod dobro funkcionira dok se ne promijeni jedna od vrijednosti. Kao sto modete vidjeti primer, vriednost Right¥ow, Year se moze promijenti u, na primjer, 2006, Otito ne Zelimo da se to dogodi fa POGLAVLJES Nasljedivanje i polimorfizam Bilo bi dabro statike vrijednosti oznaiti kao konstante, ai to nije moguée jer se one itnicijaliitaju tek kad se iavede statigki konstruktor. U C# za ovu svtbu postoj kjugna rije€ readonly, Ako deklaracile varijabliélanica klase promijenie na sljedeéi natin public static readonly int Year; public static readonly int Ronth; public static readonly int O3te; public static readonly int Hout; public static readonly int minute; Public static readonly int Seconds 5 zatime «komentar iedvojite ponovno prideudivanje u Main() LU prethodnom smo poglavlju pokszali kako se novi tipovi mogu stvortideklariranjem asa, Ovo poglavlje bavi se odnosom izmedu objekata iz stvarnog syijeta i modelira- jem tth odnosa u kodu. Glavna tema ovog poglavlja je specalzactia koja se u jezik C# implementira s pomoeu nasledivania, U ovor je poglavlu objaSnjeno i kako se instance vile specijaliziranih klasa mogu tretiati kao da je sje o instancama opéib Klas ata) se postupak raziva polimorfizmom (engl. polymorphism), Poglavlje zavr ava objaSnjenjem zapecacenih klasa koje se ne mogu specijalizirat: apstraktnih klasa oe postoje samo kako bi se specijalizirale te korijena svih klasa, klase Object. 11 RightNow, Year = 20055 7 pogredkal program ée se ispravno prevestiizvesti Napomena 22 ¥86 programere: kao i VB.NET, Cf pruza porpuno ‘objektno orencitan tehnologiu,uljuevjue nated wane, palimer: fzam i ufaburivanje, Te su teme selatina nepornanica VBS pros merima. Trebate th paljve proud jer one ure na Kasei dean aplikaei Specijalizacija i generalizacija Klase i njthove instance (objekt) ne postoje u vakuumu, vet u mreti mesusobne ovi= snosti i odnosa, kzo Sto mi, deustvene 2ivotinje,divimo u svijeru odnosa i Kategoria Odnos to je je jedna vrsta specijalizacje. Kada kalemo kako je pas sisavac, to znadi kako je pas specijalizirana vista sisavea, On ima sve osobine sisavea(rada Zive mlade, Aojithmlijekor, ima dlal), ali su te osobine specialzirane na poznate osobine poro- dice canine domesticus. Matka je takoder sisavac.J2 toga mozemo zakljutti da mazke ipsi imaju neke zajednitke osobine koje pripadaju opéim osobinama sisavaca, ali se ‘mace i razlikuju od pasa u onim osobinama koje su specijaliirane 2a matke. Odnosispecijalizacije i generalizacije su proporcionalni hijerathijski, Proporcionalat su jer je specijalizacija suprotno od generalizacije.Stoga su pas imatka specjlizacije sisavea, a sisavac je generalizacija psa i mace. 58 | Pragrmionjeck ‘Ti su adnosti hijerahijsi jer dine stablo adnosa u kojem se specializirani topowi sronaja invite generaliziranihtipova Sto se Po hijerarhij vibe pomitexe prema por, foje generalizacija veéa. Kako biste generaliziali osobinu da imatke psi radaju fire Inlade, pomitete se do sisavaca, Pomicanje kroz hijerathiju prema dole predstavi Specializacje Stog e matka specjliaacija sisca koja ima pand2e (osobina)iprede (ponasanje Slitmo tome, ako kadete da List80xiButton jesu Controls, naznatujete kako Controls ‘maj osabine | ponatanja koje se ogy pronaéi soba tipa, Drugim rijeima, Contr) gencralizira zajednidke osobine ListBox i auton, dok ListBox i Button specjliziajy posebne osobine i pona8anja OUML-u ‘Unified Modeling Language (UML) je standardizirani jezik za opis sustava il nazina poslovanjs, Dio UML-2 koji e koristan za svrhe ovog poglavija je kup dia rama koji se korste a dokumentiranje odiosaizmedu Klas, U UML klase su predstavjene okvitima. Nazi klase nalazi se na vehu okvira, 2 (prema izboru) metode iglanov se mogu popissti umatar okvira, UUMLuse odnosi specializacie (na primjer) modeliraju na natin peikasan na slici 5-1. Stelicakrece tz kKlase koja je specijaliirana i pokezuje generalizranv klas. Sllea 5-1, Odnos 10 Diije else Eeso imajs zajediths unkcionalnost, tase zajednitka svojstva zai faktorirja u zajednitku osnown Klasu. Kod sastaien na taj natin jednostavnjie 22 odtsavanje i moge se lakse koristtiu drugim projektima, Pretpostavimo kako pocelistvarai objekte na nagin prikezan naslici 5:2 00 | Promina L ‘Sika 52. levodenje fe Control [akon rada s gumbiena tedioButtons, hecksoxes i Conmand shvatite kako postoje odre- dene zajednitke osobine i ponatanja koja su vite specialiirana ad Central ali suapée: nitja od ostale eri, Te zaedni¢e osobine i ponaanja mozetefaktorirat wu zajednieka ‘osnovny klasu Button i promijenti hijerathju nasljedivanja, kao Sto je prikazano na slic 5-3. OVO je primer koristenja generalizacije u objektno orijentiranont ra2voju, "Sika 53. Vie flaorivanahjerario ~~ Ovaj UML dlijagram prikazuje odnos izmedu klasa i pokazuje kako sui klasa Listaox % iutton irvedene iz Control, ada je klasa Button daljespecijalizrana u klase CheckBox ‘cormand. Nadalje, klasa RadioButton je izvedens iz Checkbox. Mo2ete, dake, reéi kako RadioButton jest CheckB0x koji je Button, # Buttons su Controls. Ovo nije jedina, niti vjerojarno najboli, organizacia ovih cbjekata, all pred 0 najbolja, organizacija ovih abjekata, ali predstavlia Aobar uvod u prikaz medusobnih odnosatipova (lass) Iako ovo saprvopokszujeorgpizaia neh ira kotaa ja at osbo via skepian prema sam ssc jem model 5 odrafava mou preps sveron Kade kate da Raton eat mow ee en ia i ein ajetatoavton ek sta placa psd Toe ples porta lojeodrtavaidom mediednoikjuthyhopets Sebuomea tov ie jr pomalo jeragral mate bana bara sha Pogo nade paiortam | 101 Nasljedivanje Odnos specializacije seu C# obitno primjenjuje keoznasliedivanje. Nesljedivane nije jedininazin za primjens specijlizace, ali je najZe8i i najprirodnij nagin 2a imple mentiranje takvog odnosa Izjava da ListBox nasleduje i (i2vodi iz) Control oznatava dae reo spcialzasi klase Control. Control se naziva osnovnom klasom, a Lito iedcromsklasom. Dry gim rijecima, ListBox svoje osobine i ponaanjeizvodi iz Contzol i zatim se special ‘ata prema viasttim porrebama Implementacija nasljedivanja UU C# se iavedena klasa stvara dodavanjem dvorocke izanazivaizvedene las, ia equ sljedi naziv osnovne klase: public cass ListBox: Contra} COvim se Kodom delarta nova kas List8ox koja ivodt iz Kase Control. Dowd se mote protitati kao gizvodi ie” Napomtena za C+ programere: u Cit ne post privetno j zakéeno nashedivane Tzvedena klasa nasljeduje sve Clanove osnovne klase - varijable i metode élanice. Polimorfizam ‘Nasliedivanje ima dva vana aspekta. Jedan je ponovna upotreba koda. Kada stvorite lasu ListBox mo¢i Gere ponovno upotijebiti do logike iz osnovne klase (Control) Drugi aspeke nasljedivanja moda je jo8 va2nij: 0 je polimorfizam. Poli znati mnogo, ‘a morf znati oblik. Polimorfizam dakle predstavja moguénost koriBtenja vise obi tipa, bez obzira na njihove pojedinost. Kada telefonska kompanija vatem telefonu potale signs! 2vona, ona ne zna kakav se tip telefona nalgzi na deugoj strani nije. Moda imate starinski telefon u kojem pose ban motor poktefe zvono, 2 moida imate elektronski telefon éije je zvonjenje zapravo digitaina glazba. Vasa telefonska kampanija poznaje samo ,osnovni tip" Phone i ofekuje da svaka sinstanea* ovog tipa moze zvoniti. Kad telefonska kompanija vaSem telefonu naredi dda zazvoni, ona od celefona jednostavno oekuje ,da uéini pravu stvat". Telefonska kompanija va8 telefon, dakle, wtira polimorfno. Stvaranje polimorfnih tipova Kako bstestvorili merodu koja podréava polimorizam, tebat je samo oznati virtual u njenoj osnovno klasi. Na primer, kako biste metodu Dravéindow() w Klasi 1a | Pegamiane ‘canttol iz primjera 5-1 oznatili kao polimorfou, jednostavno u njenu deklaracju <# odajeekljuénu nijet virtual na sledeti nai: pubic rtal vol Brand) _ sudacesvakainvedenarklasa moti implementitativlastiuinaticu rawindow(). Kako fixe f0 win, jednostayno premostie vitualnu metodu osnovne klase korstei ljuenu rie override u defini metodei2vedene Kase zatim dodate novi kod za tupremoséenu mecodu, Usljedegem odlomku iz primera 5-1 (koji je naveden kasnije w ovorn odjeljku) ListBox jeievedena iz Control i implementira vlastitu inaticu metode Dravdindow() public override voléDraulindon) base.Dratindon(); // poeiva osrowns tod Cangole.driteLine ("iting string tothe listbox: (0), istborContents); ) Kljuéna rijeé override prevoditelju govori da je ova klasa namjerno ptemostila nagin rada metode Dravdindow(). Na sligan je natin ova metoda premo8éena iu drugo) klasi, tutton, koja je takoder izvedena iz Control Uijelu primjera 5-1 prvo ete stworit tri objekta: Control, ListBox button. Zatim éete za svaki od njih pozvati metodu Dralindod(): centro win = new Contro( 3,2); Lstior 1b = new Listion(3,4,"Stand alone ist box"); Button b= raw Buttons), win Orandou(; 2b.Dradedou()s ornasindou() (vo funkcionira na oéekivani natin. Ispravan Orawindos() objekt se poziva za svaki Do sad nije uéinjeno nisea pofimorino. Carolija potinje kada stvorite polje Control objekava. Buduci da ListBox jest Control, slobodno je mosere stavtiu polje Contr Button takoder modere stavitiu polje Control objekata jeri Gutton jest Control: Control} wlndsray = nex onto {3s winterayfo] = ner Contzo(2,2) winkrray[s] = new ListBox, Ninterayla] = new Butten(6); Sto ese dogoditi kad za svaki objekt pozovete metodu Drawindow()? for (int 1 = 038 ¢ 35 169) ( st box in arsay") winkeray1]Oraedoe(); Prevoditejzna samo da ima ti Control objekta i da ste za svaki pozvali metodu Draw. Window(). Da Draxdindow niste oznatili s virtual, metoda Dravdindow() iz Control bi ‘= pozvala tri pura. Medutim, kako ste Dranfindow() oznaéilis virtual i buduti da ivedene klase premo8cuju cu metodu, kad pozovere Draxindow na polje prevoditel Pogo sajeineipolmerzan | 103 onteduefvedbeni tip swash objhata (Control, List Sutton) za vali pri| evigvarajucu metodu. To je bit polimorfzma, Potpun kod za ova primer pikes jeu primjeru 5-1 7 ons tor pola pol je okie abjelae isos tipa. Cano 448, ina pls mote popes opera nla 1 postavtja vetjednst elenenta 115 ponte 5 hyarray(S] = 75 Prvielement pola indeks 0. Korétenjepoljauovom primer trebalo bi bic pilignoinuitivno Pola su isceprije objatnjena s poglav 9 Primjer 5-1, Koritene virtwalnih metoda Using viztual methods region Using directives sing Syston sing Systan Collections. Ceneri¢s Sing Sten. Text; eadegion ranespace VirtvalNethods cl public class Controt ( 17 O04 Elanovs su 238ticent 1 abog toge vidhfivi 17 wetodana fzvedene Klose, 0 tore Cena 17 etaljnije govorith kasalje u poglayl ju protected int top; protected Int Tefts 11 Kangeruktor uniea duije cjeloorojne vrjedhosti 11-33 tksSranfe lokacie na konzalt public Control( nt top, int left) t shis.top = to this-lett = Tet ) 17 simulta Isertavanje prosora public virtual ois Gcadindon() ¢ Console.nriteLine( "Control: drawing Control st (0), (29°, ‘tops left ) 17 stiox Svs Contzel public class ListOox = Control 1 5:1 Koritenie virtwalih meta (nastavak) private string istBoxcontents; 1/ nora varijaba lant 17 konataktor dodaje paraetar pbc Lstox( int Tet, string contents ): bel top, 1eRt) 11 goat esnowni konstukter premnidna inatica (popledajte W1jetnu ije2) jer u 7 Savedeno} ne tot nijenjan ponadanje pbb override void Drauindo ‘2se.Dradlndon(); 17 potiva estou netods GaosolestriteLine( "iting stzing to the Listbox: (0}", Tistoxcontents J a PBS panic class sutton: control ¢ 2 pate ttt * ss int top, ine Tet) baste ert) i } I rem ne (epee tt re) Jers reac laa itn pic ome od beni) ciple "aig 2 baton), ‘top, left); © Gs phic class Tester static votd Main) { Control win = new Contr 1, 2 ); LUstiox Ib « new Listter('2,"4, "Stand alose list tox"); Button b= new Button( 5, 6): win.Oraindou(); 1b.dravtrden(); b.oralindc() TO | Fogamianjecr Fogle :nasesnajeipaimertam | 105 5.1 Koren virwwalWth metoda (nastavat) ont) wien = ven conten 315 sic econ 2. . vestry] crew Listiox( $e dy Uist Bex in assays ‘Honeoye «pew Botan 51 635 for (int 2 FO HH) winereny(3)-Drzdkindoni ) ) U cijelom su primjeru nove premoséene metode oznagene kljuénom rijeci override: real a a gy arakovn min ba a ad) poe adeno py override, Porivanje konstruktora osnovne klase U prinjea 5-1 ova Kas tistoxizvod Contre ima svg konstrkeora kj ume earner Ronstaktor ListBox poziva kontruktora svg soil (Conte) “jidgen oro () ia popisaparametar i ztim pocva osnownu Klass pomoés jue net ae: pubic tistfoxt ire ton, im totes, string tecentens) e(theTopy thleft) // Poziva esnowog Konstxsktora Buduei da klase ne mogu nasledivati Konstruktore, izvedena klasa mora implemen sjeati svoj konstruktor, a konstruktor osnovne klase mode upotrijebiti samo ako gt cksplicitno pozove. Ivedeni konstruktor ne mora eksplicitno pozvati osnovni konstruktor ako v osnovno| tai postoji destupan podrazumijevant Konstruktor ~ podrazumijevani konstruker se poriva implicitno. Medutim, ako osnovris) klasi ne postoji padrazumijevani kon Struktor,svaki izvedeni konstruktor mora eksplicitno pozvat jednog od konstruktors osnovne klase koristeti kijuénu rijet base. 16) Programe Kao i je objatjenow poglavj 4 ko ne delat kakar ko. B.S dnc es erent cj esky 8 4, tto do gu sum: nai, orate jedan od tonetrtor je poi prevodi, poszumjerai Kastor eon Kj newt parame. Medi, Kado sori blo kako kansrulr (sh Be? parametara,prevodiel) nee unjeso vas stort podrazumgjevant fonarukioe Kontrola pristupa ‘idgvast elas jenih dlanova mote se opranititi koristenjem modifikatotapristupa a0 5t0 Su public, private, protected, internal protected internal (objadejenje modi- fikatora pristupa pocrazite u poglavju 4). Kao So st veé vidjeli, public dopusta da Clanu pristupe metode tlanice drugih klasa, dok private oznaava daje dan vdlv samo metodama danicama svojeWlase. Kutt ret protected vidlvost proiraje ne metode izvedenih Klasa, dok je internal pros rujeria metode svi klasa iz istog sklopa” Tar Hun rijett interna). protected doposts pristup Hanovima itog skp Cinter- tal) il izvedenih Klasa (protected), Ovu oanaku mozete shvatic i kao interna ili protected, ‘lave oe, oto kao i njlhow dlannei, mogn oznatit bilo kojim od navedenih modifika- tora pristupa. Ako élan klase ima drugaeji modsfkator pristupa od klase,primjenjuje se modifikacor koji namece vece ogranitenje. toga, ako Iasi nyClass definrate na sledeeinacin public closs myclass ected int value; pristup malue je ogranien ako jesama Klas gznatena kao javna Java lasaje viljva sim oscalim klasama koje joj Zelepristupiti, Cesto se stvaraju klase ij jejdina svrha pamoti drugim klasarra u sklopu, ate je klase bole oznatitis internal nego s public. Pracenje inaica s pomocu kijucnih rijeci new i override U-C# odluka programera da premostivirtualnu merodu ekspicitno se provodi s Pomo¢u kljutne rijeZi override. To pomade pri stvaranju novih inazica kod. Pro- Injene ossiovne klase neée pokvariti postojei kod w izvedenim klasama. Zahtjev 2a korigtenjem kijudne rijeti override pomaze u sprjetavanju tog problema, *Sklop ao Sto je objsneno u Pople edica delet i ponorng koitens oda v CLR (logis DLL stip ae oteno svat od skupe lk daorha koe nena uno} map koa sade sreresurs (oi map ef Gator ud potebne a avedbens atte, sjednostL-omtmetepodacns ty progam, Fogle s:taseaaneipeimarzam | 107 Evo kako se 0 odvija:pretpostavime da je osnovnu Klasu Conttol iz prethodnog pri injera napisala Trtka A, Pretpostavimo i da su klase ListBox iRadiobuttennapisl programeriiz Tvrtke B koristedi kuplenu opis klase Control koju je napsala Teka 'Akao osnova. Programe Tvetke B mogu ut mall nikakvo} jer konrolirti diy, ilase Control, ulljueujuci buduce promjene koje Ge Turtka A mapravit. ask uklanja upozorenje. Ako, sdruge strane, programer eli prernostii meroda F tateal treba samo s pomocu kljuéne rijeti override naznatiti kako se radi o eks plicit) namie: s a bist inbjegli ovo upozorenje moda éet hye! svim sojim vires: alta metodama dodae kljuéna ret ae. To nije dobea ides. Kad se Ujazna rie ne pojavtw Kody ona bi trbala dekomentirat inatice oda. Ona poreneijainom Klieatu pokazije osnomns Kay Kako Bi vidio tone peemoseujere. Cato horitene lune ri new podriva taku dokamentaciu. Nadale,upozerene poso kako bi vam pomo- loda prepotnat stvarni probes, aT punt class Listbox ‘ soe Pretpostavimo zatim da jedan od programera iz Twrtke B odluti u ListBox dodat el metodu Sort) pubic class Listhox + Control ¢ public virtual void Sort) (. ) ‘To ne predstavija nikakav problem dok Tvrtka A, autor klase Control, ne izdainaticy 2 svoje klase Control |ispostavi se da su i programeri Tvrtke A dodali metodu sort() svojo) javno) klast Contre. public class Controt ” public virtual voté sortQ) (...) “Apstraktne klase siaka podklasaklase Control trebala br implementirati vlastitu metoda Dxndtindon() at nikta jena 0 ne obavezuje. Kako bise klase obavezalna implementa metode sncjeonowe Klose, rebate tu metodu oznaéiti kao apsrakn U drugim objektno onjentiranim ezicima (opr. u ++) nova virtuana metods Sort) fankcionirala bi kao osnovi roetoda za virtialnu metodu Sort() u List80x. Prevod tel bi pozvao metodu Sort() iz List8ox kad ste zapravo namjeravali pozvati meta Sert()iContzol.U Java jek, ako Sort() iz Control ima drugi povratn tip, program 2a utcavanje Wase bi matca0 da je Sort) i ListBox nepravilno premoscivane us tavanjemne bi uspelo C# sprietava ovaj problem. Virtualna metoda se u GA uvijck smatra za kotijen vie tualnog otpremania 5, kad C# pronade virtalnu metodu on prestaje strazenjers uz Iijerathiju nashedivanja, Ako je w Control uvedena nova virwalna mezoda Sort, pona¥anje stBox tjekoi2vedbe ostale nepromijenjeno, apstraktna metoda nema implementaciju. Ona stvara naziv 1 potpis metode koji se <“mordju implementirati u svim izvedenim klasama, Nadslje, oznagavanje jedne ii vise smerodaneke klase apstraktnima ée i klasu utinii apstraktnom, [Apstrakene klasetvore osnovu 2a jzvedene klase, ali instancijacija objekta apstrakine “flee nije dopuStena. Deklariranjem apstraktne metode zabranjuje se sevaranje bilo “aki inccanet ve klase, 12, ako Dranindou() oznatice s abstract u klasi Control, mozctelavositi ia Contxeh, “dine mofete stvoriti abjekte Control. Svaka izvedena klasa mosala biimplementirati _Dradlindow(). Alo izvedena klasa ne uspije implementirai apstrakenu metodu, klasa cst bila apstrakena te instanciranje ponovno ne'bi ‘bilo mcg Kaa se ListBox ponowne prevede prevodi generita uporoese ee ere eee ae Bcoa es sbstractoonataatako da eWtna ie abstract nape na pode Peers bstract public void Dreatindo(); se\class.c(54.28): waning CS0014: “ListBot.Sort()" hides Jnberited meter "Conrol.50r%() a make the current netber override that inplenentation, fd the ovet7ide keynord. Dthersise me the nen keyword ‘(Kako metoda ne moze imati implementaciju, na stavljaju se vtitaste zagrade vee Za uklanjanje upozoreiaproramer mora naznaitstojunarjera.On mote melt J mks vars) Sort() iz ListBox oznatit s new kako bi konkretizirao da se ne radio premoStivanja Sir ie esd w Corte ‘ko post jedna it vis aparatnsh meoda, defn lase se akader mor cana “abstract, kao u sedeéem primjeru: sbstract public class Contra piblic class ListBox + Control ‘ pico virtal void Sort) (=) £U primjeru 5-2 prikazano je stvaranje apstrakine klase Control i apstraktne metode *Drawindow), 108 | Pogamitnjecr eget :Aasetvaneiplmerzam | 18 Prinjer 5:2. Upotrea apstraktne metode laze region Using directives using spon; CEI stem collections. ened wsing syten Tec tendregion namespace abstract asin System; abstract public class Control ‘ protected int top; protected int lefts 1) konstzuttor via dete cjelebrojne vr jednsti by a Hksirange Toacije 90 konzold poblic Contzel( iat top, int Teft ) this.top = tops thief» lefts } 11 Simaira sseetavanje prowors 11 naponena: asta Snplenentacije abstract public vid Oronindon(); ) 11 Listox xvod 12 Conta public clase ListBox = Control private string ListonContents;// ova varijabls elanica 17 Konetraktor ddaje paranetar public ListBox nt top, Int left, String contents ) tasetop, left) 1/pociva konstruktora base ‘ Listboxcontents = contents; ? 1 PrenaSéens snatsca lnplenentira 1 apstzaktew netod bic override void Orndtindon() ( To | Pogamianjece jer 5-2. Upotebaapstratine tod Mase fastavat) cansole.kriteLine( “iting string to the listbox: (0)", ietboxContents 5 = pbc class Button : Control st © panse patton ‘nt top, int left) tose(tap, left) { ) (1 meena teen setae bt ose vei Bnd) onsleiteLie( “rang » batten 3 (0, (38, Toor lett); , poli cas Teter : static void Main() entry = ee conte srry sno stb 3,2, iat Usk ox Winkeray[2} = ew ListBor{ 3, 6, "Second List Box”) Wesakeray2} = few Button 5,6 35 for (ime 1 = 0; Le: te) wiotryay[s].Draindou(; | U prinjera 52s Control edelarirana kao apstraknai toga se ne mote instzn fit, Ako zanijente pri lan po vinkray[o] + ew ListBou(2, "First List fox"); 14 shjedetim kodom: Shy Mdnkeraylo] = new Control (,2)5 {Program ée generirati sedeu pogresku: SF Cot create a ietice ofthe ateract ats o interice abstracteethods Cont le Moteteinstancitati objekte ListBox Button jer velase premoBéuju apstcaktou met Sco th dint Konkresnima (6, neapstraktnima). aston Ogranigenja apstraktnih klasa {ak canalavanje tanindow) apstraktnom prisijva sve ivedene Klas na imple ranma te metde, owl oganieo jsene problema, Ako Wasyiveden cretasel me Drop. ston), izvedenu kas nigta ne prsavanaimplemenci astite metode Braedon) Broa Klas je neposredan odie) ivedenoj Klas. lzvedena klasa mote bc rr dai zvedeita Klasama stvarsjuc ako ,stblo”nashedivana i hijra ee Konjeska Kasa je najida Kasay hjerati naajedivanja, Rorjenska Wasa 8 Nowe por bn datas blo eats Best, skorjenom na vc izvedenimklasama ipod nega. Osnovna kas, 1* izvedene klase. \ FE) Napomena 20 C++ propamere:wjexiky Ci Control Oradingou) ne Inebe pratt plmentaia pa ne mogakoristiprednostzajed 44g nike racna raindet) koe nae og kris even ase jecbject. Naposletku, apstrakene klase ne bi smjele biti samo implementaciski tik, One i He, iz0ad trebate predstaiatideju apsrakcie koja uspostalja ,ugovor” za sve izvedee Klas Drogitaretima, apstrakine klase opisua javne metode klasa ko implementa apsraks, Ideja apstrakeneklase Control ew postavjanju zajednigkih karakterstika i ponata ‘vik Kontrola, fa ‘ako niked nije planirano instanciranje same apstrakcije Contra a Bae 45 Ideja apstrakine klase implicirana je w rijeéi sabsttact* apstraktno). Ona shut inmplementacijo apstrakeije -Kontrole” koja Ge se manifestirariv raznim konkressin inetancama klase Control. Poput prozora preglednika, okvira, gumba, padajieg popisa i abornika, Apstraktna klasa odreduje Sto Control jest, ako namjera mika fie svaeange kontrole pers. Alternativa koristenj kijugne rijet abstract je defini. nije suéela, kao So je opisano u poglavu 8 4 Tapeta¢ena klasa U projekeiranju programa, suprocno 04 apstrakanog je zapetaéena (eng sealed, alo jenamjena apstraktne klase da siz je izvodi ida prudi predlozak koji ebaju sled niene podklase, zapetaéena klasa uopée ne dopusta da se iz nj izvode klase. Akos ispred deklaracje klasenapise kjutna rjeé seated, ona spretava izvodenje. Klas fa sealed najéedée oznaavaju kako bi se sprijetito shutajno ashedivani. cannot Snherit from sealed class *onts0l ine druge primjedbe (na primjer, da ne mozere stvorti novog zastiGenog clans w peéatend} Klas. Napomena za C4 programere:Ci kos jednosteuko nashedivane ‘monoltnom hijerarhijom Kase svakaklasa nasleduje iz osnowneklase Object, a visestruko nashedvanje nije mopuce. Medutim, Ci sugeia * prutajubrojne pogodnost viSesuakog masjedivarie. Vie informa, come potraziteu poglvlu 8 Eject prota razne virtuale metode koje podklase mogu premoséivati Med jim je Efiquas() skojom se urvedue jesa i dva cela sta, cet Type) ho wade tp ajeka ale je objatrjena u poglavli 8) i toString) koja vraéa niz za predstavljanje ucegobjekta (objnjeno v poglaiju 30). U tablci 5-1 mozete pronati saZetak Stora Proceso ea Dept jeltina a prt vasumetod apne raupateb alana gsi nolan vega) esol pity oj sp (oat pao za ie nemaca) noua pctaefebt eon mn ase) eo arena npn dale 8) nen soa pone: pte sea ° Eaenng evnea ee epee oj ia ovaj nselot() Stipe eDmbnpeen ean atphranan ‘Ako se deklaracia klase Control u prenjeru 5-2 promjeni iz abstract u sealed elimi tire Klugna je abstract iz deklaracije Draindw()), program se nee prevest Al poksate gradi ova proja, prevoditel Ge vrai shedecs porules.o pogsedc: 1 Proganianie Pale adetvanelpotmerizam | 123 Primjor 53, Nasljedivanje ie Object region Using dinectives using Syste ing SystenColleetions.Generic sing Systen. Texts fendcegion sonespace IneritingFrondhject public class Souelass private int vals public Someclass( val = soueals public override string ToString() return va) ToString(}i ) > public clase Tester static void bispiaytalue( object 0 ) ‘ ange rile ne vale of the object passed Ln 3s (0}", o.Tstring() )s ) static void Main() ( int i= 53 ConsoleauriteLine( “The value of £52 (0}", {-eStringO))s Dlsplawalue( 1); SeneClass ¢ = new Soaeass( 7 ); Gorsoleniritetine( "Tne value of {5 (0)", sTotring() 5 Displaylaluet 5 )5 5D ? Dokumentacia za Object. ToString() otkriva njezin pots: public virtual string Tostring()s i “Tojejavnavrtualna metoda koja vraa zine uzima paramete vi wpeaden po poput pa int iaveden su iz Object stoga mogu pozvat ene metode. 14] rogaine Ge Br injer 53 premoSuje virtualnu metodu za SoneClass, 0 wobitajen sluts) takoda Eeoa mera ToString() mote vrai smislena vijediost. Ako smjestieu komentar em séenu metodu, bit Ce pozvana osnovna metoda koja Ce ialaz promijenici u Pakiranje i raspakiravanje tipova Bree (eng. boxing) iraspakraanje engl. unboxing) su proces koji amogucavjy ime vjednosninpova (ape. celeb vrjednost) kao da su eee pot Ac), Vejedost se pai" unutar Object catia se aspaliava vaiednosi ip. (FA) apomens Jaa programe sek Javapakiraneosnovih Java pakiranjeosnovnihtipova tab zabjev ckaplitnaspotebutiporaomotaca popu ager f Fist, UCH mehanizam pakiranjasveoadiautomats ipow om. ‘aa nau potrebn. ikazano na slici 5-4 meson egos 1 i om wien: . apatan) 1 at atest 1 Takirnje je implicitna kad prudice ved njesta nae “Yakicaje je imp P iednosni tip na mi cojem se ofckoje /Gfelrenca, Ako, na primjer, primitive tp doajelte vail tipa fect @to je doput Beers vote ch hclnny scons anf pcana upc imjerw wig ste; Ela Boing pbc static void Hoin() PogljeS:Nasedvajeipalinarizan | 118 t int 1 = 235 Consoles ine("he object value = (0), 1): ) y Console.writeLine() ogekuje objekt, a ne cjelobrojau vrijednost. Kako bi zadoys. Ijla metody, CLR automatski pakira tip cjelobrojne vrijednosti @ na rezultirajuéem bjektu se potiva Tostring(). Ova znagajka omoguéava stvaranje metoda koje kay patamerar uzimaju objekt. Meroda ée furkcionirati bez cbzira na to 5 jo se prosl. jedi (referenca ili vrijednosni tip) Raspakiravanje mora biti eksplicitno Kako bist zapakraniobjekt vat uvijednosni tip, mora ga ekspicieno rasp rai To ebate wg ajedeta dv koraka 1. Proveriteje i nstanca obekta zapakirana wednost odgovarjutes wijedon- smog tipa 2. Kopirajevrjednost instance u varipbl iednosng tp Toe prikazano no slic 55. ‘Lausrjéno raspalitavanie objekt kajse raspakirava mora bit tipa koji odgovata var jabli kojoj ga dodieljujete. Pakiranje iraspakiravarje so peikazani u primjeru 5-4 mee eons i “= niet: Sika 55, Pakivaniet atin raspakiravanie Primje’ 5-4, Bakiranetraspakiravanje Aegion Using dizectives sing System; using Syeten Collections Cneric; using Syston. Text; 116 | Progrmiane ce Foe SA. Plant aipabravani aoed) Pa anton Oe paepace DOE gate class Unboragest 1 etic static void rain’) ‘ dnt 63055 dpakicanie object of 11 easpatavanie (mora its ebsplicstoo) int = Cant) 9; Consoda.irstetine( "J: {09*, 3): } Primjer 5°4 stvara cjelobrojnu vrijednost i 4 implicitno je pakisa prilikorn dodjele cbjekeu o. Ta se vijednost zatim eksplicitno taspakirava i dodjeluje novo cjelobroj ro) vtjednosti Int Rij se-rjednast prikazuie Uveini éete slutajeva operaciju raspakiravania smjestiti bloku try, kao 50 je obja8- njeno u poglavlu 11. Ako je objekr koji se raspakirava nul ili referenca objekta nekog drugogtipa,izbacuje se InwalsecastException Ugnjezdivanje klasa ‘Kase imajulanove, aan klase mote biti drugi korisnigkideiniran ip Klasa Button, dakle, moze imati ava tipa Location, aklasa Location mode sadrEavatidlanove tips Point. Naposjatkn, Point make Sade2avatiClanowe tip int Sadréana klasa ponelad mote postojati samo kako bi stuyila vanjskoj klast i ne mora postojati razlog da bude vidljva (ukratko, sadeEana klasa sluzi kao pomoéna Klas) ‘Pomona Hasu tnogete definieati unutar definicije vanjske klase. Sadrfana klasa se © paziva ugnijeédena klasa (engl, nested class, aklasa koja ju sade se jednestaeno 20ve anja Klas, Ugnijeadene Klase mogu psistupatisvim élanovima vanjske klase. Meotda ugnijezdene kKlase mote pristupit!privatnim élanovima vanjske klas, te [ee Saber [Naposljtku, javtoj ugnjedenoj klasipristupa se unutar dosega vanjske klase, Ako je outer vanjska klasa, a Nested je (javna) unutarnja klasa, Nested referiajte kao Outer, nested, gdje vanjska klasa funkionia (vise-manje) kao imenski prostor ii doseg, $2) amen salen eran pickin ie ogo ‘atcnim unucarajim klasama, U C# ne posto klase koje oda resatifins unatarmim klasana jezik Java U primjeru 5-5 prikazana je klasa Fract fonArtist koja e ugnijeédena u klasi Fraction ‘Metoda klase FunctionArt st je prikaz razlomka na konzoli. U ovom primer prikaz. vane iavodi pat jednostavnih iskaza WriteLine(), Primjer 5-5, Uptrebaugnijeddene Blase ‘region Using dlnectives sing Syston ang Syten. Collections.Generics Using Systen. Text endregion rnanespace Nestesclasses © public class Fraction c private int numerator; Private int derapinator: public racton( nt numerator, int decninator ) C st Inscdewrinator © denotes; public override string TeString) c retain String. Fommat( “(0}/(8)", funerator, denonirator }; ) internal class Froctiontrtist pubic vold Dron( Fraction # ) onsoleskritLina( “Drawing the eunerater: (0)", fsnunerator 5 onsale uriteLine( “Draving the deosinator: (0)", ‘edenouinator ; 118 | Progamiaje ce rer 5-5 Upotrebagnijetdene Kase rasta) pbtic class Tester static vid Min) ‘ xaction f= new Fration( 3, 4) Cansoereritetine( "AA: (0)", #B-ToString() 3s roction,Froctiondrt ist a « 404 fraction Fractiontrtst()s fasoran( fs ) ? Lgnijeddena klasa je prikazana podebljanim slovima, Klasa Fractionartist pruta samo jednog élana, metodu Draw(). Ono Sto je posebne zanimljvo jest da Draw() ima pristup privacoim &lanovima podacima f.nanerator i fdenominatorkojima nei imala pristup da nije ugnijeddena klasa, LUnain() motte primijetiti kako za deklariranje instance ove ugnijeZdene klase morate zadati naziv tipa vanjske Klase: fraction Frationistist fa = ew Fraction. fractiondrtiet()i Doseg klase Fractiondetist je ogranien na klasu Fraction, Peale: Nasednajelpaimeram | 18 POGLAVLJE6 Preopterecivanje operatora Projektantijezika C# imal su 2a cil da omoguée da korisnigkidefniraneklas maj sve funkcionalnosti ugradeni tpova. Petpostavimo da ste definiralitip koji predst ja azlomke. Osiguravanje da ova klasa ima sve funkcionalnost kojeimaju ugradeni tipovianati da na instancama razlomaka morate moti provest aritmeti¢ke operacie (opr. zbrojiti dva razlomka, pomnodti ih itd) i pretvaratirazlomike u ii ugradenih tipova, Mozete, naravno, 2a svaku operacju implementirati metode i pozvati sh psa jem iskaze popu: Fraction thesun = fisthraction Ad sccodractions ako ée ova iskaz funkcionirai, on je nespretan ito nije natin na koji se koriste ugra deni ipovi. Mnogo bi bole bilo napisat: fraction thin = fstFraction + secodfractio; ‘Ovakv suiskaeiintutivni i skladu su snaginom dodavanja ugradeni tov, poput nt U ovom éete poglaviu nautiti tehnike 2a dodavanje standardnih operatoratipovima koje ste sami definirali. Nauti tei kako se dodaju operator pretvorbe kako bi se korisnigki defnianitipovi moglt implicino i eksplicitno prevarati uw deuge ipove Koristenje kijucne rijeci operator U CH se operatoriimplementiraju stvaranjem statickih metoda éije povratne vrijed- nosti predstavijaju rezultar operacije ii su parametri operandi, Pilikom stvarania ‘operatora za klasu naznatujete kako ste ,preoptereili® taj operator, na iti natin na koji iste preoptertili bilo koju drugu metodu élanicu, Stoga biste a preopterecivanie ‘operatora zbrajanja (+) napisali: poblic static Fraction operators(Faction ths, Fraction 28) Jaza paramette obitno koristim nazive 1h i hs. Naziv Ths zna8 ijeva strana (engl eft hhand side) i podsjeéa me da prvi parametar predstavia lievu stranu operacije. U skladu stim, rhs znati desna strana (engl right hand side). i Sintaksa jezika C# za preopteretivanje operatora je da se ispred operatora koji se tueba preopteretitinapise rjec operator. Kljuéna rjeé operator je modifikator metode Stoge, 28 preoprerecivanje operatorazbrajanja () trebate napisati operator Kada napisete: Fraction theSun » Firsthraction ¢ secndfraction; posivase preoptereCeni operator +, pri gemu se frstFraction proseduj kao pevi argu: ment, a secondFraction kao drugi argument. Kada prevoditl vidi izesz: ‘ustFraction + secondraction ‘on ga prevodi Fraction.operators(FirstFraction, seconéfraction) Rezultatje raéanje novog Fraction koji se u ovo sluéaju dodjeluje Fraction objektu pod imenom thes, el jek [TS] Nepomena zo Ces programe svraje nest operators nije Saf, OBL, stoga binarh operator! moraju uzimatl dva operand Podrska ostalim .NET jezicima A prula moguénostpreopeetvana operarora za va last, Ostal.NET jeri Poput VB.NET-a, moda neée podriavati preoptereéivanje operatora i stoga je vazno osigurati da vata klasa podrdava alternative metode koje bi drugijezici mogli pozvati :appostizane istog efekta Sioga, ako preopterecujete operator zhrajanja (4), dabro bi bilo dodatii merodu add) koja ima istu funkciju. Preopteretivanje operatora treba biti sintakticki precac, ane jdini natin na koji objekt! izvode odredeni zadatak. Stvaranje korisnih operatora © Preoptereivanje operatora moze kod utinit asnijim ida funkcioniea poput ugrade th tipova. Ono kod moze utinti i neuprevijvim, sloenim i nefunkeionalnimn ako PrekrSite uobitajeni idiom za koibtenjeoperatora. Oduprite se iskusenjn keritena speratora na novi ndividualan nan, Naprimjer, ako jeideja preoprresivanja operatora uveéavana (+) naklasi zaposte- ska kako bi se pozvala metoda za uve¢avane razine zaposlenikove place motda pe ‘amv, to mote stort velikuzbrku za kljenteklase Preopterecivanje operaora Jenabole kori Sedo i samo onda kada je zatenje sno i sklad stainom koji funkcioniaja ugradene Kase Peale reptrevaneepertoa | 21 Logicki parovi Preoptereivanje operators jednakosti (+=) radi proverejesu i dva objlt jednala {bevolira na nagin na Koj je defniranajednakos objekata)prilién je uobigsenn, ‘Nou GH preopterecujete operator jednakosti cbavezno morate preopeeteitii oper tov nejednaost (=). Shino tome, morju se pari operator ymanje od" (0) ede ssa" GD, kao operator mane od il jednako" (+) i ve€e od ilsjednako™ O») pperatori pretvaranja Ei nt implicit pretvaraw longi omoguéava cksplicien pretvorbu Long unt Pre ayer long je implicitno (za njeno i2vodenje nije potrebna nikakva sintaksa) i Gpnmo jer mate da ée bilo Koj int sta v memonisku reprezentaciy Long. enta ac pretvaraje it Log w int mora biti eksplicitn (koritenemoperatora preva Fria) jr se pri takvom precvaranju mogu izgubitinformacije int wnt = 55 meee: slong = sylnts 1 Sapieitna Bint Gat) aytongs 1 ekeplicitn> 3) Napomena 2a Ci C4 programere: mnoge Cr+ biblioeeke zara) Frovlementac samo operators ‘Ako nazivnict nisu jednaki, upoteijebite unakrsno mnoZenje: ociva se operator, zatim konstruktor za f3 koji uzima duije int vrijednosti koje pred: “savljaju brojnik i nazivnik rezultirajuéeg razlomka. “Nova provjera wMain() 2braja int Fraction #3 iseatirajuéu vijednost dadaje novorn raalomku #4 int firstPiobet = Ihs.nunerator * rhs. denominator; 2 Ant secondPreduct ~ ae.nunerator © Ihe. denominator; return mex Fraction( ‘estroge + secordProduct, Ine.éenoinator * ths.dennitator § Fro ans 1248, 46, 86/0108, Ups slamak neste koko i d | Permian Pee Poeneoaen| Fraction f4 = #3» 55 ConsolesurieeLine(*F3 + 5: (0}", f4.Tostring Ds Ulan semoge vet horac rz preworb Strukture list coerion Faction In Fraction Constructor(int) 18 gerne Ta Fnctn eon, 8) Br Primi ee kako je operator implicnogprewaranapoovan kako bis preeni U ealomakU povrtnon kara operators impliciogpretarane et cay skeet ince svoren tazlomal 5/1, Ova) je nov alo zatin roe den jedi s Fraction 1 operators, zoe prosieden do konstelore a | conaénoj prover stvara se novi raalomk (f5). Provjerite eli on jednak razon 7 EA Ss cae i ee - Eorutaua (engl struct) je jednostavan kotisnigki efiniran tp, lak alternatva kas. ee “icukewresusline kasama u oliko Sto mogu sadréati konstrakcore, vojstva, metode, Fraction 65 « reo fraction); pula, operator, ugnijezdene tipove i indekse (pogledsite poglavic 9). 4 G65 ne f2) (Benet matpe nslcimets La’ arlora Nerina atten pda pasedvane ii destultore. So je jos vaznije, ako je Klasa teferentn tip, srukeura je _finimno(sicinonnnjuobloam ponmeroaticatedae> selees @ shsroga korisne za predstavlianie objekata koji ne zahtievaju semantiku referent Console.uriteLine(“F5: (0) == 2: 0", ‘S.ToStrine(), facTosteing()}s , U izlazu se vidi natin stvaranja fs, a zatim pozivanje preopterecenog operators opécprihvaceno stale je dase strukture trebaj kori samo za tpove koji su jednakost: Fo Jno po ponatanearaktrstikama sin adeno pov In Fraction Constructor(int, int) e Theater etc aa Napomens ra Ce progromere: tnateni Konstruke strukcure uC twveike je drugaéije od onog u C++, Stktura jew C= potpuno jd naka Klas, osim Se je podrazumijevana postavka vilivost javns rasupra privatno) drugaéia. U Ce sruktre su vrijednoen tipovi dokesu Kase referentn poi, astrukeute w CH imaju drugs opranice ‘a koja su opizana u ovom poelava fruktue su neSto udinkovtje po upottebi memorie u polima (za vie informacia Fosledsjte poglavje 5). One, medutim, mogu biti manje uinkovite kads se koriste Paci kolekcjama. Kolekcije hoe uzimaju objekteofekuju reference, a strukture jv biti zapakitane, Pakirane i raspakiravanje usporavei2vedbu pa klase mogu Pi udinkoviijeu vecim kolekcja ‘vom éete poglavlu nauZiti kako se strukture definiraju i kako se s njima radi te “Shoko se za inicijalizaciju njhovih vrijednosti mogu koristti konstrukton. Definiranje struktura Sintaksa za deklariranje strukure gotovo je identiéna onoj za definiranje klase Istributs) (ndisikatorpristupa] struct identfikator [:popissuéeljal {alae} 128 | Pogamiaiece rr anaje define stukcue. ocationpredstanla oft m vod priest et ira Location deklatira isto kao ese orit kjutna et stk. TaKObe ete 1 dr ior action va die Gelobrjpevjednos i dcihe baa al i yal. Koordinate x i y za toc menaionalno) porrSini rimietit Sto bi se deklaricala klasa, osim th elanovima instance x ete Kako se strukt svojstva. Primjer 7-1. Stvaranje strukeure region Using dizectives sing System . Uhing Syoten ollections.ceneric; ‘sing Sten Tet tedregion ranespace Cretingsstruct public struct Location ¢ private int als private ant Wal; bic tacation( int xCoordinate, Sot yCoardinate ) ial = xordinates on = yomrdinate ) public int x ‘ et return Val; ) sa «aie , ) pti ity (pt wal yo nes ) > ation su deklarirane kag pier 71. Stvarane srakture(nasavak) wie override string Tostring() return ( StringeFormat( °(0}, (2)*, Mal, yal ) Js , } pbc class Tester ppblic vod myfute( Location loc ) t oct = 505 eeey = 300; (Conte iriteLine( “In WyFne Toc: 40)", Joc Js s Bathe void Msa() cation Lact = no¥ Loestion( 200, 30); (onsoe.tstetine( “Lock location! (0), loca; Sester © no Tester); ‘onyne( 206d; angoesinitetine( “Lect location: {0)", 1oer ); “Za raze od klasa, strokture ne podr2avaj nasjeivanje. One su implicitno iave- | dee iz eb ject (isto kao i sv ipoviu Ci, ulljueujudiugradenetipove), ali ne mogu | hasjedivatiod érugiklasa nit strwlvora,Stoukrutesu takoder implicit wapecadene {oes aed Xsan srltuase ne mote ivesie star Sculte, ed bm, poput klsa mogu implemenczati vie uel, Osta aie ukjut Nema destrubtora wii rilagadenag podrazumijevanog konstruktora > srukeure ne mogu sadrdai destruksore nti prilagodene konstruktore bez pata rerara (podrazumijevane). Ako konsteuktor ne postoj, CLR ce inicjaliziat sxrukwuru i sva pola posiaviti na nulu. Ako pak navedete Konstruktorkoj nije zadan, CLR inicijalizacija se nece pokrenuti te morate cksplicitne inicijalizirari sv pola PNiemainiialzacie slur ne motee nics pointe Shops nie dope aia Batt it pl = vs 2, aka bio bio ced dase radio Last rukture su projektirane da bud jednostayne i lake za kristen. Dok privat : lana promovirajasakrivanje | ueahurianje podataka, neki programer drée ko eo prevelinagor za strkture. Oni podatke lana oznatavaju kag ave itako a | rogaine Peale siuitwe |i pojednostavnjuju implementaciju strukture. Drugi programeri misle kako svojtva ‘omoguéavaju jasno i jednostavno suéele te da dobra programerska praksa nalaze sakrivanje podataka Cak iu jednostavnim objektima. Zahvalujuéi novo) moguénost refaktorizanja u Visual Studiju javne varijable mozete jednostavnn precvortiu privatne sa pridrugenim javnim svojstvima, Varijablu jednostavno pritisnete desam tipkam siSa i odaberere Refactor ~ Encapsulate Field. Visual Studio ¢ejavnu varijablu prety rit privacau i stvoriti svojstvo s pristupnicima get i set. rokeure Su, medutim, vriednosni objet kad se Bcd powiednost-kao to motete ij Epc proseduje metodi myFune() tnpeneCloet; prosljeduju do metode oni se pro- jtiu sledecem redu koda w kojem se objekt 1) mexodinyfunc() nove se vrijednost ddjeiyju xy ite se nove vjednostspisuj lock lection: 50, 100 Kad se atte na poaivajuéu metod(n()); ponovno pazovet rite ine) vijed- . © post ostju nepromijenjene: Stvaranje struktura ae aie woe lta srktue mote svt Horie! Ken it ska ddan, MEP Solera rosin ao vidoe jeumne) serena op, ok {sto kao da se radi o klasi. U primjeru 7-1 klasa Tester stvara insrancu Location ng sljedeei natin: Location Lact ~ new Locatior(300,300)5 {se deklaraciju promijeniti u class public class Location ponovno pokrenite provjeru. Generira se sjededi ilar: tect focation: 200, 300, Tn Mfume oe: 50,300, leet leestion: $0, £00, ‘Ovdje je nova instanca nazvana lect i proslieduju jo) se dvije vrijednosti, 200 30, Strukture kao veijednosni tipovi Definicija klase Tester u primjeru 7-1 sadrdi strukcuru objekta’ Location (Lect) koja { Ove) putobjeke Location ima semaniku reference, Scoge, kad se vnjednosti promijene jestvorenas vijednostima 2001300, Slededi red koda poaiva konstruktora location {P umpc), one se promijene usvarnom objekes weg) “ Stvaranje struktura bez kijuene rijeci new “Badu da je Toca stukcura a ne Klas), stvorena "71 poevan operator new $F twation tet Location lock + ne Location 20,300); Zatim se poriva briteLine() Console hriteLioe( "Lock lcatin:{0}", eet); jena stogu.Stoga, kad jew primjeru briteLine() ofekuje objekt ali naravno, Location je sruktura (vrjednosn ip). re ‘oditel automatski pakira strukruru (kao 0 bi to utino s bilo koji drugim vrij rnosnim tipom) i tj se zapakirani objekt prosheduje do WriteLine(). Za zapakiran objekt poziva se Tostring() a kako struktura (mplcitno) nasjeduje od object, ona ‘moe edgovoriti polimorfno, premoséujud? metodu na istinagin na koji bi to ina bilo koj drugi objeke: lock leestion: 200, 300 new Location( 200,300); *{rezultirajuti objekt Lacatéon je stvoren na stogu, Operator neu poziva konstruktor location. Med ik od Kl fedutim, za raziku od Klase, struktura se a Stvoriti bez kori8tenja operatora new To jeu skladsnatinom definiranja vaijabli :agradenih tipova (poput int), kao 50 je prikazano u primers 7.2, nti pint oe YS) SS valet ott oy ‘ocd Tstring()) erento oes fou stor program koja mare raz nse polotn pogtet ye. Nastavite na vlastity odgovornost, Pakitanje se iabjegava zravnim pozlvanjem metode Tstring 7 varia- ‘blu wajednosaogtipa gdje vellednosni ip pruta premostivanje metode Tostrieg. * Vo) kj termi bjt Kaiti eleenne pone ia wiednoee pore, U aijtaebjekto Jetty progam pony neo ae pease Cnicom ae Mok ‘sjednose ove ipleraariro lao dt nated od horjeske Kase jet stogn 23 ko “(Daag natin 23 tara a je upotchs ut Fednunnitip aktucoue pradene pore popt Int mofeeponva sve merode Ofer trot elieiepe eae ‘koja depuka da reds tp poles precast @20¥OH€ oinnenow pogln @ nie 1 Paganianec Pale: Stare | 133 Prinjer 7-2, Stoaranjestruture bez kijucne edi new ner 2 Stara strubtre be lee et (nastavak) apon Using dizecives ‘ cation 0033 1 Nana poziva konstrvtora using Syston; ; u ve ‘sing Systen Collections. cenerics 1 tnictjtiira tne Using Syston Text octal + 75517 Inichjalizire 2: och yial = 225; endregion Canodesbriteline( oes}; ) » espace Struct thutiew ‘ public stract Location © atic int wal {pei prosledivanja objekta do WriteLine() 0 SU, aan eee FF abi jodmvod dodea ses v homenari ponown prevl kod nial = xCoordinate; static vold Main() t Sick is, ‘return wal; i iy : & dodlo bi do pogreske prevoditelja: we «te tad ddl sve edn motee im pristupt preko saa xi ; sei public int y Toctanal = 755 1) bodjeljuje varijoblu élanicu t loct.x = 300; 11 Koristi svojstve : Ree (yea aes set , ‘ Gulu opr pritkom kristen soa. ako ona dau pod 2a wahurvane jad * tako Sto stvarne vrijednosti ine privatnima, sama Su svojstva zapravo metode élanice, 1 autodata = nate pane dak ns ieelcat sve vel ace { reuy (Soigfomat 0), 0"), 9) 5 ) ) public class Tester ‘ static void Min() 14 | Prganianiee Pogue 7Sostire | 5 POGLAVLIES Sucelja Suéelje (engl. interface) je ugovor Koji Klijentu jaméi kako ée se klasa ili struktura ponagati. Kad klasa (ii struktura) implementira sugelje ona svakom potencijalnom, Ilijenca kaze ,ja jaméim da éu podrZati metode, svojstva, dogadaje i indekse ovog sutelja® (informacije o metodama i svojstvima potrazite u poglaviju 4, informacie 9 dogadajima u poglaviu 12, a viSeo indeksima u poglavl 9) Suteje midi altematva apseraktnojklasi 2 stvaranj ugovorazmedisklasa i njhovh Kijenaa, Ti se ugovori ota kortenjem kjutne rj interface koa deklarira ee renani tip koj ueahrie ugpvo. Prilkom definiranja suelja mofete definirai metode,svjstva,indeksere il dos dij koje eimplementrat asa kojaimmplementiasucele Sutejase esto usporedujus.apstraktnim kasama, Apstraktna klasaslutikao osnovna klasa za obienvedenih asa, dok bi se sci erebala mijedaisostalim sable nasjedivana. PA #4 ono io jeu ovom poplars navedeno ra last vedi s2a struc 43, osm kone drugatije navedeno, Kad klasa implementira sutelje, ona mora implementiati sve dijlove tog suiela (metode, svojstva itd). Klasa,u stvari kaze , pristajem na ispunjavanje ugovora kot je definiran ovim suéeljem. [Napomena za Java programere: Cit ne podrtava upotrebu pola kon stand (konstantiClanca)u suéeja, Najblita akerativa je koritenie $+ nabrojanih konstanti(enumeracj) U poglaviju 5 saznali smo kako nasledivanje iz apstraktne klase implementira odnos to-e. lmplementacija sueeja, sdruge strane, definira odnos drugatiji od ovog, a koi se naziva (nimalo iznenadujués) odnos implemensacie.Postoji fina razlika izmedu o%t ddva odnosa, Auto je vozilo, ali bi mogao implementirati sposobnost NozeSekupit ital net\eLikikredit (kao 5:0 t0, na primer, moze i ku). Mjeavine _USomervilew, réava Massachusetts, posojala je nekadslastitarnica u kooj bi vam ‘amin sladoled ,umijeSli* bombone i ostaleslatkie. Tose pioniima objckeno ‘otjentranog programiranjas oblizjeg sveudligta MIT kojsu rail na programskom jeziku SCOOPS Gino kao dobra metafora. Oni su termin ymeSavina” primijenil | faklaseu koe su se mogle umijesati dodatne sposobnosti. C++ sadefi brojne takve ase. Takve klase maj oxprilike sta ulogu kao i sutela uC “EV ow éete poglavlu nauciti kako se suéelia stvaraj, implemenciraju i koriste, Nau- “© it éte kako se implementrajuvisestrutkasutela, kako se sucelia mogu kombiniati protic kako se moze provjertje i klasaimplemensiala sueelje 7 * Definiranje iimplementiranje sucelja © Sinaks 2a definiranje suvelia je sledees: [stributi) feodifikator pristupa] interface ine suteljl:popts osrovnth suéetja 2 ftijelo sutelja} “a al ela] £ Zasad nemoje obraatipalnju na aribute; oni su obradeniu poglaviju 18. » Modifikatori pristupa (public, private, protected, internal i protected internal) bjainjent su u poglavlu 4 ‘Tea jutne rijeti interface navodi se naziv sutelja, Vobitsjeno e (ane iabavezno) da % nativsuéelja potinje slovom I dake, IStorable, tCloneable, 1Claudius itd). | Poris osnavnth sucel fa daje popis svih sutelja koje ovo sutelje prosiryje (kao St je “ opisano u sjededer odieljku) 7 : {id uel opine meds, stra drape element je mpemeninjua asa ‘treba implementirati, : ff bretpostavimo da Zelite stvorti sugeje koje opisuje metode i svojstva koja su klasi tebna za spremanje tuzimanje podataka iz baze podataka ii drugog spremista, n a 180g spremista, ns ier daxateke, To sutelie odluili ste nazvati IStorable. ‘Uovom suéelju mozere zadati dvije metode: Read() iWrite() koja se pojavijuju u tie! a () iWrite() koja se pojaduju u tijeia Interface storable t void tesa void ste bject); «tha suéela je defniranje sposobnosti za koje Zlite da budu dostupne u kl ‘Motetc, na primjer, stvorti klasu Document. Ispostavia se kako se tipovi Document “eqs spremi wba psa, ga out Dace pees see pIStorable. " “ Fegan Sueje | 137 Kako iste to utili, Korstte itu sintaksw koje biste Karis da klasa Docusent dujeiz tStorable - dvotocku () iza koje slifedi naziv suzeja piblic class Dacaneat : rStorable ¢ public votd Read) f..-) Public wold uritefobject bj) {...) ) Dali je vaba odgovornost, kao autoreklase Docane, osigurat smislenu implemen, tacija Istorable metoda. Buduei da ste naveli da Document i sve metode iz {Storable,u suprotnom ée se prilikom prevode, To e prikazano u primjeru 8-1 ukojem klaseDocunent imp ‘orate implement ja dogoditi pogres -mentica sudele istarable. Primjer 8-1. Korstenje jednostavnog suelja region using dizectives sing Syst ring Systen collect using Syste Text; ‘endregion rauespace sinplelnterface YY peddartes seiye interface Isterably ‘ 11 Nera noditikatora pristupa, netage sy jome 1 ea Seplenentaci je oid Read); wold Mrite( object obj 9s int Status (gets sets ) ) 1 ravi Klass tofa Seplenentira autedje Istorable public clas Document + TStorable é 11 Spreea vriednost 23 svojstvo prsvate int status « 0; Sng 5) public Docament( = ‘ Conse ciitel inet“ ) eating docutent with {0)", 5 35 1 plenentiza actody Read public void Read) plemersira IStorab, a, Roviteiejednostavnogsucelia nastavak) 1 uateste te . lieing the Bed wethd for tne"; 1 tnpleentza metoay weit fate vid Write abject © ) Congote-triteLine( apleenting the Write Nethod for IStorable" ); ) 1) saplenentiza stesstve polse int states et ¢ } t status = value; 1 oristi sede nbc class Tester t static void taint) 11 Pesta ett v aj dct Seco cw et ret” J: sociteed), Ceneteritetine( "want Sous (0, desta Js Urine 8-1 definicano je jednostavno suche TStarable koje sade dije merode (Gead() site) i svjstvo (Status) tipa integer. Obratitepaznju da deklaracija so} stva ne prua implementa 2a et()set(), ne jednastavno gznaéava kako postoye set() i set() dnt satus (gets sets} Obratite padnjui da deKlaraciia metode Tstorable ne ukjiut yo modiikatorepristupe (public, protected, internal il private). Navodenje modifikatora pristupa u swat genera pogteSkn ws peevodenju. Metode suéelja su implictno public je je sutelje 138 | Propanijece Fogel | 29 ugovor koi tebaju Koristti druge klase, Ne moet stvritinstanct Sutels; unjes toga mozete instanciratiklas koja implementrasuzele Klasa koja implementirasuéelle mora totno iu potpunostispuniti Ugovor. Docuney, ‘mors prufiti i metodu Read() i merodu write() te svostvo Status. Nazin na ko} ispuniizaltjeveovisiisljudvo o klsiDocunent.Iako TStorable odteduje da Docimey ‘mora imati swejtvo Status, ta suéele ne na ni mu jebitn eli klasa Document ssn status spremila kao varijablu Clanic il ga uzima iz baze podataka. Pojedinost song implementacisko) kas. Implementiranje vige od jednog suéelja Klase mogu implementirati vie od jednog suéeia, Ako se, na primie,Klasa Docume mode spremii, a mode se takoder i kompriniat, motetetmplementiat i suey, Tstorabie i sufele Icoupressiole. Kako biste to uinl, promijenite deklaracu (pope csnovnih sue) kako biste navel da su implementiranaobasucela. Suéela odie public class ocoment¢ storable, Xompressibe Ionpressibe (koje edeklarirano u primjetu 82 pai wl cae | Console. weitetine(“Teplerenting the Cenptess Method"); ) pute voss Decenpress() Console hriteLine(“Iaplenenting the Oecompress Hethod"); ) Prosirivanje sucelja Pesiojee suteje mote se protirit kako bi se dodale nove metode il lanovi odnosa ako Bi ve promienio nasi funkcioniranjapostojeihelanova, Tonpressible mote, na primjer, prositi novim sueljem TLogge@Conpress ibe koje podeino suéee role ruje metodama koje evidenteau pobranjenebajtove interface Loggedcenpressible + IConpressble void Lopsavessytes(); Ako Komtesibe prot na or natin, zapravo naanatuee dive aS 4 ‘ono ito implementira ILoggedCompressible mora implementiratii ICon- 5 presinie ‘4a | Programianece Kad jer utinjeno, Kasa Dociment mora implementirati metode koje zadae sutee | se sda sobodno moge implementa i omtessie il LaggedConpressible, sno oom teba lim dodacnafunkeionalnost. Ako klasa implementa ToggedCon, sible, ona mora implementrat sve metode iz SLoggedConpressible i [Conpress!. Objekt 10g tipa mogu se pretvorit u TLoggedCompressibie i'w 1conpress oe biniranje suéelja ino tome, ova sua mazete stort kombiniany faao dodajti nove metodel soja Naprinjen motets seer ero be, Tobi stele kombiniralo metode aba suzeha, ali bi dodalo rove meena og Seman ore Velitineunaprijed komprimirane save interface Istorbecnpresie fem postojeih sueelja i, opcio Storable, Loggeatenpeessible ‘yd Lagoriginalsize()s , Pinjr 8-2 Profivivanjei ombiniranje suceja oepion Using Srectives sting syste: ting Spsten. Collections. Generics ‘sing SystenTexty teregion sarespace ExtendiConbinenterface t interface TStorable t void feaat); void write “object obj ); int Status (get; set} > 1 0 nove sutejo Inefce Karen vod Conpress(); void Deconpress(); 1H hrotizente sutelja fmerfac Mopersogresssie: Xapressble void Lopsavedytes(); MW tonbinseanje sutelje {mterfaceIstrebeCoresssle + Istorble, neggecarpessble "Poses: Sota | Primjer 8-2. Proirvanie i komsbinivanje sul (nastavak) vod Logoriginsisize(); 1) 208 jedno sutedye Sntortace TEneryptable vote Encrypt); vote beesyptOs ) public class Docanent + 1StorobleCoupessible, HEncryptable ‘ 11 Dr podathe 28 svajstvo Status suéelja IStorable private Snt status = 03 1) eoetrvktor éokanenta public Docanene( strings ) ‘ ‘onsole-ariteLine{ “Creating document with: {0)", 5 )5 ? 17 tplenentctja Istorable public void Read() ‘ Console sriteLie(, "apleenting. the Read Nethed for IStorable” ) public void write( object 0 ) t Console kritetine( uplenenting the write Method for Istorable” ); ) public int Statos et t return status; i , ue; ) 11 inpenentacija Compressible public void compess() { Console.meSteline(“Taplenenting Conpeess* ); 10 | Poganianie@ sinjer #2. Proirivanje : kombinianje ucla (nastavak) pease void oeconpress() Console riteline( “Iaplenenting Secnpress” ); » 11 plenentixanje Hoggedconpressible public vote Lopsavecdyees(), ‘omsalesriteLine( “Uaplonenting LogSevedytes* ); ) 1 Ioplenentixanje 1StrableConpressible public void LogOrigialsize() t , oosoleuriteLine( “Toplennting Logoriginalsize™ ); 11 Inlenertizanje tEncryptable pate wid renee (omsoleiasteline( “Ieplenenting Encrypt” ); ? pe soa tenet) Conse. riteLine( “Inplennting Secrype™ j; ? pblic class Tester Static vod tint) 1 Prat objekt dokument Document doc = nw Uocunet( “Test Docent” ); 1 fretvara dokument 22 razligita sutelja storable 1sdoc = doc 36 Itorable, Af (isboc te null) { fsbec.Read()s ) use ConsaleviriteLine(“Istorable not suported” ); Kanpressible cdoc = doc a5 Kconpressible; iF Cedoc t= null) Posies Stas |W Prinjer 8-2. Prosirivanje kombinivanie suceja (masta) feta. conprests else Consae.u eLine( “Compressible not supported” ); opgedCorressible iledor = dic a8 ToggedCopressiple; sO CaeGne = eal ) c boc. ogSavedBytes(): Seboe. compress (); Slee Read; else Console. WiteLine( “LegeedConpressible not supported” }; Storablecnpressible isc = doc a5 IStorableConpressible; if (ise mull ) Ssc.logriginalsize(); 17 IstorableConpressble se Logavedtytes(); 17 ToggedConpressible se Cnpress(); 1 Keorressible Sse.teat); U1 astorabe > se ‘ ConcaleskriteLine( *Storableconpressible not supported”); ) enceyptale Je « doe 95 TEncryptables if (ef mall ) ( seenesypt(); else Congle.nriteline( “Enexyptable aot supported”); Primjer 8-2 potinje implementacijom suéelja 1Storable i sutelja ICanpressible, Ov drugo se prosiruje u ILoggedConpressible i zatim se ta dva suéelja kombinirajuu I5t rableConpressible. Naposijetku je u primjer dodano novo suéelje Lencryptable, Progeain Tester stvara novi objekt Docunent I zatim ga koristi kao instancu razlittih suéelja.Slobodno modete pretvarat: onpressibleictoc = doc 35 Iorpressibles ‘No to nije poreeono. Prevodicelj ana da doc implementira TConpressible i mode ovo pretvaranje uéinitiimplicitno: onpressible icboc = docs a4 | Pryaiaiece nist sigurni implementiraliklasa odredeno suéele, modete korstti operator as ene eoisan unastavkotog poglava) zation proven jl objet rear i} (to govori da pretvaranje nije bilo dopuSteno),urmjesto da peetpasravte preteary, i riskitate iabacivanje tznike eee eae Heowpessible S pyevaranieu prodirena suzlja od objet petvorenu ToggedCnpressible motete kori suele a porvanje rmecoda na IConpressible jer TLoggedCompressible protiuje ( sogs obatvaca merce esnornog suteli a Pol ‘RoqedCnpressible Slee + doc ms Nhopgeomnessite i coe |= wil) a eenee t Lebo. LgSeedtytes(; ‘ec: Comress( Seo teat ) emotes, medutin, pozvat Rest) er se ao metodi sue 1Strabe javezano. Ako poziv metode Read() izdvojite u kor atte pogretk pes porsano, Ako pa noes) dot w homens prin pee pe ‘Ako pretvoriteu Istorableconpressible (koje prositeno stlje kombinira sa suéeljem 'torable), onda moter posta metode stein Istoroletone Be ja IStorablecompessibe,Icmpressi- ‘orblecapressble ic» de as TSobleoresstte Af (ise f= nut) Seth 7 Hi iscegriinasirg); 7 storbecnpesie Begone) 1 Logeanerege isecommesy 7 totes Scan ‘rsa Pristupanje metodama sucelja Clanovima suzelja Istorable me Canovima sutels1Storable motete pristupt kao do pristpateelanovima Klsse doc.status = <2} nest oe » Sten; Tait eich |S. Motete i stvoritinstaricu sue’ tako da dokument pretvoriew tip suéelai zat ry suéel koristive za pristup metodama: storable fs00e = docs estate = oe Rea; U com slutaju u tain() znate kako je Document zapravo IStorable te moZete iskovsti to znanje ine izvest eksplicitno promijenu tipa ili provjeru promijene cipa Kao Sco je ranije navedeno, suéela se ne mogu izravno instancirat. To jest, ne modee napisati storable 1sdoc « new IStorabe(); Medutim, mozece stvoritiinstancu implementirajuée klase, kao u sjedegem odlomly | oda: Document dee = new ecient” acumen"); Moiete zatim stvoritiinstancu sutelja tako da tip implementaciskog objekta preto. riteu tip suéelja, «to jeu avom slugaju TStorable: storable fs + doc (Ove korake mofete kembinitat tako da napisete storable isDoe = new Oocunent("Test Docutent); Pristup kror see omogacava da suéejetretirate polimorino, Drugim rjetima, die ili vie klasa mogu implementirai suéeje, a ako tim klasama zatim pristupate ikl ivo putem suéelja, moZete zanemaritinjihov stvarni tip tjekom iavedbe i tretiratih nalzmjenitno. Vige informacija o polimorfizmu potrazite u poglaviju 5 Pretvaranje usutelje U veeini sludajeva se ne zna unaprijed podrlava li objekt neko sutele. U kolekit ddokumenata mozda negere znati podriava li odredeni abjekt suéele TStorable il cw pressible ili obs. Mogete samo pretvarati u suéelja Document doc = nycollection{0}: storable 1stoc « (asterable) docs sDae.Rend();, KonpressiBle Loc = (ICompressible) doc seboeConpress()5, ‘Ako se ispostavi kako Document implementa samo suéelje IStorable: pwilic class ocunent + rstoroble prewvaranje u IConpressible ée se ipak prevesti jer je 1Corpressible valjano sutel, Medutim, zbog nedopustenog pretvaranja ée se prilikom pokretanja programa iz citi ini 1H, precanjeispravno preset eferenc u objet kt ipleemie sue 6 | Proganiane a 2 Usp exception of type System. Irvalidcasttacepion was thrown, ipnimke st iserpnije objaSnjene u poglaviu LL ‘operatoris {Korisn bi bilo pitatiobjekt podrZava li on sutelj, a zatim pozvati odgovarajude erode. Tose u C# mode postii na dva natina,Prvi je koriStenje operatora is, Obie erator 1S est 3 Jina $8 tip “Operator is ima veijednost true akose izraz (kojimorabitireferentni tip) moZesigueno “petri tip bez izbacivanj iznimke. U Primjeru 83 prikazana je upoteeba opera a i za provjeru implementira li Docusent sugelja IStorable i IConpressite, a, Napomena za Java programer: operator is jecika C# odgovara opera toma instanceof jet Java, * ae ‘Frinjer8-3. Kordtenjeoperatora is epice Using directives “ging Syste, {sing Spster.Collections.Ceneric; sig Syten. Text entregion 1 soterface tstorante c vid Real); Ge aie ttet jee 09); nt status { get; set} 1 Nowe sutelje intesface Teonpresssble ¢ vod conpress()5 Voie Decanpress(); 1 ocunent inplenentixa 1Storable bli class Document | Tsterabde oper paris operator ss (pian unastanku polls) mogase, sim zprovervimplementace sue ecu a procen pov kar asec Sigs eich kaka ae pemeel eas Pole Sue [17 Primjer 8:3. KoriStenje operatora Ss (nastavok) ( private int status = public Docunent( string s ) t Congole-riteL nel Creating document with: {0}", 5 9: 1) rseorable.tead public vold Reod() t Consolesritel esc. ) 1) astorablesirite public void Writel object c ConsoleseiteLine( “arg. .")5 17 1scorable, status public int Status ‘ et return status; » ‘ status = value; ) ? > 17 Tevet iz Document 4 inplenentira ICanpressible Dubie class Comaessibledocament + Oocament, Leanpressthle { public CempressibleDocunent(String 5) base(s) a ule wosd compress() i ConsoleriteLine(“Conpresing. ) public votd osconprese() c y Consote.uritetine(“Decenpressing-..7); 148 | Pogramianjecr Frimjer @-3- Koritteneoperatoa i (asta) } eblic lass Testor state void Mint) 17 Kolekcija Documents ocunent|} Jockray = Pew Docent}; 1) bes os je Cocerent ockrrayfo] = acm Daciment( Test Oocutent™ J; 17 brug wos Je Canpressblenocumet (ured je 7 Sor je Lonressith becuse bocumst) ockrraya} new Conpressibletocient Test compessibietocaent”}; 11 Me mane Sto Cems SU Sa Hebe foreach (Document doc in dchr209) c 1) tspisufe sine Console sirteline(*cot: (0), dec)s 11 Obie protae test 4 (Goes TStorable) ‘ storable {sboc = (IStorable) acc; ‘Doe.Read(); ) 1) e wspeva 2a Decent, 1 rolazi 2a Conpressiblebacunnt 4 (doc 1s Teopressible) { eampressibie Letoc = (Wapresstbel docs dee. Corpress(); ) * Primjer 83 se od primjera 8-2 ralikuje po tome Sto Docunent viene implemetira "sulle Compressible, ve ofini klasa koja jeizvetena iz cima ove Se Comptes = sthedocunen sin() provjerava je li svako prewvaranje dopusteno (ponekad se nazivai safe) provje- “Prog slededi uvjer i 4 (doc As Istorable) nje dogoditi samo ako objekt pripada ispravnom tipa sucels ‘Tie postupakjasanigotovo da sam sce objajava. ska gover da ese prt PenjeSueha | 18 Klasa Document aspjesno prolazi tu provjeru, ali ne zadovoljava sjedecu: iF (doc Ss TCompressible) Conpressibledocusent 2adovoljava obje provjere Obs tipa dokumenta stavljamo u polje (mozete zamislii predavanje takvog pola rmetodi koja ne mote znati kakav je sadréa) polja) Pre nego Sto pokubate porvag, rmetode iz Icompressible, morace bit siguin da tip kojem pripada Docunent implemen, tira IConpressible, To ée umjesto vas provjeriti operator is 'Na Zalost, ovakva uporreba operatora {s nije utinkovita. Kako biste razumjeli 2aio, ‘morate pogledati MSIL kod koji se generira. Evo malog adlomka (primijetitéete kak su brojevi redaka u heksadecimalnom zapisu) Thom: isinst —Ionpressible ome; brfalse.s TL0039 Hove: Iatoe.0 Lomb: castelass Teonpressible 1ooso: sthec.2 Toon: Ides? Teo0n2: Gallvirt instance void LConpressible::Compress() Najvaznija je provjera TConpressible u redu 23. Kljutna rijet isinst u MSIL kody 4 ‘oznatava operator 1s, Ona provjerava je li objekt (dc) doista pravog tipa, Kad je ova Provjera zadovoljena, nastavljamo na ted 2b u kojem se poziva castelass. Nazalos, castclass takoder provjerava tip objekta. Provjera se, dakle, izvodi dvaput. Utinkow tile riegenje je upotreba operatora as Operator as Operator as kombinira operator is s operaciiama pretvaranja tako Sto prvo provereva jeliprecvaranje vajamo €o jest, bili provjera sis vratilatrve),a zatim, ako pretvaanje jest vajano, zaviSava pretvaranje, Ako pretvaranje nije valjano (to jest, ako provjeras 4s vrati vnjednost false), operator as vaca vrijednost nl. Kijuéna je aul predstaia praznceferenct-onu koja ne poke Sg. nina jedan objeke Koritenje operatora as eliminira potrebu za obradom iznimki pretvaranja tipa. Uisto unijeme iabjegavat i vostro provjeru pretvaranja 1th je razloga za pretaane tipa stele najbolekoristti operator as Oblik operatora as je inner as tip Kod iz primjera 8-3 je wslededem odlomku koda prilagoden tako da se korist oper {or as i provjerava se hoge li povratna vrijednost biti mull: atic void Maint) 150 | Pegamianie 11 Keka documents Dacunent{} docarsay = new Docnent{2}s 17 Peak 00s Je oacaent ockray{0) © new Docunent( “Test Docent” }; 1/ roi wos je Conpressibledocunent (sto Je v rey Jer 17 je CinpressTledvamert Coca) nckeray’] = neu Conpressibledocunent("Testconpressibledocuent*); 11 Ne mao Sto geno inc $2 Sesira foreach (Document doc 18 doce r3y) ‘ 11 Yspisuje ine Consoleniziteine“Got: (0), doc); 1 Obje prolaae test IStorahe isdee = doc 96 Istorable; 4 (aoe t= mult) soe. tose); ) 11 ke polazi 23 Document 1) Prolai 2a Coapressibleocanent oapressible ieDoe = doc a2 Tanpressble; if (leo fe malt) { edoc.Conpress()5 $29 No popledace odgovarsjudi MSIL kod, primijtitéete kako je ova inatica daleko Ee xinkoviia: 100 Ion pone: oon sinet —anpressible aloe. 2 bfalce.s Lome ecs2 callvirt instance void 1compresssble:Conpress() ;Usporedba operatora isi operatora as. 4 No Felice proveriieliobekt odgovarajuegtipa te ako eto tao, odmah pretvort Fobickeu drug) ip, operators je mnogo ueinkoviij. Fonekad eee medutine motde ec provjen tip operator, ali ganedete odmah prevviti. Mode pa Zelte samo rove, a pretvaranje vam nije potrebno-jednostayna ga oj zadovoljavaju odgovarajuce suéele. U tom je su¢aja bole kristi operator is, lite dodatina popis onih PelojekSaija|181 Usporedba sutelja s apstraktnom klasom Sutela su vilo signa apstcaktnim klasam. Deklaracju sutelja Strate zaprry tmofete promijeniitako da bude apstraktna klasa: Fmplementiraa Klasa moze neke, il sve, metode koje implementcaju sul slo- borin oonadti kao virualn,lzvedeneklase mogu prenosti overran cjekako bi poste polimorica. Na primer sa esse eee eo sudele IStorable i metode Read() i Write() oznatiti s virtuz mle ov rd prodtat ead) izapist (rste() wipe. Racvoy FF iocinentizvodii nove ipove, ete baze pod hstract class storable abstract public vois teas} sbstact public vod write); inl ingenjer mode kasnije ' a primjer te ili fmailMessagete moze odlutit kako vaka ii zapisivat w nju, ane u datoteku, “1.U primjers 8-4 pojednostavijen je agen © implementacie suceja. Metoda Read() je pret ted st atm premaone vip Docunent sada mode nasliedivat iz Storable i ovakva se upotreba ne bi mnogo razliko. vala od koristenja suéelj iene brimjer 8:3 j prikazano je premoSéivanje ‘ztaéena s virtual i implementita je Docu- Note kojlizvodi iz Document, Pretpostavimo kako ste klasu List kupili od nekog proiavodaca te da njene sposob. rostiZelite kombinirati s onima defintranim u Storable. U C++ iste mogli sevori, kKlasu StorableList i nasledivati i iz List i iz Storable. U G#, medutim, nema takve ‘moguénosti, Ne mogece nasljedivati ‘iz apstraktne klase Storable i iz klase List jer (C# ne podeZava visestruko nasljedivanje kod klasa, | Prinjer #4, Premotcvane implementa sue “gin Using drecives CH vam, medutim, dopustaiemplementiranje ncogranigenog broja suai iizvodeje izjedne osnovne klase,Stoga, ako od Storablenatinite sutelje, moder nasliedivaiiz klase List i iz sudela Istorabe, kao Stow u sljedegem primjeru ini Storablelist: public class storbleist + List Itorable t 17 ove popisitretose public void Resa) (0--) Public void urite(eDject bf) (++) ve sing stem; thing Sp5ten Collections cenerSc; sing Syston. Texts senarenion ‘umsice overidinglaterface c Amertace 1Storbte ‘ void Read); . void rite); [Neki Micrsoftravojlindenjrine preporutujuupotrebusutelia, ee pre- y ‘eres apscakane osnovne Klas bog jednostaieg pragena nates, 1 Pajednostamjuse Docuent da Saplementira sano IStorable ey Pretpostavimo kako ste projekeiral suéle i programeriu vaio) tvrtct pwblsc clase Dotaent : TStorathe « fg pocn kos. Sada tom sueel Zeitedodati novi lan, Na rae- polaganju su vam dij loSe mogunosti: mofete promijenti suc | prekinuti postoeti kod ili sufelje motetetretrati kao nepromjenjvo i ori na pritiet, Istore? ii 1Storagebstended. Ako to Ces nite, bras dete imatldesetkeusko povezanihsuéelai kod é biti kaote” rom stanja 17 Keastruktor dokunenta spate ements) Console rite ine( creating docinent with: (0), 5); ‘Ako korstve apstaktnu osnovne klasy, now virtualny metodu ‘modete dodati sa podrazumijevanom impementacijom,Postojesi kod {ei dale funkcionirai, ali sew imenski prastor ne uvodi nova klas, Ako stvaraebibiocela lasakoju Ze ponovn keris elke ro} jdt (esobito ako seradioliuditm ivan vate vee), jerojatno je nsibolje keris apstaktne conovne klase, Ako, medutim, sevarate klase 2a jedan projekt, koienjem sutha kod ée bit leksibinijiiednostavniji 2a ranummevane , 11 tos Etanfe virtualnin Public virtua vote Read() ‘ congo steLine( "RMURERE Ee etd for IStorable 1; Ne vistualna! 132 | Progamiranjece Pesan Suleha | 153 Primjer 8-4, Premoscivanjeimplementacije sul (nastavak) public vold krite() © gga nase iret ocaent wits Nethod for Istorable” ); ? , 1) trod 12 Document public clase Note + Document public Hotel string ) base(s) conga trite in eating note with: {os $5 ) 11 Premateuje metody Read ‘pic eeceide vod Read() c Console tritLine( overriding the Read wcthod for Hotel” i , D7 anphenenzan woe last itu tod Mri public new void write() ‘ angalenitLine( Mtopietenting the write method for Note!” ); > public class Tester static void Maing) q 11 sevara refereney dskunanta do objekta tte Docisent thetote = ew Note( "Test Rote™ ); storable isote = thoote as Tstorables Fe store Ie null ) ‘svete. tend; svete urite()s a console -eriteLine( “\n" i 1 coxa oni seteds thehate-Reod(); ete meite()s ConsolesriteLine( "\8")5 154 | Prgrianje ce Fane 8-4, Premoscianje implementa sucee rastavah) S 1 Pra abjekt Note fate noted = new Nate "Second Test" )s TStorable sstote: = noter as TStorsle; HC astote: I= null) sstter.Read(}; ten ste(); > cansoeitetirat "We" )5 11 Tarawa poniva netode tote. Read) pater ritel)s > > ‘Uovom primjeru Docusent implementira pojednostavleno sutelje EStorable (pojednio- stavjene kako bi primjer bio Eco jas) vod ead); void uritel)s ) Razvojni inZenjer koi je stvorio Docutent je metodu Read() oz to nije udinio s metodom Mrite() io kao virwalnu, ali pbc virtusl void Read() U stvarnim aplikacijama, kad jednu metodu oznagite kao virtualnu, najjerojatnije biste i drugu oznatil s virtual, ali ovdje je imedu metoda napravjena raza kako biste vidjli da razvojni indenjer maze slobodno faabrati koje & metode biti viems- alae Klasa Note izvodi iz ocunent: puolie class Ate + Oocorent © ote ne mora premostiti metodu Resd(), no moze to slobodno utiniti, ko 8to je shuts} primer: pubic override void Rend() Utester se metode Resd() i eite() pozivaju na Ztiri natina + Proka reference osnovne klase do izvedenog objekta + Preko sudelja koje je stvoreno iz reference osnovne klase do izvedenog objekta *+ Preko izvedenog.objeksa + Preko sutelja kojeje sivoreno ir iavedenagobjekta Pele Soha | 155 Za postizanje prva dva poziva sivata se teferenca Docurent (osnovne Klasa) i adresy novog abjekta Note (izvedenog) koji je stvoren na gomili dodjeluie se releren; Docunent: Dociment theate = ne Hte("est Note"); Swvara se ceferenca suelai 2a pretvaranje Oocutentu referencu 1Storabe Kori se operator as storable fate = thetote 26 Isterble; Zatim se metode Read{) i Write() pozvaju ktoz to suéelje,Lalaz otkrva kako se na ietodu Reaé() odgovara polimorino, Sto, prema o€ekivanju, nije sluéaj s metodom write Overriding the Read method for Nott Docunert rite Method for IStoraole ‘Metode Read() i rite() se zatim pozivaju izravno na samom objekte: theote Read); shetatecarite()s i ponovno motece vidjeti kako je radile polimorina implementacija overriding the Feat nethod for Note! Docanent Rrite Method for IStarable 'U oba shataja poriva se metoda Read() iz Wote i metoda Write() iz Document. Kako biste se uvjerli da se radi o rezultatu premotivanja metode, stvorite drugi objekt Note i njegovu adresu ovog puta dodifelite referenci za Nate. To se koristi za prikaz konaénih shu€ajeva (tj. pozivanje kroz izvedeni abjekta i pozivanje kroz sulle stvoreno iz izvedeneg objekta) tote rated = neu Note("Second Test"); Ponovnose prilikort pretvaranja u referencu poziva premoséena metoda Read{), Medu- tim, kad se metode pozivaju izrayno na objektu Note: sotea-Read( sotez Mitel); ialaz pokazuje kako ste pozvali Note, a ne premo8enu Docusent: Overriding the Read nethod for Note! Inpleeenting the Write method for Note! Eksplicitna implementacija sucelja U implernentaiji koja je prikazana, implementrajuca klasa (u ovom sluéaju Document) stvata metodu élanicu koja ima isti potpis i povratni tip kao metoda iz suelja. Ne treba secksplictno oznaziti kako se radi 0 implementacii sucelja- prevoditel to impl- uno razumije 156 | Pganinjece EF S10 &e se dogoditi ako klasa implementira dva suéelia i oba suéela sadrée metodu © sisim porpison? U primera 8.5 stvoren su dvasudeia: fstarable i Iaik, Droge + sate implementiza metodu fead() koja koji ta na plas, Ona se, na Zalose sue bjavas metodom Read) iz sucejaIStovable. ‘uduti da i tStorable i 1Tale sadrée metodu feod(),implementirajua klasa Docu sent mora barem za jednu metodu korstit eksplicitn implementaciw U ckspictng} inpleetaih implements Klass Gren spicing lentes sev void Talked) ‘Tosefava sukob, al stvara i nizzanimivih muspojava Prvo, druga metoda Talk) se ne eebaeksplcitnoimplementira: pic void Tolk() ‘Bila nema sukoba, ona se moze dearirati na uobigajen natin, J vadnije, metoda s eksplicinom implementacijom ne mo%e imati modifikator pastupa void Totksteal) ‘Taje metoda implicieno javna ‘Metoda koja se deklarra patem ekspliitn implementacije se, ustvari, ne mote dekla- sats modifkatorima abstract, virtual, overrige new. : Nadal, eksplicitno implementicanoj metodi ne motete pristupiti kroz sam objekt. Kad napigete: ; pawn 7 thease ead; prevoditel ¢e pretpostavii kako se to odnosi na implictno implementirano sutelje 22 Istorable, Jini natin pristupa eeplicitno implementeavomsheehuie pecker waranja u sudelje: " one Talk st0ee = thedacs st0ee.Read( ‘Eksplictna je implementacija prikazataw primjeru 8-5, Primer 8-5. Eksplictna implementacia ‘region Using eizectives sing Systems ‘ing systen. collections, Generic; Using Syeten Texts endregion tanespace Explicitimpenentation Pole Sela | 157 Primer 85. Eksplicna implementacija (rasta) interface IStorable oid Feast); ‘oid Mrite(); fnterface Talk ‘ void Talk(; void Reads ) storable 4 Talk 1 rdstiactjaCocment do rpleentira Star folic class Socment 1Storable, Tale 11 Ronsteuktor doconnta public Doconent( string’ ) ConsobeciriteLine( "Creting dociment sith: (0)", 5) } 17 Cink Read() vistuainon public virtual void Read() ‘ ) public vod Write() ‘ Concole.nesteLine(“nplnenting Istorable.tead* ); ConsoleriteLine( "Iaplonenting 1Storabe, } void Talk ead) c : public void Tak() ‘ ConsolenriteLine( “Imploveting 1T3Ik. Read" ); CangoleiriteLine( “Inplenenting TTalk.Talké ) public cass Tester t static void rain() 11 Pra obese dokoenta Bocinentthei5e = new Docanet( "Test Donen”) 158 | Progamirane "pijer 85. Eksplctnaimplementacia (nastavak) storable Ssnee = theooe; soe. Read() Trak St09- {teeta tneoveReed; ‘heD0eTALK( Selektivno izlaganje metoda sucelja Ravoj indener koji je tori klasu mote iskorstinjenicu da, kad fe sudelje iplementirano krox ekspicinaimplementacj, delle ne vidio kljentina og ientrajuceklase,osim ako se koristi pretarane tiga retpostavimo kako semantika objekta Docent zajeva da on implementirasute le 1Storable, ali ne elite da metode Rea() i wzite() bud dio javnog sutelja Doce, sent. Motetekoristit eksplicinu implementaci kako bist osgurali dasute mecode desuupne sano kroz pretvarane ipa, To vam omogueava efuvanjeavnog APL ja Docs sertistovremen implementacij suteja storable. Ako vasem Kjentu tebe ober koji implementa sudelje 1Storable, on mote izvesti pretvaanie ali kad dokureent fowist kao Document API neGe uljucivat Read) iite() Eksplicenom implementacijom, u star, mofete izabrat koje e metode biti vidlve kako bisteneke implementacske metode ilo kao dio Docament, a druge ne, U Bimjeru 8-5 objec Document ielaze merodu Talk() kao metodu koja je dio hecurent, ‘pometodi Talk. Read() moze se pristupt samo kroz pretvarane tipa, Cake ike sate lie 13torable ne bi sadrzavalo metodu Read() mogl bist eksplicitn implementicati Read) kako metodu Read() ne biste ilotli kao metodu i Docurent, Zbog toga Sto ekspictna implementacija sul sprjecava koistenje kljutne rich virtual, ivedena klasa morala bi ponovno implementiati meted, Stoga, ako je Note invodila iz Document, ona bi moral ponovno implementa’ metod alk Reod() Jer Document implementacija ITalk.Read() ne mode bit virtualna Sakrivanje dana ‘Glan sutelja moze biti skriven. Pretpostavimo da delite da: ‘sutelje TBase ima svojstvo P: sntefoce Ise nt gets set; ) Pretpostavimo ida iz tog suéela izvodite novo sutelje 1Derived koje svojstvo® sktiva ovom metadom P() Peso Sutcha | 159 interface Werived : Tease row srt 0 ? Zanematimo li pitanje je li ove dobra 2ainisao, svojstvo P sada je skriveno w osnovnon sugelju. Implementacija ovog izvedenog suelja zahtjevat ée najmanje jednog ekspicn, ‘nogélana sutelja, Modete Koristiti cksplicitnu implementaciju il za osnovno sigelje i za izvedenu metodu, ii ju moiete Loristiti za jedno iza drugo. Stoga, sve ti sjedege inatice bit ée dopustene: lace wyClass + Terived ( 1/ eesplicttna inplanentactya ra ostomo svojstvo Ant ase. {get (ou) ) 11 weplicitea inplenentactja invedee netode paiblic int PC) (22) class wylass + terived t 11 iwlietna Soplanentaeija 28 oso. svojstve public int P ( get {-..) } 11 fksplicitna ‘aplenentacija tavedene netede Sot terived.20) [.=+) class mass : Ioerived 11 Cesphicitna inplesentactja ra osnovna svofstve ‘nt Tase.? { get (---} } 1) Besplicttna Seplenertacifa Savedere eetode Sine Tersved.0() {---) Pristupanje zapegacenim klasama i vrijednosnim tipovima Mecodama suélia uglavaom je boljepristupai krox petvaranje sue, Lzniml 50 vrijednosni cipovi (npr, strukture) i zapeacene klase. U tom je shitaju metodu satel boljeporvati kroz obekt Kada sufele implementirate u strukeuri, zapravo ga implementirate u vrijednosnom ‘ipa, Prilikom prevvaranja tipa w reetencu sutelja dolazi do implicitnog pakirania cobjekta: Na Zalost, kad to suéelje koristite 2a modifikaciu abjekta, modificirare zapt kiran objekt,a ne izvorni objekt vrijednosti. Nadal, ako vrijednoststrukture prom jenite iz metode, zapakirani €e tip ostati nepromijenjen. U primjeru 8-6 stvorena ssrukura koja implementira suéelje 1Storable i prikazane su posljedice implictoog pakiranja prilikom pretvaranja ipa srukture u referencu sucela 160 | Pegamiaiece jer 8-6. Reference na vriednosne ipove seg ystens pci ing Srectives sang syste Ting spsten Collections. Generic, Aine 9 3 Ag syste. Tet orespace Feferencesonvaluclypes { 17 gelatita jedpastavo sutelje fneerface Tsterable { vid Read; Ant status { getsset} ? 11 eplenentira kre struktury public struct mystruct + TStorable ‘ public votd Read) f Consolestritt ine( “Taplenentirg Istorable.tead!”), ) public int status ‘ et ( turn status; ¢ status = value; 1 | Prvate int states public class Tester ¢ state votd Wate() 11 Pravk objekt nystruct ryStruct thastrct = new ayStrct(); Athestruce.Status = <4) 1) Ineljaliziea “Pogoes utes | 161 Primjer 8-6. Reference na urijednosne tipove (nastavak) congalesMriteLine( “thestruct. Status: (0)", thestruct. status ); 1) jena vesjednost thestroct, status = 2 Goneoleszitevine( ConealeshriteLine( “testruct, status: (0}", thestruct stats); hanged object." 1) Prewara tip u tstorable 11 smplicitvn pakira u refereed tip storable isTemp = { TSorable } UheStract; 1) ostaja vrijednost Kron referencs sede isterp.status = 4; ConsolesriteLine( "Chaged interface.” Js (ConealesMriteLine(“thestruct. status: (0), isferp: (2), Thestrvet. statue, isTenp. Status); 1/ Povo nienga veisesnost thestruct, satus = 6) onsale iteLine( "Changed object.” )3 Congole-briteLina{ "thestuct.status: {0}, istemp: (2), thestruct.Status, IsTenp. Status); ) ) U ptimjeru 8-6 sutele 1Storable sacr#i metodu (Read) i svojstvo (Status). (Ovo suéele je implememtirala strukcura nyStruct: public struct aystruet + IStarable Zanimljv se kod nalazi unutar Tester, Potinje stvaranjem instance strukture i inicia: liziranjem jenog svojstva na -1. Vrijednost statusa se zatim ispisue: ryStruct theStruct = nw aystruet()s Uhestructstatus = <1) // InleAjaliatranje Corsole-hriteL ine YheStruct Status: (0}*, theStruct. status); Taz pokazuje kako je svojstvo status ispravne postavlien: thastruct. statue: <1 Zatim se pristupa svojstvu radi promjene statusa, ponovno putem smog abjekta vr jednosti 11 nigeria vekjednost thestiuet status 225 Consoe.ritel ine("Changed object"); Consolecaritel inet “theStruct. Status: (0)", thestructstatus); 12 | Pogamianiece Promjena se moze vidjetiu inlazu conged obj thestructStatus: 2 Dosad se nije dogodilo nigta neobiéno, Sada se sevarareferenca do suéelja Istorable. ‘Toe urrokovatiimplicitno pakiranje objekta vrijednost theStruct.Zatim se suele otisti za promjenu vrijednostistatusa na 4 1 Pretvara tip Istorable 11 Soicitao pakira u referentnt tip $Storable isTemp = ( Istorable ) thestruet; 11 staal ja veijedost kroe referency sudet}s {ster.stati: = 45, Console.rite.ire( “changed interface.” ); (angoeriteLine( “tnestruct. statues (0), {stamps ()*, UheStruct. status, isemp. status Inlaz sada moze biti malo neobigen Changes Loterface Uestruct. statues 2, isTemps & ‘Aha! Objekt na kojeg pokazuje reference suécjaje promijenjen na vijednoststatusa 4,alie objekt vrijednost strukture ostao nepromijenjen, Jos zanimjvie, kad mer pristupace preko smog objekta jedost 17 tee aera Cesta: Cena mteine| “tage osc”) Cone tee “testa Sai: oy seep: (a, ‘teStruct.Status, isTenp.Status ); a inl pokazuje kako je objet vijednostpromijenjen, no nie promijenjena zapakieana referentna vnjednost 2a referencia sue Changed onjact. theStruct Status: 6, isTemps ¢ ‘sko pogledamo MSIL kod (primer 8-7) otkrit emo Sto se zapravo dogada u pozadin Primjer 8-7. MSIL kod 20 primjer 8-6 fried orate hicbysig static void wan) ft maged entsypoit iF eoe ste cota 3 ocals ist ((o)valvetype Referrcesonnlueyes.aystuct tere {x} clase ReferenesOntalueypes-Istoobe tem) 1 om: nace testest boot: init feferenesotuerypes.mstct ‘T0008: dloca.s theStruct ” 1pm: Mecca, om: ht 198 (0x2) instance void Referencesowaluelypes ysttuct:set_Status(int32) PeglajeR Sulla | 163 Prinjer 8-7. MSIL. kod za primer 8-6 (nastavak) 10010 1 ooss: noon? Weote: 1 oon6: iL eo 1 ons 1 oo: 1 oa ss Hoos pom Los: 1 ome: 14 oso oes pos 10st 05s: ste deca. all all ap loca. Menta? call laste all Yeste loca. call tox call sep Tilec.0 stl. Méloe-t Mewis.a calivirt lest all op luste aloes. call tox Moe. callvirt en ~~ ‘hoc. sees ait liste an Mee Woca.s au box alec. alvin tee 164 | rogaine cr thestructStotus: (0) thestroct Instance in32 Referenceson¥alueTypes.qystructssget.Status() [nscor bl systen. nts void {nscorlib]systen. console: ritelne(stzing, object) thestruct instance void ReferencesonvalueTypes.aystructs:set Status(int32) “Changed bject. void [oscor]sb]Syston.Consle:ritaline( string) ~eestruct. status thestsuct nitance int? ReferencesdiWaluelypes ayStructs:get Statue() nscorlib)Systen. Int32 void [Rscorlib]Systen. Console: titel ine(string, object) (or FefecencesOnvalueTypes.nystruct inctance void Referencesoalvetypes, IStorable: set Statuint32) "charged interface." void [ascorlib]Systen.Coosoes:Ariteline( string) ~thestruct. status vestrat instance ints2 ReferencesOnValueTypes.nyStruct:sget_status() (wscorlb syste. rot32 {0}, Sstenp: (2) Instance int32 ReferencesOrValueTypes.1Storoble::get.stats() [ascorLbsysten. t32 void (nscorLib]systen.consoles irteline(string, abject, object} thestruct fnstance void ReferencesorValuetypes.mystnuct Changed object woid [rscorlib]syston.Consle:riteLine( string) set status(ints2) stnestruct. status thestzoct nstance int? ReferancesoalucTypes.myStruct::ge,Status() {wscortio}syster. 1032 {0}, istenp: (1)* snstance ints? RefereveesOwaluetypes.Istorable:sget Status() [nscon ibsyster.int3? rinjer 8-7. MSU. od za prinjer 8-6 fnastavak) aon: all sold {nacoribsysten. consol: write esting, object, i coco: nop ae fewer: ret 5) (Fed of netbod Testertain # Used It_o00b metoda set_Status(), vidiureda 1 nj clr epoevana na objektu vedas Drugisepoziv 001. Primi ete ako spo toe itt ne) wrakoalpa : ilednostistarusa kako bi se mogla pozvatimetoda Getstringe) 4) Kijugan je red 1L_oote(podebijan)u kojem dolazi do pekcania same sul of paranje zapravo sevarareferentn tip 2a ele isha. Obratte pata neg Hl ip 2a referencu sul. Obratte paz da sta sed IL_0052 ov} pur unjestomyStruct::set status poziva storable eet Sea * Ako implementiratesudelje sa ejednosnim tipom, , | lanovima sucelja svakako pristu- ” pate kroz objekt, a ne preko reference suelj, aoe eae utes | 165 POGLAVLJE9 _ Polja, indekseri i kolekcije INET kostur pruza mnostvo klasa kolekcija. Od pojave generika u inatici 2.0 vedina vib klasa Kolekcija sada su sigurne 2a tipove, Zime je samo programiranje uvelike olakSano. U te se klase ubrajaju Array, List, Dictionary, Sorted Dictionary, Queue i Stack Najjednostavnija kolekcija jest Array, jedini tip kolekeije 2a koju C# pruta ugradeny ppodrsku. U ovom poglaviju Gete nauciti kako se radi s jednostrukim, viSedimenzio. nalnim inejednakim poljima. Pola imaju ugradene indeksere, to vam omoguéava da 2zatraZite nti lan pola U ovom je poglavlju objasnjeno i stvaranje vlastitog indeksera Sto vam omoguéava da sojstvima klase pristupite kao da je klasa indeksirana poput polja NET kostur pruza razna sutelja, poput FEnunerable iICol ection tija vam implemen- tacije omoguéava standardne nagine intecakcije s kolekcijama. U ovom éete poglavlx vidjeti kako se radi najosnovnijim. PoglavljezavrSava pregledom .NET kolekcija koje se najZe8ée koriste, au koje se ubrajaju List, Dictionary, Queve | Stack. U prethodnim inaticama jezika CA objet kolekijnisu bil sigurno za ipave (a Dictionary ste na primjer, magi nizove pomijeSat sce § lobrojaim vijednostima). nate List (ArrayList), Dictionary, Queue | Stack koje isu siguene 2a tipove idalje sudostugne radi kompatibino sti sa star inagicama, ali one neg biti obeadene u ovoj ki jer je niihova upotichasligna ypotrebi indica koje se terele na genercina 1 hog toga osu te inaicezastarjleigubile su na vrijednost Polja Pole en] array jeindksrana kek ebeata ej sus stg ipa Poi wee Chae rea ae ol pale Ct rsa cea Ton pede vate Keine wrod aj prudaizvornu sintaksu za deklariranje pola, Ono tose zapravo stvarajest objekt spa Systen.Array’Polja ezika C# stoza vam pru2aju najbolje od oba svijet jedno- @gavnu sintaksu u C sta koju podupire stvarna defincija klase tako da instance polja jmajupristp metodama i svojsvima iz Systen. Array. Te su metode i svojtva opisani iatablici 91 sulica 9-1. Metode i suojstva System. Array © vores sts psarySearch() epee ja stata mts kta jededeentne staple, aeart) aa sa metadata aspen eee glu esta ieee cont) "epee oa stata meteor pala vgo poe Createlnetance() _ eptnajaa stata meade sare row stan po, a hoger tees ListinfeoF() Pretest meta wisest nds ‘sienna severe Poems sn Preteen saan i vise nm srineBize been tcayineet Koto pom ne . brates nt Deon See rentniy Janes teeing tinea ben proses ae isynchonzed mene jy meen ole ae stoppage emt veatn awn cine tk Janse map Syst Jono oleracea Getennerto() eto net Cetera) sep ina ec Cetlorson() Integra a es Cervgertond() letter ee Istiatie() ba venenatis tpnenenonipan oda ‘ont enpaaeene sevate Pepe jo ie deepsea, * Narano,priikom staan poll spomocy int] meray = neu it[s]uHkod tapeavo seorate instanco stents], ro bude da vedi aptakene esnowneklese ten stay, ete eee ee se svorll astane Sten de, oie noite | 10) Deklariranje polja Polfese u jetiku C¥deklarra sljedegom sntsksom ine polis; Na primer nef] mytntarray; Ge sadréatireferencu poja cesbeojaih vnijednasti. Kao ¢ 1 obiéno, keris emo pregacimylntarraynaziv paler, 2najt da se ‘apravo radio vaijabl koja sadedi referencu (neimesovanog) Poli ol i Zapravo se ne deklarira polje, Tehni¢hi deklarirate varijablu (apintar: Uglate zagrade ()) C# prevoditeliu govore da se radio deklaraciji polja,a tip odeeduje tip clemenata koje ée poljesadr2at. U prethodnom primjeru myintArray je pale jlo brojaih vrjednosti Instancirajte polje koristeti kljuén ret new. Na primer ryineaeray = new Sot(s]i (Ovom se deklaracfjom stvara iinicjaizira pole od pet cjelobrojnih vrijednosti kojesu sve iniijalizirane na vrijednost 0. [Napomena 2a VB6 programere: CW brojelemenarau pou odreduje ‘ries elie pba ane gona race, U stat psa natin * 8 2a poravjanje gornje: dane granice (ua ianimku done granice vied ‘menzionalnih poli koju mofete pestaiti(objssnjeno kasi), al ak ‘io nije podrdano u bibliotei klasa (NET kost. Stoga, prvi element polis e 0, Sledeti C#iskaz deklarira pole od 10 clemenatasindeksima od 0 da string aykrray[10]; Gornjajegranics 9, e 104 velitina pola ze ne mode promijenci (oes, ‘ie posto metoda koja odgovara metodi ged u VBS). ‘Vatino je pole (koje kolekcijaelemenata) razlikovati od elemenata polja. nyintArray ie polie (ili, preciznije, vatjabla koja sade3iteferencu polja). Elementi pola su pet ce- lobrojnih vrijednosti koje ono sadrii (Cé# polja su referentni tipovi koji se swaraju na gomili. Stoga je pole na koje synth ray reeritaalocirano na gomily, Elementi polja su alocirani prema svom tipu. Buduéi da cjelobrojne vriednosti pripadaju vrijednosnam tipu, elementi polja myIntArray bit e vrijednosnitipovi, a ne zapakirane cjelobrojne vrijednostiteée se svi elementistvo- rit unutar bloka memorie koji je dodijelien poli Blok memorije dodijelien poljureferenenih tipova sadr2at Ce refesence stvarnih eleme- nata koji se stvaraju na gomili u memoriji koja Je odvojena od memorije dodijejene oli 168 | Progam Razumijevanje podrazumijevanih vrijednosti ada svorite poll vrilednosnih ipovs,svak element napoéedku sade dazu {an vent za tip spremljenu pola (pogledajetabicn 4-2). Iskas 7 qytotarray = new int{S]s F amare pole od pe cjlobrojnih vjednosti vrijednost svakog elements postaiena jena 0, to jest a podrazumijevanu vrijednost za tip cielobrojne vriednosti za alika od pola viednosni tipo, refrenn pov w po ene icici © pa svoju podracumijevanu vijednost. Umjesto toga se reference koje pole sadtii ini jalisrajv na null. Ako element polj referentnih tipova pokutate pristupti prije nego "go te inicijalizirali elemente, izbact €e se iznimka, 7 Pretpostavimo kako ste stvorl klasu Button, Deklarrste polje Button objekata se & bP detim iskazom: sutton(] aybuttonteray; "jinstancirajte polje na sledeti natin: syuttonarray «ew Buttons © To moteteskratiti nai ton[} muttonkeray + new Btton(3]; » Ovim se iskazom ne stvara poljes referencama tri Button objekata. Umjesto toga se stvara polje sybuttonarray s tri reference null. Za koristenje ovog pola prvo morate ‘konstruirati i dodijelti Button objekte svako referenci u polju. Objekte mozete kon steurat peti koja ih jedan poedan dodaje u pole. - Pristupanje elementima polja Flementima polja mo¥ete pristupitis pomo¢u indeksnog operatora ({). Pola imaju snovu nula, fo znati da je indeks prvog elementa uvijek O ~ u ovom shitaju, mya yO} + Kao Sto je cane objasinjeno, polja su objektiistoga imaju svojtva. Jeduo od korisni: ih svojtavaje Length koje govorikoliko elemenata polje sade, Objekt pala mog se indeksirai od 0 do Length-1. To jest, ako u polju postji pet elemenata, njhow su indeksi 0, 1,2,3, 4 Dosad opisani koncepti pola prikazani su u primjeru 9-1, U ovom primjeru klasa Tester stvara poje Eployees i pojecjelobrojnih vrjednosti, ispunjava poke Employee {zatim ispisuje vrijednosti oba pola Primer 9-1. Rad poiem: fasncePrgrmir tarp (1 Yedsostavna tlasa koja ce pohranivath v polje Pogloijes: Pl indeseilolehdje | 169 Primer 9-1 Radspoiem (maton public cass Exployee c public tnpleyee(int erpI0) ‘ ‘shis.crplD = eml0s ) public override string ToString() return empid.tostring()s ) private int eaplo; public class Tester c static vod Pain() c nif] Snchrays Employee} erpArroy, sntteray = eu 308(3]5 fepatray © new Emplayee(3]; 11 Aspunjava polye Sor (int 1 = O;Lcenphrray. Length ior) c exptrray(i) = new teployee( 05); for (int {= ojieintheroy.tengthiSes) { ongolesriteLine(inearayfi]Tostring()): , for (int i 9 cenparay, Length) Congo west ie(enptaray(5]-Testeirg()): ? , > Primjer potinje definicijom klase Employee koja implemencira konstruktora koji uzima jedan cjelobrojni parametar. Metoda ToString() naslijedena od Object preopteredena je kako bi ispisalavrijednostidentifikarora zapostenika iz klase Employee. Metoda 24 provjeru deklarira i zatim instancira par polja. Pole cjelobrojnth vrijednosti se automatskiispunjava cjelobrojnim vrijednostima koje su postavene na 0. Sadr23} pola Employee mora se rutno konstruirat [Na kraju se sadréaj oba poljaispisuje kako bi se provjerilo je liu skladu s namnjerom. Prvo se ispisuje pet cjelobrojnih vrijednost, a zatim tri elementa polja Employee. 1 | Progamianjech Iskaz foreach ska pete foreach nov jew obitelj C jezika,iako je veé dobro poznat VB, a progeame- rima. On omoguéavaiteraciju kroz elementepolja ili druge kolekeije, prigernu ce svake cement provjerava, Sintaksa iskaza foreach je sjededa: foreach (tip identifkator in feraz) istar Primjer 9-1 stoga modete aZurirati i iskaze for koji itertaju kroz sad iteritaju kroz sadr2a)ispunjenih poljazamijenitiskazima foreach, kao Sto je prikazano u peimjeru 92. Prinier 92. Korittenjeiskacaforesch region Using directives sing Syste: Sing Star. Collections ising Syston. Text; endregion sarespce UsingForEach 1) Jedvastoma Klas taja e pahrongivatsu poje public class Enployee meee 1 Yednostawna Wasa koja pabronjivati vu polje pli aye int pi * ‘this.emplh = emtD; pubic override string Wosteing’ , ng Tostring() return enplb.Tosering() private int enplp; public class Tester c state votd Wain() St] intarzays Exployee(}enptrray; inarray = nen ins]; emptrray = new Employee[3]; 1 spenjaa pole for Ci 2055 «epost enphrray] = new Employee i +S); Yoreach (sn 4 in interay ) onsalesirtet inet {ostring()); Pogarfes: Poa indlsetlice | 71 Primjer 9-2 Koriterieihaza foreach nastavak) ) foreach ( Eaployee © in epacray ) ( coneadesuriteLinel «.TeStcingt) }s ) , ) , Ielaz primjera 9-2 identi¢an je onont iz primjera 9-1. Medutim, umijesto stvatanig iskaza for koji meri veliginu polja i kao indeks koristi peivremenu variable za broja nije, pokuSali smo s drugim pristupors: fae (int 4 ephiray. Lengths $64) Cancale etl ine omptaray(s).TeString()): Iteracijakroz pose izvodispomoeu petle foreach koja automatskiiz pola izdvajasj ogi element i dodieljuje ga privremenom objektu koji je stvoren wu zaglavlju iskaza ‘foreach (eaployee © 49 empaay) ( Consote-hriteLina(e.Tostring()); Objekt koji je izdvojen iz polja pripada odgovarajucem ga za njega mozete pozvati ily oj javna metod Inicijaliziranje elemenata polja Sadrés) pola mode se inicializiat w vijeme instanciranjatako da se u vitgastin zagradama ({}) navede popis vrijednosti. C# omogucava duu i kraeu sintaksu: Snt[] mylacarcay = now Sot{s) (2) 4) 6 8s 10) Snel] ayintassay = (2, 4, 6, 8 20°) Nema funkcionane razlite ized ova dra iskaza | vetina Ge programets kori Ira sia, no pogledate sedeéu napomenu, %E) _Dvije sntakse postoje jer se u nekim situacijama mors koristiti duéa [Soin tie aii Se pia Kijucna rijeé params Motete stort metod koja ma konaal peikazuje neogranien bro) cjelobrojnth w- jednosttako Sto prosjedue poi cjelobroiih vryednost i zatim prota kro poles pomoéu petle foreach. Kljutna rijeé parans omogucava prosljedivanje prosnjenjivog ‘oroja paramerara bez eksplicienog stvaranja poli, | Pogranianie jedeet Se primer stvara metodaDisplayals() koja uzima promjenjivbroj je nih argomenata’ be voldOispla¥alstparans ink} Stas) i console.MriteLine("Displayvals (0}",1); ) 5 yoinjuéa metoda, medutim, ne mora eksplicitno swori polie. Ona jednestavve ee prosljedit elobrojnevrjednostiiprevoditl ce paramettesakupiiu poe zs Perodabislayrals() {.oisplaials(5.6,7.8); ‘Ako Zelite, modeteradije proshijediti pole fon {) ea ettArray = new StS} (253045) tisplayials(emlicitarry) "Y primnjeru 9-3 naveden je ejelokupan izvorni kod koji prikazuje uporrebu kljuene citi params, * iner 93. Kosten Ruiner parans trop Using directives sing Systems thing Systen-collecticns.Ceneric; thing Sistem Texts ‘eescegion tonespace Using public class Testor t state vod Hain() ‘ Tester ¢ = now Tester()s eDssplayvals(s,6,7.8);, int {} expbichvavay « nee dnt] (2,2,346,8)5 lossplaale(esplicitarzay); ) ‘pAlic void Oisplaytals(paraneSat{] sntvals) orzach (Jot § in Stats) : Consolle.WriteLine(*Display¥als {0)*s4)5 es Poa neseitlicie | 173 Vigedimenzionalna polja Polja se mogu shvatit kao gi nizoi pregrada koje se mogu postaviti vjednogs Zamisiteprvo red pregrada, a zatim zamisite dest takvihredova postvjenh ny iznad drugog, Redoviidu vodoravno kroz poe, a stupeiokomito Moguéajeitrecadimencja, no neSto ja jetedezamshi. Soja poi iit trodimena enalnima postavjanjem novihredovaiznadstaog dvodimenzionalog pola U red, Sad zamislc ett dimenaij. Pa ztim dese. Citatehji koji nisu fiziéari do sad su vjerojatno odustali, ba8 kao i ja. Vigedimenzig. nalea pola su, medutim, Korina éaki ako ne motete zamisit kako bi ona treba fegledac. C# podrtava dva ipa videdimenzionalei pola: pravakutma engl. rectangular) need naka engl jagged). U pravokutnom pola svaki ered ist duljne. Nejednaka se pol sastoje od pola, a sak polje moze bi aii duline. Pravokutna polja Pravokutno poljeitna dvij (ii vibe) dimenzije. Prva dimenzija klasiénog dvodimenzio, rnalnog polj je broj redava, a druga je bro) stupaca, Nagomen Java programe: pve pa we pose xi Za deklariranje dvodimenzionalnog palja koristite sljedeéu sinraksu: tip (o] aati polfa Na primer, za deklariranje i instanciranje dvodimenzionalnog pravokutnog, polja nyRectangularkrray koje se sastoji od dva reda i tri stupea cjelobrojnih vrijednost, napisali bist: Sint [,] mRectangulachreay = new int 2,3}; U primjeru 9-7 se deklarira instancira i inicijalizira polje a zatim se ispisuje njegow sadrlaj, U ovom se primjeru petlja for koristi za inicijaliziranje elemenata polja. Primjer 9-4, Pravokutno pie region Using directives vucing systens Using Syston Collections. Generics Using Systen-Text; tendeegion ranespace Rectargulartrsay ¢ Ener 9-4 Pravkutno pole (natavc} pubic class Tester static void Hain() t canst int Coins = 3 1 beklariza cjelobrojo pole 4x3 fnt[ tectangularArray = new Snt rows, colums)s 11 1spajaea polje for (int i +0; 4 ¢ roms; S60 ) for (int j= ( rectangularieray[s, ) 5 $c columns: foe) seh > 11 Aspisuje sadrts} golja for (int i+ 8: F< ros Soe ) ‘ for (int 3 = ‘ onsee.sritet ne *rectangularérrayl(0},(3)] = (F's {Jy rectargulastrayls, 3) i 5 colums; fiw ) , Uovom se primjeru deklarita par konstantnih vrijednost: const Smt 8 = 45 const int coluams = 3; koje se zatim Korie 2a odredivanje dimenzija polja es Antz, columns); Ant] xectanglarsrray Obratite paénju na sintaksu. Zagrade u deklaracilint{,] oznatavaju da je tip pole FB primjeru 9-6 sara e nejednaka poje myaggedArray, iniclaliiraju se njegovi Wenn zaim se spisje iho sad}. Da bsmo uted a prosoo,pogeas fora enlencu da ge jelabroji clement pol aomatsinilssrj na Vinee Essa nee emente ) (Ova) je primjer sligan primjeru9-4, no ovs)3e pu coéne dimenzie polja odreduju nat nom inicijaizacie fnt(,] rectangulachrayretanguanteray = 4 pe ee geaee Primer 9.6. Rad snjednakin poo Ftegan Using asrectives (0,2,2), (345), (6,1 , (9,20,20) Dodiela vrijednosti u éetiri popisa unutar zagrada, od kojth se svaki sastoji od wi ele sing Syst ‘menta, naznaéuje polje dimenaija 4x3, Da ste umiesto toga napisali ‘Pasng system. coldectfons. Generic Hsing ssten Texts Ants) rectanglarareayzectangularkryay = a {0,1,2,3}, (4,5,6,7, {8,9,10,13} " ws ) 6 | Pegamiane ore esl: Pap indlseninlecle [07 Primjer 9-6. Rad ¢nejednakim potima (nastavak) ‘ ce Daggesray oc class Tester © static vets mate) ca canst int r04s = 4 1/ beblarica nejednato polfe visoko cetirt reda Int IC] Joegedteray = sew intron ](]5 17 Prot x04 San get elenenata Saageshrray(o) = new ints} 1 Red 5 69 elenenta Spegesnray(1] = new int(2]; 1 Reds tri elenenta Saggedaray(2] = new int{3]; 1) ade} red ina pet elenensta Soegeatray(3] = new ints]: 1 Bopeniaen note (sli re see) elenente redo joezettrayfo(3) = 35; Jesper (3) Jpaseekray (3) Jpageanroy 1G Sggeateray(3}) = Spggeatery3IG] + Sogeeatrry(3}L = Spagetaroy 3101 + Sgaeatray(3}] = for ( int c Les ie) ‘Console riteLine( *joggestrray{0]{(0}] = {2}*, 4, jaggedtrray(oll5) Js for (Ant 5 Leas) Conssle.titeLin( *jgpetor9y(=\C0] = 21%, 4, SoggesterayC IES) 5 for ( int i { Obes i) ConsoleriteLine*faggedicray{2]((0)] = (2)*, Jaggestrayt2I05) }s for ( iat f Bic tn) Pregame sinjer 9. Rad snejednakim pola (rastavak) congoe titel ne "jaggeairzay(3]{(0H] = 2)", 1 agedterayls}E1) Ds | yovom se primjeru stvara nejednako polje sdexri reda: Ant )() Soggesteray = nae ine[ sows]; ‘Moseteprimijetit kako druga dimenzijanje zadana. To jeodredeno stvaranjem novog polaza svaki red. Svako polje mote biti razlitite veligine: 1 Pri red ina pet elenanata Spesecteay{o] = new sats]; 1 ad 5 619 element Sagpedneray(3) = new int); 11 Red 5 tri elenerta Spapedrayl2] = pow sath]; 1) Taji se ina pet elenerata Spapecrray[3) = new int{S]s Kad je pole zadano za svaki red trebate samo popunit razlititeélanove svakog polja izatim ispisati njihoy sadréaj kako biste proverili je li sve u redu, CObratite pozornost da, kada pristupate élanovima pravokutnog polja, svi se indeksi szavlaju unutarjednog skupa uglatih zagrada: rectangulashrrayretargularterayi4]] dake je kod nejednakih polja potreban dodatni par zagrada: Soagederray3 115] Prvu varijantu mofete shvatiti kao jedno polje vise dimenzija, a drugu kao polje sastavjeno od pola Granice polja Klasa Aray mote se tori is pomoéu preoprereéene metode rentelnstance.Jedno ed preopterecenja omoguéava zadavanje donje granice (potemnog indeksa) svake dirnenaise vifedimenzionalnog pola, Ova je mogénos primo nejsna ine Kors sebsst0 Victko, evo kako to modete uti: pozovetestaticku metodu Createtnstance koja waéa Azay i pribvata i paramera: objec pa Type (oenaava tip abjekata koi Ge + nalazt pol), poljeGelobrojnihvijednost koje oznaéava velitinu svake dimen 2ieu pola i drugo pojecelobronih vijednosti koje oxmatavadonjagranicusvake dimenaie. Dva pola celobrojnihvaijednost mora imat ist brojelemenata x svaku dimenaimoratezadati don granu Peslaves:Poanecenitehle | 179 repion Using Sisectives using Systems sing Syeten Collections. Generic; sing Sptentents endcegion roneegace Settingraydounds c poblic class SettingarrayBounds ¢ piblic static void createderayiithbounds() t 11 Pravs 4 Snicsjaiaia videdinensionalne 1 elie tipa string. Snt{) Tengtnssray = nee Set(21 (3, 5.35 Snt[} oundstray = new Srt(2] (2,3) Array iltiDinenstonsansay » Array. Crentelnetance( "ypeot( string), Tesgioatosay bourdstrray 3 11 Prskazuje don) graniey 1 17 gern geantey svake dina. Consoles iteLie( “Bounds: \tlower\ supper" J; for (t= 0; 4 ¢ miltiDinensionalArray. Ranks 344) (CansolekriteLe( “Ok EGE)", 4 raltsDinengsonalArroy.JetLowerdound{ 4 ), tultiDimaneSonalAray.SetUpperBaurd( 3 )'); Static vold Main() ( SettingterayBoundsCeeaterrayasntounds(); ) } ) Pretvaranje polja Polja se mogu medusobno pretvarst ako su hove dimensiejednake ako je magule pretvaranje ned tipovaclemensta Implicit se pretvorba mote provest ako se el tent moga impliien pretvaratiu suproniom pretvaranje mora biti cksplicitno Pole izvedenih objekata se, naravno, mote prevoriti u poje osnovnih objekata. U primjera 9-7 prikazana je pretvrba poljaKorisnichi definiranih tipove Employee & pole objskata. 100 | Permian prinjer 9-7 Pretwararie pola rep Using directives sig Syston; thing Syste. Collect ons.Geneie; ‘hire spsten Text; © serdegion rarespce ConvertingArrays ‘ 11 Stara abjekt koji 1 etna tuts ple potie cles Ewleyee 11 edostayra Klasa 22 Luvanje «pola [lic Employee nt empD ‘ *hiscenglO = enpi0; public override string ToSting() ‘ private set expiD; return eprD.Tosteing(); public class Tester 11 oa toda uzina poe objetata. 11 Broslijedit eno pole Employee 11 Satie polje nite. 11 Pretvorba je Snplicitna jer {Employee 11-4 ahrovt Savode te ebjekte- public static vols Printirray( objct{] thetray ) Consolesrizeine( “contents of the Array (0)*, thekizay.Tostring() 5, (1 eualaet hroe polfe 4 1) spe welded, foreach (abject obj in totrray ) ‘ amsolesariteline( “velue: (0)", obj ); ) static vod Main() 17 bravkpolje Eaployee objekata txployee{] nyteployeearay = new Employees] 17 Wcijaseiza vasjaast suaag Employee for (int 10; £035 14) Pogbie Poa neteitolekge | 181 Primjer 9-7. Pretuavanj poli (astavak) ‘ syknployeerray(i) = neu Employee 6 + 5s Gy prikarje veijedosth PeantArray aytnployesteeay 11 ravi pole ad dea niza string] array = c "rele", “world iB 11 teptsuie vjecnost miso. rintaray( azr3y J; : ) } Primjet 9-7 potinje stwaranjem jednostavne klase Employee, kao i ranije u pola, Klasa Tester sada sadr2i novu stacidhuaiecodu Printarray() koja kao parametar pri. baa jednodimenzionalno pole object: fblic static void PrintAray(object) thoteay) (Object je implicitna osnovna klasasvakog objekta u NET kosturu teje tako iosnoyna klasa za String i Employee. Metoda PrintArray() izvodi dvije akcije. Prvo poziva metodu ToString() 29 same ale Conaotesteine (“Contents of the Array (0) thearay.ToString()}s systen Array premof€uje metod TeString() i ispisuje identifikacishi nazi pol: Contents of th Array Progamming Sharp. Employee CI Contents of the Array systen Stihal] Printazzay() zation poniva metod ToString() 2a svaki element polja koji uzimoa kao parametar, Buduti da je Tostring() virtualna metoda w osnovnoj klasi Object, ona ée sigueno biti dostupna u svakojizvedenoj klasi, Tu ste metodu preopteretili u Emp te kod ispravno funkcionira, Pozivanje metode Tostring() 2a objekt String moéda nije potrebno, ali ne moze bit Stetno i omogutava vam polimorfno tretirane ih objekats, Sortiranje polja U Array postoje dif korisne metode Sort) Reverse(). One su porpuno podrfane za pols ugradenih C#tipova poput String. Peimjena th metoda ha klase Koj te si Sevorl nedto je komplcia nj jer morateimplementirat suelje Comparable (Qo date odjejak yImplementacja sue ICamparoble"w nastarku ovog poglvia). U primjeru 9-8 prikazana je upotreba te dvje metode za rads objektima String. 1 | Pogrniane Proje 9-8. Kordtense metoda Array Sorts Array Reverse region Using drectives aang Syste Sting Sten Collections. cenertc; ising Ssten Text; sensepion ranespace AraySortindReverse t iblle class Tester t bic static void printiyhrray( object(] thetreay ) t feta object obj in heey) } Consale-irteline( “Ant ) (Console steve "Value: {0}*, obj ); , state void Main() String] ytrzay = ( "vo", "is", "Dos, “tant i Printyacray( ayray J; Aceayoteverse( ayheray ); Printhytrray(myactay 3 String] syotherArray « ¢ Wee, Mold", These", "Truths", te", Slt, "evident, h Princmacray( myotenacray ): Acray.Sort(ayetneeteray Js, Printyseray( nOtherarrsy ); ) ) Primjer potinje stwaranjem polja nyArray koje sadrsi nizovesrjedima: "Wo", “ist, Doha", “cle Polje se ispisuje, a 2atim se prosljedy Hie do metode Array.Reverse() gdje se ponovno ispisuje kako bi se vidjlo je li edoslied polja obmur. el Fogle 9:Pola neste |) Value: catt Valve: John Vale: is valves bo Naslitan naéin primer stvara drugo pole myOtherArray koje sadrii sliedece rj We", le", "These", "Truths", Tory "Be, elf, “Evident”, Ti se elementi prosljeduju do metode Array.Sort(). Zatim ih Arsay.Sort() sorta po abecedi Value: ge Naive: Evident Value: Hold value: Self Value: These value: Te Value: Trthe Value: ue Indekseri Ponekad je kolekeiji unutar klase bole pristupiti kao da je klasa pole. Pretpostavimo, 1a primer da ste stvorli Konerolu padajuéeg popisa ayListBox koja sadr&i popis nizava koji su spremljeni u jednodimnenaionaliom polju,privatnovarijabliflaniciayStrings. Kontrola padajuéeg popisa sade2isvojstva imetode dlanove tesvoje polienizava. Medu- tim, prikladno bi bilo polju padajuéeg popisa pristupiti s pomocu indeksa, kao da se adi o polju: Na primjer, takvo bi svojstvo dopustalo sljedece iskaze: string theirststring = mjListBoxfo}; String theLaststring » oycist@oe{Length-a]j Indekser (engl indexer) je konstrukcijajezika Ci koja dopuSta da Kolekeijama unutar kelase pristupitekoristeti poz sineaksu (] za pola. Indekser je poselna vista 0 stva sade pristupnke get | set koji odredujunjegovo ponasanje Svojsevo indeksera se unutar Klas odredujesjedeéom sintaksom: Up this argusenttipeaet; ses) Pouratni tip odreduje tip objekta koji indekser vrai, dak argument tipa odreduje kakav ese argument koristt 2a indeksiranje kolekeije koja sadrficiljne objekte Jako sezaveijednostindcksaobignokoriste gelobrojne weijednosti,kolekeija mote Indeksiratisdrugim tipovima, ukljuéujueinizove. MokexeCak pti indekse vie parametata da bist stvoril visedimenzionalno pole Kljutna rijet this sluzi kao referenca objekta u kojem se indekser pojavljuje. Kao i za ostala svojstva, morate definizatiprstupnike get i set koji odreduju kako 6e se zat ‘Seni objektuzet iz kolekeje il se dodati ws * Stren honrola erin, dostepane Windows Formsi ASPET, ma kolekiuTtees kas implemensio ‘ndekoee Uprinjers 9.9 deklaricana je kontrola padajucegpopisa (ListBoxTest) koja sadrijed aostavno pole (Strings) ijednostavni indekser za prstupanyesadrdau [E_ | Nepomena za C++ programer:indekserima otpilike st sythu kso [84 reopteretivanje indeksnog operators C++ (i). Indeksni operator se if u CH ne mode preopeeetit, 2bog dea je wveden indekser, Prinjr 9-9 Koribvenje jednostaynog indekseva teepion using dtzectives sing syste sing Speten Cllections.Cenertc; ising Sten. Text tetegson sespace Slepleindexer 1) Pojednostaunjena kontrola Listtox puolic class Listhoxest c private stringl] strings; private int ctr = 0; UF anichjaliziza popis § nizoviea Public ListBorest|parons stringi) inithastrings ) i 11 Oodjeljujeprostor 28 nizove Strings = ow Strdngl255), 11 opira iove prosljedene kosteuktory foreach ( string 5 in initiatstrings } stringer , 11 bodaje nix a2 bra} popisa pbc va aa string thsting ) 6 ( ctr >= strings Length) 1 Obese 108 indeks else Sstringslctrsr] = thestring: 11 Dowvol faa pristup kao kod poke public string this[int index) 14 | Progamianjece Pose Poa deotote | 185 Prinjer 9-9. Kersten jednostavogindeksera(rastava) ti eet Sf (Andox <0 || dex >= strings. tenet) ( 1 brads 105 ints Teturn strigsl ines} ( 11 oodavanje $20 kro if Cindex ete ) 17 oscavie popcedke i else Strings(index] = value; ) | : 14 a public int Getanérs t return et ) d J eto toe ublic class Tester ¢ static vosd Main) c 11 Provh novt opis 4 inieijaltatza gp Uisthoxtest bt = ret ListBorTest(“Hello", "World" ); 17 bedafe nekoliko nizora Tot Adit “a™ 5 at Add "TS" D5 ota ota”) bead, “eae” 1 Testa pristup sexing subst » "Universe" etal» subst; 11 Pekstopa sun izovina for ( ine 1 20 1 1btcetmntatries(); 6+) n console ciriteine( “Bbt[{0}]: (2)*) fy WelS} 5 ee | Pegamiane ako bi primje 9-9 bio to jednostevniji Kontolu padsuéeg popisa silt smo na aiiko anacajk koje su nam bine. Pops zanemaruje sve oma vee sKorsnikors © [onrolom i okusira se samo na popinizva koje padajui popisodrfava ina metode F Ker snjma,U stvarrojaplikaciji ov je, naravno, samo mali dio metoda padajiceg ‘eps fe ela’ zadatak prikaz nizova i omoguéavane bora prvo treba obratii paZnju na dva privarna lana: string! | strings: int ctr +05 padaju¢i popis u ovom programu odr3ava jednostavno polje nizova: strings. Ponovno, “upravom biste padajuéem popisu vjerojatno koristili slogeniji i dinamignijispremnik, ta primjer hes-rablicu (engl. hash table). Varjabla Zlanica ctr prati koiko je nizova dodano ovom poli. pole w konstrukiora inejalizirsjeiskazom: stsings = ton Stings}; stata konsiruktora pol dodaje paramett. Novi se nizovi, panovno radijednostv ros, pola dodaj tedosljedom primanja é Kako ne motete znati koliko ¢e se nizova dodati, koristite kijutms sijet 4S g,, ta, kao te je opsano anje weve poet “Mecoda Aét() ix ListBocTest samo pridruzuje novi niz unutarnjem pol, Kljucna meroda iz ListOoxTest je indekser. indekser nema naziva, stoga koriscice Kijéno rjeé this public strieg thislint index) Sintaksa indeksera vrloje signa sintaksi svojstava. Postoji metoda get(), metoda set() ii obje, U prikazanom primjeru mecoda get() implementira osnovnu provjeru grenica te, pod pretpostavkom da je zatafeni indeks pribvatjv, vrata zatrazenu vrijednost: eet t $F Under «9 1 fn >» strings. Lng) 11 Corabue los Sndeks oturn strings(indess ? Mecodla set() provjrava da liindeks koji postaljate ved ima vrjednost upadajucers popisu. Ako nema, ona postavk tretira kao pogresku (novi se elementi u ovom pri= ‘stupu mogu dodati samo s pomoéu Add). Pristupnik set iskoristava prednost implicit- nog paramtra value Koji predstavlja sve ono Sto je dodijeleno s pomotu indeksnog operatora Pole’: Pandit | 187 46 Under ete ) 1 Obrobuse pogreske i d else i Strings index] = Stoga, ako napitere bt{s) = "Helo worla” prevoditeljée za objekt pozvati metodu indeksera set() i niz HelloMorld proslijedi kao implicitni parametar value. indekseri i dodjeljivanje U primjeru 9-9 ne moiete dodiiliti indeksu koji nema vrijednost. Stoga, ako nepitete wt pokrenutéeteobradu pogretaka u metodi set) koja Ce primietii da fe prosieden Indes (1) ve od brojaea ‘Naravno, za dodjeljivanje mozere koristiti metodu set(); samo morate upravljati indek- sina koje primite. Kako bist to util, metodu set) mozetepromijenti tako da uj S10 trenutne vriednosti brojaéa (Counter) provjerava vejednost Length bafera. Akoj¢ tanesenavijeinst 2a indeks Lj jos uvijek nema vjednos, rebate aduriai ctr t 11 edvanje sao kxoe wetodu 20 dedavanje 4 Gindex >= strings. terath ) 11 Coxaduje pogrette string index) = valve; SE (eer c ingens) ctr = indexes, > (Ova kod je pojednostauljen i stoga nije robustan. Postojerazne droge Ay od, proviere koje rebate iavesti na poshjedenim erijednostima (npr pro: 8S sje je bi prosljeden nepativan indeks i premade li indeks vein temeljnog pole strigstD, ‘To vain omoguéava stvaranje .ijetkog" poljau kojem moiete dodijelitina poziciju 10 bez dodjljivanja na poziciiu 9. Ako napiset: | 18 | Pograniane ce 1otf30) = "ew! ines 62 bit: au} eth]: Universe Iee[2): he wel]: 15 1We( 4): Dehn wt{s]: Gale Ioel6) wel] 1wels) sst(s] Toeho}: ext Unsin() se stvara instanca Kase istBoxTest pod nazivom Ibt i dva se niza prosje- dvju kao parametri ListdovTest Ibt + new Listdoxtest( + World"); Zain se poziva metoda Add() kako bi se dodala jo8éetiriniza 1 odevanje rekaliko aizove Iwetdeut9"); wedi"); Be. John" awtaadd("alt"}; Prije provjere vrijednosti medificira se druga vrijednost(sindeksom 1) String subst = "universe™; Ita} subst; Konagno se svaka vrijednost prikazuje u peti for (int 4 = ojieabt.Cetmtntrses();i+4) ( ) Console uritetsee(“26t(0)]:(4)*,4,28¢(5) 5 Indeksiranje na druge vrijednosti UGH seza indeks kolekije ne morgj-wieckorstjlobrojnewrijednosti Prilikom stvaranja prilagodene klase kolekcije i viastitog indeksera modete slobodno stvoriti ineekser koje zaindekskoristnizoveidrugetipove.U sta rijednom se indeksa ‘note preopterett pase kolekija mode indeksiatna primer celebrojuim vjedno- stima ili vajednostima nizova,ovisno o porebame klgenta, U slugaju naSeg padajuéeg popisa motda nam je potebna mogutnostindeksrans dajuceg popisa na temelj ira, U primjeru 9-10 prikazana je indeeiranje nz ‘ndekser prvo poziva metodu findstring(), pomoénu metodu koja vraéa zapis koji se temelj na vrijednos. pruzenog nia. Prime écte kako se preopterecentindekser ‘mote korisitzaednosindekserom i primera 99 eles: Po nese | 189 Primjer 9-10, Preoptereivanie ndebsa region Using directives using Syster Using Systen.Collections.Ceneric; Using Syste Texts ranespace Overlosdedindeser c 17 Sojeénostamjena ListBox kontrola public cass ListoovTest ‘ private string} strings Drivate int etx = 0; 1 tnicsalizira papis § nizovina public ListdorTest(parans strirg[) initialstrings ) ‘ 17 bodjehjufe prostor 2a nisove 11 Kopira nize proslijedene tanstruktors foreach (string # in initialstrings ) t stringsfetres] = 55 > ) 11 badaje jedan iz na kraj popisa public vold Ad string thestring ) ‘ stringsletr] « thestrings trees ) 11 ooavojava pristup kao kad pola public string this[int index] at ¢ AF ( indox € 0 [| index >= striagsLength ) 1) Corabuje Los nek ) return stringsindex strings index] = value; prijer 9-10. Preopterecivane indckso (nastavak) 2 private int Findstcing sting seretstring) » ft for (int 4 + 0; £ ¢stringsLengthy ioe ) 4 ( strings] Startslith( searcstring ) ) ( ; i ) ) 11 Ydeksranje nizon pete trig sso sd et ¢ 6 (Andon tength == 0) ‘ 1 obratuje 108 Indes return this[fiedstring( Sndex )}; set ‘ strings[Fledsteing( index )] + volves je oliko nizova ina Pubic Int Getntntries() t return ets r ? public class Tester State vos maint) ‘ 17 Bravos popis 4 Anscijaliniza ga Lsteoxtest 19 new ListBoxTest( "Helle", “world” ); 11 Dodaj wekolsko nizovs ett Mo" J Ibtsada "ts" cade “oba” )s tence “Cale” 3} 180 | Pogaianie Pogue Poa ndelseiboce | 1 Prinjer 9-10, Preopterecivane indeksa(nastava) 11 Testa pristup String subst = "Universe; eta} = subst; et "HEI"] = Goodbyes 11 Yee] = “oops 1) Peéstupa sin oizovina foe (int 1 +0; 1 < Ibt.Getnanentries(); S40 ) t Congole-beiteL ned “Woe{{ON: (2), 4, Tels] ya eas for , 11 e235 ain ? (taj tester , Primjer 9-10 e gotovo identigan primjera 9-9, dodano je jedino preoptereéeno indekst tanje koje mote odgovaratinizu i metoda fndString koja podriava ta) indeks. “Metoda findstring jednostavno iteirs kxoz nizove unutar ayStrings dok ne pronade niz koji podinje cilinim nizor koji se korist u indeksu. Kada pronade takav niz,vraga indeks tog niza;u suprotnom vraéa vijednost -1, U metodiMain() moteme vidjeti kako korisnik u indeks prosljeduje segment niza, kao da se radi o cjelobrojnoj vrijednosti: = "oodtye"s ‘Tinme se poaiva preoptereéeni indeks koji provodi osnovnu provjeru pogretaka (w ‘vom slucaju provjerava sacri i proslijedera nia batem jedno slovo) i zatim vrijed- ost (Wel) prosljeduje do findString. Zatim vraca indeks koji se koristi za indeksiranje pola nystrings: turn thislFindsteing ieee): ‘Vrijednost set funkcionira na isti nati: seySteingl FindString inden) ] = value % pativi eens pringentkako se, vthtsjda enicovi ne pola 5 pate ata sefednt ose zat kort ha inks omy. 8S a Bee Tye ibacue iene Cyst mallceceneacpt fen, * ote raj uklananjm Komentars it shedetng ru mod wn Tene" + “ope leper etevane problema kad dobre nie pronaden ose felalo skate hoover es hac. Porakus popes mode re {eesti konsike moter mops oporak on pogtete 12 | Pgianianjece * suéelja kolekcija [ET kostur pruZa dva skupa standardnih suéelia 2a enumeriranje i usporedivanje {olekcija: tadicionaine (nesigurneza pave) i nove, sigurne zatipove, generic kolek- gi. U ovo) knjizi usredotocit éemo se na nova sucela kolekcijasiguma 2a tipeve jet taka sucelja mnogo bola See oT bila koe specfengtpa matee delat tako da opt tip Sehr seb (>) zambenice svar pom va prj, th srg). ter Napomena xa C++ programere: generici jezika C# su po sintaksi i upo- tbr dtm peditens fala Crs Medgtn, butdseee. Ap tek aport pore specitan up ikemteedein ht persed tote djittod nea ie nsaoeh ej tod tr lee ol ona Tonseprent upowtbom Crs prelate ljuena generitka sucelja kolekcja navedena so0tablici 9-2. Tablica 9-2, Sucelia olekeia st noose ce pemeee oaneratorcl> Funerals poco foreach MeaurerablecT> IeollectioneD ‘mpleenijug seep eat cop}, aaCount, synchronized Syrcoot. onparerct> pei atta utara sella meg srt eanpaablecT> ussters Norse alee jes mages 9 Dictionaryck,¥> _ Kose ale teneene on provi uvedrestaba ict onary. Suéelje lEnumerable Iskaz foreach u ListBoxTest mozete podeéatiimplemencacijom sucelja TenunerablecT> (pogledajte primer 9-11). 1enunezable sadrii samo jedna metodu, GetEnunerator() koja vra¢a impiememacija sutelia SEnunerator. Jezik C# pruka posebmu pomoé pri stvaranju enumeratora, Koritenjem nove kijudne rj yield Primjer 9-11 ListBox ka klasa koja se mode enumeriratt region using directives Using Syston: sing Syetot. Collections. Generic * Radi hompatilossprethodnim insicama uC au dstop i nesneriha sat ing,avetin, "Hmumeate) ona nitusbradene wove kya er su asal en Paint ake | 88 Prinjer 9-11 istBox ka klasa koja s mote emumerirat (aastavak) using Syston Texts endregion tamespace Enmersble public class ListbonTest + remyerablecstring> c vate stringl] strings; Private int ctr = 0; 1 tose roje se nogu renumerixats nogy vrai ennerstor public Tenmeratorcstring> GetEnunerater() oveach ( string s in strings ) yield return 53 , ) Jy wnichjaliisn popis © public Listhortest(parans String(] Initialstrings ) 1 jeje prostor 24 nizo¥e strings = noe String(®): 1) oieawiave proslijedene konstruetosu foceach (string sin initialstrings ) stringsctret) ) » 11 bode niz na era pops public void Red( string thestring ) strings[ctr] = thestring: } 1/ voevoljava pristup kao kod pola public string this{int Sndex] 0 eet c 26 (Ander <0 || dex > strings. Length ) “t 11 Obreduje Lot indees } retain stringsindedls 9-11, ListBox kao klasa koa se mote entmcrrat rasta) ngs index) = value; } , 11 Objajuge kolskonizova im piblie int Cettinestries() c public class Tester static vosd main) ( 11 Prov govt popis 4 iniesjalinsra Usthortert Ibe = iw ListoxTest( "Hello", “wild” ); se nekoliko nizove ro" eaaal “Is Tbesaai( oho) taal “Cale” 3 11 esta pristup String set = "Universe"; ta] = subst 1 Pristapa svin alzovina foreach (sting sin Ibt ) Consoe.neltetine( Value: (0)"s 55 , ) rogram potinje w metodi tain() sevarajem novog obektaListBoxtest i prosjdi- vanjem dra niza de konseruktora. Nakonstvatanja objekta sara se pole Strings u kojem ima procos 2 osam nizova, Ceti dodatne niza se dedajus pomoe mctode dd drogi se nz afore, bas kao u pethodnom priniert ‘Velika promjena u ovo) inatici programa je pozivanje pete foreach koja uzima svaki niziz padajuceg popisa. Petlja foreach automatski korist suclje YEnumerable pozi- vajuti merodu Geténunerstor(), Metoda GetEnunerator je deklarirana tako da vraéa Ienumerator niza public Tinueratorcstring> GetGrutertor() Implementacijaierira kroz pole nizova, pruiajuti svaki nz: Peles Pola eile | 195 foreach ( string 5 3 strings ) yield return 55 ‘Sve Sto je potrebno 2a praéenje redoslijeda elemenata, ponovne postavijanic iterators itako dalje, pruza kostur. Ogranitenja Ponekad morate osigurtidasu element koje dodajetegeneritkom popisu u skladus codredenim ogranicenjima (apr. da su izveden iz odzedene osnovne klase ili da mile scntiraju odeedeno sueljl. U sledeéem primera implementirat cemo pojednosta vijen jednoscruko povezan popis koji se moze sotiati. Popis se sastoji od vorovs (Nodes) i svaki Node mora zadovojavati vjet da tipovi koji mu se dodaju implement rajusuteljeTConpazer. To modete wtinti fede iskazom. publ clas nodect> Teamparabeciaiect> where ¥¢ Tonprabect> (Ova) iskaz defnira geneidki Node kojisadrli tip T. Node Timplementrasueeje Tope. rablecT> Sto znati da se dva 2voraT mogu usporedit, Klass Node je ograniena (ere T sTConpazablecT>) na samo one tipove koji implementtaju sueejeIConparable, Tip, stoga, modetezatijeniti bilo kojim tipom koi implementira sudeje Lcomparable U primjeru 9-12 prikazana je cjlokupna implementacija koja je anaizitana u sede im odlomcima, Prinjer 9-12. Upotrea opranicenia using Syston sing Systen-Collect ions, Generic; ranespace UsirgConstraints t public class Enployee + Xcnparablectaployee> ¢ private string nine ublic Eeplogee string ane) this.name = names Public override string Tostring() f + return this.name; 11 Amplement ira suteje public int CoepareTo(Emplayee 1s) ‘ return thissnaneConpareTo(rhs. rane): 196 | Pogairenie CP © prnjer 912, Upotrebaograniceja(nastavat) pie it usmle os) return this.nane ov thn ? > 17 bor mora inpleentiratt \aaparabe of Hoe od 1. 11 Opranicava Nodes ds uzieajusaro stave Hoje nplonetirajy Comparable 1 spoteebon WL Ajeet ae puolic class Notes “omarablecodecT>>abere T : Kamarablecy ( 17 Chant pats private 1 tas Private WodecT> next = nulls Drivate NodecT> prev = null; 11 onstguktor public Node(T dats) C this data = data; ) 1 suojetva elie T Gata gat { saturn this.ditas 3 Public Wodect> ext t get { return this tet} pti 1 comet) 11 Funkctontrasbog opranitenfa 1H te Comat.) public ool Fqucls(Wodect> hs) return this. data. Equas(rhe.data); y 1 Yates Public HodecT> Aai(natect> nate) 4 (this. CampareTo(nedtode) > 0) 1 ide prife mene reode-next = ths; /7 vk tor pokaavje na mene 1 ako Sinan prethaina, postavd thd pokacoju a 1 ov eyor kao Sv seeds 4 (this prev Ie mull) t esl: Pai ndeseitlkcie | 197 Primer 9-12, Koistenje ogranigenja (astavak) this prevnext = newbde; reo = (h5-P2e; ) 11 ostavija prev u tehuéen Evoru da poksauje na novi Qvor this. prev ead; 11 vrata evbode w slufaju da je to nov Zagiavlje return neo; ) 11 ska inan sedeti, prosijedsje nout (vor U1 a usporedivanje Af (this.nont = id) ‘ ) 17 Nenan sljedee pa postavi sovd tor M7 da base no} sljede i postavi nfegov prev dy pokazuje ra mere cle this nent -Aae(neode); this.next + nediode; renge-prev = this: this ) ) fublic override string Tostrirg() t thing output = data. Tosteing(): 4F (next ts pal) ‘ > output 1", 7 + next-Tostrings return outputs , YH R95 kdase public class Liskegister> where T : TConparablect> c 11 Polio Elarovs private NedecT> neadade = null; 1 seojsta U0 tndeecer pblie T this{Lat index} Primjer 912, Kovstenje ogranigena nastavak) iy aot { Nadect> node ~ heaciode; ee (ote tm At See 48 (ctx = sno) ‘ 5 nae.0ata; rede nade.tent; } 17 &23} waite ‘throne AspunentostoPargetxception(); ) 7d tray pet , 17 ea} Indeksera 11 Konstraktor Dublic Lined ss¢() 1 etode ube void ada data) ¢ 1 (Readioge =» ruld) { heactode = now Made sta); i head = heated. dey Nodec> (data); ) d pbc ore trig sting) 46 (is bead te mt return this. teadlede. toString); else { eture steing opty 198 | Pogamianjece Pogson | 199 Primjer 9-12. Koristnjeopranienja(aastavak) 1s Sestirnie clare Test 1 haze static void Hain(string | 2085) 17 bravk instancy, pokrete meted Test t= new Test(): ‘tums pobhse void Ran) LinkedListcint> myLinkedList « new LinkedListcnt>()5 Sanden card = new Rendon); onsale. APite("kdging: for (int 4 = 05 5 ¢ 305 19) ‘ int textInt = rand.Next(10); Congolerite("(0) nextint)s tnylinkedtiet.tga(ventint); LinkedListcEaployee> enployees = new Linked ist cEmployees()5 employees Add(aen Enployee("20h0")); ‘erployeesAdanew Enploye("PauI")): explayeesAdalncn Employee "earge")); femployees-Adecew Enployeet"Kings")): ConsolecerizeLine(“\etrieving collections... onsole-triteL ne(“Integers: * + wyLinkedt ist); onashe-faitatsna(*Caplayenss "+ enployees); ? } } ‘Oval primjer podinje deklarieanjem klase koja se mode stavitiu povezant popis: public class Employee : IcnparablecEaployee> (ra della govor ako objet Employee mogu pond i vidio da Kl Employee implementira potrebne metode (Conparelo i Equals). Ove metode su sigurne 2 tipove (one znaju da ée proslijedeni parametar pripadat tipa Employee). U deklar racii2a,LinkedL ist odredeno je da ta} popis sadr2i sano tipove ot irmplementiralt sucelie [Conparable: public clase LinkedListots were T + IcomparablecT> tee moguénost sortiranja popisa zajaméena. LinkedL ist sad objekt tipa Node. Node takoder implementiza stele IConparable 1 zahtijeva da svi objekti koje sadri bao podatke i sami implementiraju sutelje IComparable: 20 | Pregramianject pbc class hodecr> Komarabledodect>> where T + ong “vs ogranigenja implementaciju metode Conpareto iz Node Cine sigumom ijedn igumom i jednostav ron es We 2a da e usporeivatt drug 2vorove (ade) ese podact nog usps iva olde int Conpareto(todect> sts) 1 nkeionira ahog epranicenje retuin data.ConpareTe(rn.dsta); ) rs 8€ ne mora testirati kako bi se vidjelo implementita Ii ICogparable. Node smo vet cganiili na takav natin da sadr2 samo podatke koji implementrau stele compar rile list Kaastni problem s tipom arsay je njegovafikana veliina. Ako unapried ne znate kolkoéeabjekaca pole sad2at, posto rzk deklariranj premalog pola pace pon stat prostor) ili ptevelikog pola (pa se poroitprevise memor fo Program kojipiteteée od korisnika motdazatrazti unos li ée urimati podatke s Web seranice: Kada pronadeobjekte (nizove, vjednost itd) dodat eihu pj ali vinecere aati Koliko éete objekaca prikupiti u odredtenoj ssi. Klssiéno pobe fen velitine nije dobar ibor jer ne moscte predvidjetivlitinu pola koe ée vam biti porrebno Klasa List je pole jase veliina prema pottebi dinamigki poveéava, Polima List se smote upravjats pomocu raznih metodaisvojstava koja ona sadrZe.U table 93 pr azane su najvaznije metode i svojstva Tele. Merde ona po Futon seta Cty Sinope una deepest aes se ‘jdt enamath peeve al deena pein lapatet Cw ees dete ‘eso ak temas pant aag emetic M) no, "ajo restina stam element ort. count Shs wine tj cena poe trent a ren) ini psi elrentna odes Tjeapovendseca bs List © aaa, duvnamendzn dotaaniecdptsutist sadeacge() amaretto tebe ea Kol ection aa tist Hironseaeh) Ren madam perce pi hag ear) Mn sredemene ets. Ccatains() rd cpa element Fan ata | “Toblica 9-3. Metade svete poy List (astavak) Netodssvopwo Sia 2 copyto() eopeeenajamametdaleja List npevujedrosimensinato pale “ tists() Udo pia element. Find() Vata pape denenautist Finda) cae nese element ist Geténumerator() —Pepieeenajanartoda loa wala enumerated ist cetearget) Koi gn eneat uno poe List ndex04() Preoptereenaaa mats na wats indks pre poe edt Insert) mee cement uList InsertRange() _Genenellelejeeéeupole List. LastindesO4()_ Peapeeenjana etd jo acalass posedepe edo List. Fesove() Ulan pvp teenie ej Removes () Ulan elon: na adenoma Renoverange() _Ubinaspen ements Feverse() ements psa cbt esto. sor Soreatist Toarray() Kopi denen List une pae Tristosize() Poses lapacetsvanogbig elena u Let * ams sapu ene renzin a apnea net Prilikom sevaranja List me definira se broj elemenata koje €e ono sadtZati Element se uu List dodajzs pomo¢u metode Add), a polje samo vodi brigu o broju svoj eleme. naa, kao 810 je prikazano u primjeru 9.13, Primjer 9-13. Rads poljem List region Using directives using System; Using Systen-Collectins. Generics Using Systen Texts sendregson ranespace Listcallection 17 sedostama Klasa toja €e twvatt u List public class ployee private int emp publ Eployee nt ep ) this.empl expi0; 202 | Progamianjece prinjer 913. Reds poljem List (rastaval) public override string Tstring() i return enpO.Tostring(}s pute int xpi { gt c return enpid; set ‘ mp0 = valves ) » public class Tester ‘ static vols #ain() Listetmployees emList = new Listeeployees(); Ustcinty tntlist = new stints; 11 Fopunjava List for (int t= 0; 1 5; ie) ‘ enpList.Add( new Enployet 4 + 100 ) 5 EntList.add( 2 5°55 , 11 Aspisuje sav sade23} for (int § = 0; 1 SrtLst. Coun c , CansaleciriteLine( *\n" i) Consolesuritel “{o}°s sntist{s}-tostring() 11 Aspisuje say saris} ployee List for Cint £ + 0; 1 empistcuit; ist ) c , Consolesrite( “{o)", empist{s]-Tostring() ); Cancalesiriteline( *\r ) CGangole-ariceline( “emp empList-capacity Jp Capacity: (OF, PodavesPindeetitaje | 203 Sklasom Array definirate koliko ée objekata poljesadréavati, Ako pokubati dodati vise objekata od tog broj, klasa Array ce izbaciti iznimku, Ako koristte List ne morae deklartai bro} objekata koje ce sadrZavai Listima svostvo Capacity koje predstay broj elemenata koje List mote spremit astespremni za sortiranje popisa zaposlenika east. Kako bist prover fun joni Ii sontane, bate clabrojne vrijednostit instance Eeployee dodati ode Fvrsjutim pojima s nasuritnin vrilednostima, Za svaranje nasumiénih vrijednos i instancirae objelt klase Randon.Za genetiranje nasumni¢hih vejednosti posing mzodu Next()naobjekeu Randonkoja ce vatit pseudonastmieni tr}, Metoda ext() seep Jdn atc agua prsjedajloboje eds tos redstalianajveéiZejeni nasumigni bro}. U ovom se primieru prosheduye vejednont fez genercanjenasuminog boa izmed oo, nn Posed wea Tandon £ = ne Rando) Ever (i0) ithe nt capacity ( gets sets ? Podrazumijevani kapaciter je 6. Ako dodate sedamnaesti element, kapacitet se auto. | imatski udvostrucuje na 32. Ako petlu for promijenite na for (int 4 = oie) izlaz €eingledati ovako: 0-5 10 15 20 25 30 35 4 45 50 55 60 65 70 75 80 56789 10 11 12 13 4435 36 47 38 19 20.21 lenphrry. Capacity: 32 Kapacitet mozete rugno postaviti na bilo koji broj jednak ili veti od broja elemenata Ako ga postavite na bro) manji od broja elemenata, prograts éeizbacitiiznimla tga “ArgunentOutOfRangetxcepticn, Uprimijers 9-1 stvoreno je pole cjlobrojnih vrjednosti poljeEaployee, sjavaiu nasumitnim brojevitua i njthove se vrijednosti ipisuju. Oby se sortiraju i ispisuju se nove vrijednosti ba se ispu- pola zatim ‘Prinjer 9-14. Sortranepoljacjlabrojih vijednost i plia Employee teegion Using directives sing Syston: ing Syston collections.ceneric; teirg Syston Texts, Implementiranje sugelja IComparable Poputsvih ostalihkolekeia List implementia metodu Sort) koja omoguava sort rjesvihcbjekatakoiimplementrau suteljeTConparable, U sjedecem éemo prinja _— modificirati objekt Employee kako bi implementirao suelje IConparable: sare pubic eats ployee = IConpaableceplose> Za implementaciju suéelja {Coparablecteployee> objekt Enployee mora pruzati ‘metodu ConpareTo() famespace KCoparable { 1 Sednostama tlasa koja Ce euvati Upolu BAlic class ployee # Teopnbleploees ble Smt ConpareTorployee 2s t re! private int enpro, 5 ve tiem const) pe Ge et Metoda ConpareTo() uzima Employee kao parametar, Znamo da se radio objektu Exployee jer je to kolekcja sigurna 28 tipov. Tekuci cbickt Eeployee mora se uspo- rediti sobjektom Eaployee Koi e prosieden kao parsmetat | vrai vrijednost-2 ako je tekui objekt manji od parametra, 1 ako je vet od parametra i ako je jednak Parametru, Objekt ployee mora sam zadati Sto znati smaller thon, greater than equal. U ovom primjera se wsporedba delegira lama enpl4, Clan enpdje int kori podrarumijevana metodu ConpareTa() 2a cslabrone ipove koja é usporedi die ‘riednst 3 S—) _klasa systen-Int32implementira [Conparablectnt32> tako da odgover 4 ‘his.enpID = end; Public override string Tostring() return emp. Tostrieg(}; ) pei bst Eqs Epa ster) 46 (thse otter nost za uspofedbu motetedelegiat cjlobrejnim veijednostia ae! else t return tse 2 | Regamtanjece onder | 205 Primer 9-14, Soriranje pala celobrointhuriiednost | poli Employee (nastavak) } 17 Conparer dlegira natrag do Employee 17 apogee Foristi podreaunijevona retods 11 ConporeTo elobrojnih vi fedrasti public int ConpareTo( fxphoyee xhs ) c ' uhldc class Tester ‘ static vole Main) ‘ return this.enpID.ConpareTalths.emp20 Listckeployeesexphrray = new Listeteployee(); Ustetntan inthrsy = sew Listetnts2>03 1) Gareriza slvéane brojeve 23 1 efelobroje eSsecresth 11 4 Sdentstskstore zaposlenika Random 1 = new Randon(); 11 Popungeva pote for (int 1-0; 1.¢5; 6) 17 bodaje sluts Sdentifsbator zapostentta nphrray- Aad new Employee( FNext( 10 ) +200 ) 25 1 Dodaj sluéajnu cjelobrojmu vrijedrast Intarray.add( r-text( 10°) ) 11 peste sr sera pli los eer fer ttn soy be inure costs) 0 Consele-krite( "{o}", intArray[4].Tostring() )5 ) Temata“); 1 Peikasoje sav sadrtay pola taployee for ( int 1 = 0; 4c exphrray-Count; I++ ) c conselesirite( "(o} *, empareyLi]-Tostring() 3s a Conse MciteLina( Wo" Ji 11 Sortira i prikazuje polJe cJelebrojash vrijeowets intarsay Sort()s for ( int 1 = 0; $ ¢ Sothrray. Count; S44 ) consolesurite( "{o} "> intareay[$].t0string() }s jer 914. SortivanjepoiaGelobrojnih vrednostii poi Employe (nastavak) ) Console ritetine( "a" ); 1 Sortira 4 yoStarufe pole 2poslenita Enployee. Eweyectarparer ¢ + Employee cecnpsrer(); cerohezay Sorte); cxpteray Sort) 11 Prskazase sav sadriy pela Eeployee for (ant = 0; hc empteray.County Lo ) onsolecirite( “(o)*, enprayli}-Tostring() i CongolesriteLine(*\e" ? ) Uizlam se mote vidjei kako su pole jelobrojnihvrijednost pb employee gener: rani nasuminim brojevima. Nakon srtranj ies se vi kako su vnjednost ispravmo poredane Implementacija sucelja Comparer Kada na List pozovete metodlu Sort() poziva se podrazumijevana implementacija suse je Teonparer koja Korist GuickSort za pocivane Conparable implementadje metode ConpareTo( 28 svaki element u List. Motete slobodrio swvorti svoju implementaciu TComparer Sto je preporudljvo ako {elite kontrolirati nain na koji se definira tedoslied sortiranja. U sjedeéem se pri- njeru polju Enployee dodaje drugo polje years0FSuc, Porrebna je moguénos. soricania objekata Employee u List po oba polja, enp1D i yearsofsve Kako bismo to postigli, stvorit emo prilagodenu implementaciu suéeja [Conparer oju €emo zatim prosiediti do metode Sort() od List, KlasaEmployeeCoaparer suéelja IConparer 2na za nployee objekte i kak th social {rployeeonpore ima Svjsto Whichcenparson tipa Employ. nplayeeConparer.Con- parisoatype bie eploye.enpleesCenpne Carson Wicowpaien ‘ aectetu schemas) SStuntcomarisn vate) , Conparisonype je eoumseracia sdvje vijednost, ep il yesrs045v (oenatara kako {elite sortirat po densifkatoru zapeslemika i prema godinama sta) 206 | Pagminanjece Peglaes:Poineseitaecje | 207 public enum Conparssontype fepi0, Years0fService Prije pozivanja metode Sort() stvara se instanca klase EmployeeConpare® ipostavliase 4 njeno svojstvo CorparisonType: ployee. tmployestongarer ¢ = Employee. cetConparer(); ‘sthichconpa sonetmployee.Epoyeeonpate Conparisenype.€4p1D; cerotrzaySort(); Kada pozovete metodu Sort() List na EnployeeComparer poziva metodu Comp Sto delegira usporedivanje metodi Employee.ConapareTo() 1 prosljeduje svojsive VnichConparison public int Conare( Exployee Sve, fmpleyee rhs ) return Ihs.Compareto( 2hs, dhichConparicon ); ) Objekt Employee mora implementirati prilagodenu inaticu metode CompareTo() koja preuzimna wsporedbu i usporeduje objekte: public int ConpareTo( Enployee rhs, Eeployeeerpoyeeconparer.Conparisontype wich) ( sitch (sich) ¢ cose EmployeeEnplayeeCongater.Conparisontye. 9p ‘return this,enpIO.ConareTo(2s. p10, case ExployeeEployeeconarerCongaisonype. Ye Seton this yenrotove Comptes yer250)5 ' 7 Potpuni izvor ovog primjera naveden jew primieru 9-15. Pole cjelobrojnih vijednosti je uklonjeno kako bi primjer bio 0 jednostavnif a izlaz metode Testing) je unapr jeden kako biste mogli vider’ rezultat sortirana Primjer 9-15, Sortiranje pala prema ID-ovima zaposlenia i godinama stata freplon Using directives using Syston; using Syston Collections. Generic; sing Syston Text endregion ranespace IConparet public class aployee + IConparablectaployees 200 | Pregame prinjer 9-15. Sortiranjepoia prema ID-ovima zaposenita i godinama sake fasta) private Sot expiD; private int yearsofSwe = 45 uae Exployee( int enpi0 is.empD = , bic Exployee( int eap10, int yearsoiSve ) ‘his.eep10 = amp ‘this.yearsofsve » yearsofSve; ) ube override string ToString() ¢ eturn "0; * + engIO-Tstring() + = Yeas of Sve: "+ yeasOfsve.Tastng()5, ) public bool Equals Exployee other ) 4 ( this. enpID == other npuD ) ( set te 4 t return false; ) 11 Statitka netods 22 uzinanje abjekta Comparer public static EmployeeConparer Get comparer() t , umn no EnpLoyee.EnployeoConparer(); 11 Conparer dlegira eatzag Employee. 11 Employee koristi pedrazin’jevara 1 wetods Conpareto Ejelobrojnih vesSednosti public int ConpareTo( Employee rhs ) f ‘eturn this.emplD.CompareTo( hs. eqpID ); ) 11 Fosebna inplenentacija koju ge pozvati prilagodent usperedivae public int Compare ‘xployee th, Pree epepscnaerCaprsontpe ich) Pehle Pal indeitlje | 209 rimjer 9-15. Sortivanje pole prema ID-ovima zaposenitaigodinama sada (nastavak) sxtten (atch) case Exployee-Eoployeetorparer.Conparisonype ED ‘etuzn this.empD.CompareTot chs.eqpt0 ); case Employee. EployeeCangarerCoaparisoType.¥*s return this. years0FSvesCompareT@( ths.years0f5ve ); ) ) 11 Upossetdens Klasa koja saplenentira ICeapater public clate ExployeeConparer + ICanparer 17 erivatna varijabla stanja private Erployee-teployectonparer.ConparisorType idenconparison; 1 tourna tipova 22 wsporedivanje Public bool Equls( Exployee Its, Exployee rhs ) ‘ return this.Compae( ths, ahs ) == 0; Public int Getiaehcode(Eaployee e) ' return e.Gettashcode(); 11 Govordabjektina tape do se wsporede public int Compare Employee Ins, Employee ths ) 0 ) public tnployee. xployeeCanparer.Conparisentype Michceapaeison { return Ins.Conpazeto( rhs, whichCoaparison ); return i chempari Setnichtonporison = values} } ) public class Tester c 20 | Pogamianece pimjer 9-15. Sortianje poli prema ID-ovima zaposteikaigodinama sada (rasta) static wold Nain() Listeeyployee> enptrray « ray Listceployeer(); 11 Geeta slutajne brojeve 3 11 23 cjlobrojne vaijetnosti 1 17 Sdentsfkatore tapeslenib Radon» ne Rando) 11 Popngave pole Cint't 205 4 55 ie) c 17 38d 2 random employees cenptcray kd nen Eapoyee( NOxEC 10 ) + 100, r.Mext( 20 ) 11 Prikazyje sav satiny poljo employee for {nt 4+ 0; Lc eqreay.comt; ise ) { ) Consoleceritetine( “\n* ); Console trite “\o(0} *, enphrzays)Tstringt) ); 11 Sortira | prtkatuje plje sapostentta Enploye.taployeecanparer ~ Employee. cetConparex(); cshiehenparisen = Exploye.ployeeCaeporer.conparisonype.£op10; cevpkrrayssort('e 11 Prikazvfe sav sads2a§ polja Employee for Cam 05 1 emg cots) 1 ete Nolo, entry. tstie0) J Consoleciriteline( "a"; {hichConarison » Enployce.ErployeeConparerConparisontype. Vis; tenoteray.Sort(e for ( int 1 05 4 ¢ emparray.counts in) Consoleskrite( “\o(o} ", parte Tosteing() 5 Consaleciriteline( “\at ola Poa indeseiteie | 21 Uprvom bloku irlaza motete vidjeti Employee objekteredosliedom kojim su dodeniy rij 916, Rad edovina List. Vijednost identifikatota zaposlenika i godine stada poredane sa nasumigno, drugom se bloku vide rezultati sortiranja prema identifikatoru 2aposlenila, aw trecem se vide rezultatisortiranja prema godinama staga region Using directives LF sing Syston: © Shing Syste Collections Generic; 4 ing ystenTexts, ‘Ako stvaratekolekcile kao uprimjeru 911 ¥2eiteimplemenras sbe- ie Icoparer, yjeroiatno ete korittenjem ranije opisanih ogranigena > morati osigura da svi tipovisinjelteni & polje implementa suéshe anparer (kako bi se moglsortea, region ramespace Que public class Tester ‘ Redovi Red (engl. queue) predstavia Kolekeiju koja funkcionira na nagelu prvi-unutra prvi van (engl. first i, first out, FIFO). Obitno se usporeduie s redom osoba koje éekajy na blagajni kako bi kupili kartu. Prva osoba u redu trebala bi biti i prva osoba koja kupuje kart i ilazi iz eda, Red je kolekeija koju je zgodno koristti ako uptavijate ogeanitenim resursom. Na primjer, moda éexe vecbati poslati poruke restrsu koji istovremeno moze obraditi samo jednu poruku, U tom biste sluéaju stvorili red poruka kako bistesvojim lien ‘ima mogli etic ,Vase su nam poruke bitne i zato se obraduju redoslijedom kojim su primljene." Klasa Queve ima razne metode i svojstva koja su prikazana u tablici 9-4 “Tblica 9-4. Metode i svojtya Fase Queue Netsatsvve Saha count aes ee sina bolt uQuve. caear() anes objet quve Contains() Cetera vee, conytet Kopra dente Queue pose jeedmenrana pole equeve() eat cjt poled Queve. Exqueve() Dose cbt mab veve Gettmumerator() — Vadaenumectorqveve. Peek() acaotetna peu ueve agar, Toarray() Kopiaclenestanerple Elemente mozete dodati u red naredbom Enqueue, a iz reda th wofete ukloniti nared: ‘bom Dequeue ils pomogu enumeratora. Te su operacije prikazane u primjeru 9-16, 2 | Pogamiaajee static vold Main() ‘ euevectnts2>intucue = ner Quecints2(); 11 Popunjava polje for Cint = 054 ¢ 55 S04 ) ‘ smequee.inguae( 4 * 55 > 17 Peikazyje ved onsole.brite( “intQueue velues:\t*); Printvalves( intueue ); 17 rise element Sa eds Coosale-ariteLine( ‘(equte)\t{0}", intQuevee. dequeue) ): 17 Prikanuje zed Consoleirite( “intQueue values" ); Printvaues( intqueue ): 14 Gre ot Yodan eles Ge rela, Console.trteline( “\n(Dequeue)\t(0)", intqueuee.Qequeve() 11 Peikaryje red, Conscle.rite( "inoucve values:\t* ); Printvalues( intQueue )3 11 Praga prei element redu 11 alt ga ne uhlanja. Conse ite net “\n(Peek) (Rfo)", Intute Peek) ); 11 Prikanyje red. (onsolesrite( “intqueue valuess\t”); Pah: Pa nde tke | 20. Primjer 9-16. Rad redovima (nastaval) seimtvalues( sntQueve )5 , public static void Printvalues(IEnunerablectntsa> nyCallection) ‘ emuneratorctnts>> ayEnuverator rjcollectioncetEmarerst0r(); while ( nyEnuerator mvetiext()') Consoleserste( "(a}“» myEtunerator.Current ); Consoheviital inet); ) U ovom primjeruje List zamijenjenos Queue 12 primjera je uklonjena klasateployee ako bismo ustedjel na prostora, no naredbu Enqueve moet korsi za Korii definrane objekte. Uialans moter vdjeti kako redanje objekte dodajeu Queue, a Dequeue se poaiva kako bi se objekevratio i obrisas i Queue. Klasa Queue ima i metodi Peek() koja omogudara da prvi element vidite bez uklanjanja Kako klasa Queue podréava enumeriranje, modete ju proslijediti do metod Print wes koja je prugena kao sugelje 1énunersble, Ova pretvorbaje impliiena. U metodi Printvalues pozivate eténurerstor, jedina metoda svih TEnunexable Klasa. To vaéa ‘Erunerator koje 2am: mode koritti za erumeracij svih objekata 0 kolekcij Stogovi ‘Stog (engl. stack) je Kolekcija koja funkcionira na naéelu posljedaji-uncea, prvi-van (engl. las in, first owt, LIFO), popu hrpe tanjura na Svedskom stolu ili hrpe novtiea ra vaem stolu. S gomile ete najprije uzetitanjur koji stoji na vehu (a on je posjednj dodan na hrpu), Osnovne metade za dodavanje na stog i uklanjanje sa stoga su Push() 1 Pop(). Stack, kao i Queue, nud i metod Peek(). Najvaznije metode i svojstva klase Stack prikazan suv cablici 9-5 Tablica 9-5, Metode i svojstvastoga Netoaitswjew Sha count aro roe uss beeen uStack, aear() Warns cbteistack, clene() Stara pt toi Contains() Ur pata ment stack. 2M | Pomanianjece rable 9-S- Metode i suosva stag (astarde) jiofeve Sha conyT00) Xepa ema stack ues nosis pe E eetnuoratex() Wotan stock peek) Wace sha Stack, ga ne tin enh) aca ibe abet sa stack esi) Deca mh tac, roaray() Kopiaeeneteu oop Tipowi List, Queve i Stack sadré preoptereéene metode CopyTo() iTokrray() za kopira rjeclemenata u pole. U sta Stack metoda CopyTo() ce kopiratielemente u postojece © jednodimenzionalno pole, prepisujuti sadr2aj pola pogevsi od indeksa koji zadate, ‘wetada Totrray() vraéa novo polje u kojem se nalazi sadr2ajelemensta stoga. To je prikazano u primjera 9-17 J oe Prinjor 9-17 Rad a stogom ‘region Using directives sing Syston; sing Systen.Colections.Cenerie; ‘sing System. Texts fonaregion public class Tester stack static vod tatn() ‘uckent3D>IntStack « now Stackent32>(; 11 Popunjva polje for (int 160; 1.685 iH) AntStack.Push( 4.9 5 )5 ) 1) Prikoxsje stop. Corsoleamite( “intstack values:\¢™ )s Printvalues( detstack); 11 Bribe elonent 3 stga Conse iriteLine( “\n(ep)\ti0), SmtStack-Pop) Js 1/ Prikaaje sto. ‘ede Po indeseiblete | 215 Prinjer 9-17, Rad sa stogom (nastavak) comoleskrlte( "intstack valuess\t™ 5 Peintvalues( intStack 5 1) brite fof jodanelenent sa stow onsale tel inal “\alPoe)e(Ols intStack Pop) 5 11 Peikansfe stop. ConsolesWzite( "Intstack values:\t™ Printvalues( imstack 5, 11 Feikanuje prvi element stop 17 ai ga ne brite ConsolesuriteLine('“vo(Peek) —\Ef0b", imeStack.Peek() ); 11 Peikazuje stop Cansolecitite( “intStack values:\t™ }; chntvalues( etstack 25 11 Deklarixa objet olf kofi ee sadréavats 11 a2 cfelobrojah vet janosts Snt(] targetArray = ew int[12]5 for (int 1 = 0; $ ¢ targethray. Length; 461) sangetherayl , 1) Peikanue vrijedosts odpedstne instance Array. ConsolesiziteLine( “\oTarget array: * ); Printvalues( targetarray {4 epic cfelohged oun Stack wordt 1 Smetana her 5 ptetion a inka 6. Sntstack opt tarbetsezay, 6 Js 17 wrikazuje vakjediosthodzedsine instance Ary. Conese NEiceLine| "waged nay afte Cen Prdntvalves( targetarray }5 : public static void Priatlalues( Tenunerablecint32 ayCollection ) TenunerstorcInts2> tourerator « + ny(allection,GetEnunerator(); vaste ( enumerator Povllert() ) Consolesurite( "(0)", erunerator.Current }; consale-riteLine(); Be | Pgeninnye lazuse vidi kako se clementi dodanistogu uklanjgu abrnutim redesiedom, ak opyt0() mode se vidjetipregledom ciljpogpola prj nakon pozivanja metode ppl). Element polja se prepisuju podevsi od zadanog indeksa (6) ijetnick get ng tionary olka i povezesyrednat U ee die dvoiea ene ue) povenies odgmarucom deacon fae © veda jetniamodete vide ko zamisie kako vam * gredova americkih saveznih dréava. To modete postici tak je potreban popis glavnih coda ih stavite u pole 2 string statecapitaas = ew steinesol; pole stateCapitals ce sadrdati pedeset pristupa kao Pomaku u polju, Na Arkansas, petra ‘om redut Blavnih gradova, Svakom se glavnom gradu primjer, ako Zelitepristupiti glavnom gradu drZave No je znati Kako je Arkansas detveta savezna drZava prema abeced string capitalofarkansas = statecapitals(3); Koritene pola 2a prstup glavnim gradovima priltno je nepraktitno. Napostetku, «ako mi je potreban glavni grad dréave Massachusetts, ne mogu jednostavne odvedsty Jako je Massachusetts 21. drava po abecedi Mnogo bi praktinije bilo glavni gradi povezati snazivom drZave. Rjeénik vam omo- agutava da vrijednost (u ovom sluzaju, glavni grad) spremite pod kijuem {u overs Slutaju, naziv dréave) Rjeénik koji mudi NET kostur mote bilo kakav kljué (lz, cjlobrojau vrijednos belt itd.) povezat bilo kojom drugom vijednosti (zor, Gjelobrojnom vedo. Forabicktam itd). Obiton je kuz, razon, priligno rata, dok ened nom pa ligno slozena Dobar s jetnik mora odlikovatijednostavnim dodavanjem ibraim vra¢anjem vejed- nosti (pogledate tablicu 9-6), Teblica 9-6. Metodessvojstuarecnika [edge See cout Jane sina beeen. sen) terete eys ‘avo 0 oe imal sjuteina Dict enary ogee sve Values). vatues ane novia lop tes ect ionay Geese ops aac) Dees sdretein Muon (ey) weds (ue. eae() Wars se ceiosctionary, Tablica 9-6. Metodeisvojstua reénika(nastava) Matos Sta F Containstey() UtudjeprptelotedeitOictionary. Containsvalue() Uvdye praia fede riedstOictionar. ‘etGnunerstor() Viz enumectorz2Dictionsry. GetOnjectoata() — nplemenia ice eral abLelvaapolte pein sect oray. fenove() Wlajaunos seein pe, Kijué u Klasi Dictionary moze biti primitivni tip ili instanca korisnitki defnirangy ‘ipa (objeke). Objekti koji se koriste kao kijucevi u Dictionary moraju implementzay, :metode GetHashCode() i Equals. U vetini slugajeva mozere jednostavno koristit nash jedenu implementaciju iz Object. \Dictionary Rjetnieiimplementiraju suélje TDictionaryct,V> (Koznatava tip kljuéa, @V oznataa tip vrijednost). 1oictionary prudo javno svojstvo Item. Ono vraéa vrijednost sa zada nim kijugem, Deklaracija svojtva item u C# gas: vik key] {ets sets} UC# svojstvo Ttea je implementirano s pomoéu indeksnog opetatora({)) Stoga ee mentima svih DictSoraty abjekata modetepriscupitikoriste sintaksw pomakea, kao dase radio pou U primjert 9-18 prikazano je dodavanje elemenata u Dictfonary koji se zatim vada. ss pomoéu svojstva Item. Primjer 9-18. Svojstvo Item kao operator pomaka anespace Dictionary public class Tester Static void Main() ‘ 1) brad 4 iniehjalszira novd rjetntk Dictionanycstring string» Dictionary ew Dictionary ct¥ingy string Qs Dictionary Add(“ooceosi2", “Jesse Liberty"); Djetionary Ads("000123933", “Stacey Liberty"); Dictionary Add(“00015938", Join Cale"); Dketiorary.Ad6(“00077396", “hyn Rand"); 1 ristupa sadano} stovch Console sriel ine(yPictionary(\"000345938\"]: (0)", Dictionay{ "e00145938"))5 ) ’ ) rimjet 9-18 potinje instanciranjem novog Oictionary. Tip kjuta i vijednosti dekla. Fran su kao string, \ypict onary se dodaju etn para lju-vrjednost Uovom se primerubroj adravstvenog xiguranika dodaje imenu osobe (namjerno su kori8ten lain brojevi osigurank). f Nakon dodavanja elemenata odredenom se unosu u rjeéniku pristupa koritenjem tnoja osiguranika kao kljuta, prs * ‘Ako kao kjué koristite referent tp ita ip moze mutiea inizovi ne SH] mote utr ne snc nso wednet bj ts oon ret poenaekorait usp ‘Ako, na primer, kao ku horse objek ployee i promt dene tuBkatorzapostenika, dot ce do problema aka metode Equals i Get Hashcode, koje retnk konaultr, karst to vost, 28 | ProgamianjeGh ole: Pali indelseiteleije | 218 POGLAVLJE 10 Nizovi i regularni izrazi Nekad suludi kupoval atunalaiskijdivo bog dbrade bron vidos. Pea ratunala su se nape koristila 7a 2za¢un putane projet (ako nek nedavno oj. vljeni doleument otkrivja kako Su se Kors za dettrranje). U svakom shia, nckoé se progeamiranje til n katedrama za matematiavelikh seu, a infor mata se smatrao matemaizkom disciplinom, ‘Danas se vefina programa bavi nizovima slova @ne nizovima brojeva, Ti se nizov abigno korste 2a brad jet, rads dokument straranje Web stranica (CH pra ugradenu podréka 2 potpuno funkcionalantipa string, So je jo8 vane, CH nizove tera kao objekte koji ueahuruj sve metode 2a manipulac, sortianjei prettazivanj koje se bitno primjenuja na nz shove Napomena ze Co# programere:u CH nizje tip pave klase, a ne pale 43], mato Slotene operacije s nizovima i usporedivanje wzoraka potpomognuti su regularnim ierazima (engl. regular expressions). C# kombinira snagu i sloZenost sintakse regular nih i2raza koja je iavorno postojala samo u jezicima za rad s nizovima, kao Sto su awk. i Pel, s potpuno objektno orijentiranim dizajnom. ‘Uovom ete poglaviu nauzii kako se u Ci# radis tipom string i klasom System.String NET kostura. Saznat ete i kako se izdvajaju podnizovi, kako se manipulita nizovima i kako se oni ulandavaju ce kako se novi nizovi mogu izraditi s pomo¢u klase String Builder. Uz to cere nauziti kako se klasa Regtx mo¥e koristiti za usporedivanje nizovs ‘sa cemelju slodenth regularnih izraza ~ Nizovi GH nizove tretira kao tipove prve klase koji su fleksibilni, moéni i jednostavni za koritenje PPE]. U programizenewjerhu Caspase ape int 2) bine [dy Sets Cle imoss dbase ors ema cp it yamer sng string alo poet on) temenitiphestgsetng (veliko poteenoshvo) koiste na enim, Deklaracia lae Sting gas bli seed class String Teper Llowthe, onertible,rnaertecs ea delaras oktva kako radio tpetacenoj Kas, Ro znd ivodene ie Kase String nije moguée Klas akoder implemen et semaka suche an pnablect,Iloneable, comertiblesdtnmerabec) -kojodredoefonkcroahon foje asa String ej ost klsomass NET Kore ae 8 Svaki objet string je nepronjen slid Unicode enakons. Cine fp tational at dt mei nh B mics nis zapravo wacjspromyenena bop. sors ws soe Beta memo do se esp: ko pad. Tone wees ‘eve; ako plantate hort wel nova lop oc seca ‘ade korstte Kase Stenger ke ops Kafe w ag realnbo Kao Sto smo vidjeliu poglavju 8, sutele 1Comparablect> implementirau tipov je se vrjednosti mogu poredati Nizovi se, na primer, mogu potedati po abeceth,Svakit ‘¢ niz mode usporediti s nekim drugim nizom kako bi se odredio nihoy redosljed & poredanom popisu" Klase IConparable implementraju metody ConpareTo, Sucele Terumerable takoderje opisano u poglavju 9, a omogueava vam koristenje konstrukts foreach za enumeraciu niza string kao kolekeie chars. Objekt ECloneabe mogu stvoriti nove instance istom vrijednostikojuimajuiavorne instance. Vovomjeslutaju moguéekloniratinizkakobiseproizveo novini kojsadi2i ‘ste vrijednosti kao izvorni niz. Klase ICloneable implementiraju mevodu Clone(). eda see oo epee een ed . Suto wes rs Amicon Bish ast pegenrnoyeay ee ke pare smiatra kako Je wa" manje od wA*, Metoda CaspateOréiral usporeduje redoslijed | stoga je, ber otter ccd ee gl 1:Noortegdariai | 221 Budi da su nigovi nepromjenjii, morale Clone() 28 String vraéa 43... samo relorencacevornog nia. Novi String se stata ako promijenite LS Koma ni string s1 = "ore Two The Four"; Sting sx = (string)st.Clane(); Consale-ritetine( Onject.feFerercefquals(s1,54)): Consalesuritel net Ohjcctfeferenceéquls(st, $3))s ConsoleciriteLine(s);, Ucovom slugaju stjestvoren kao klon od 51. Poi iska2 Mitel ine sp sat Ge rje€ true. Dvije variable za poka uj na ist iz u memory Kad promijenite sx vt zapravostvarae now nize nvornog niza,a kad rmetoda ReferenceEquals vat false, posjednitiskar WriteLine vrata sadrfa j2vornog nita kojem jedodana rice Five Klase IConvertible pruzaju metode koje olaksavaju pretvaranje u druge primitive tipove poput ToInt32(), ToDouble(), ToDecimal() itd Stvaranje nizova Nizovi se najZeSée stvarsju tako da se niz znakova pod navodnicima, Sto se naziva literalom niza, dodijeli varijablitipa string koju je korisnik deklaritao tring Liter" string nexString = “This 3 Nizovi pod navodnicima mogu sadréati i kontrolne znakove (engl. escape characters, 20 50 su \n i \t, koji poéinju obrmutom kosom crtom (\). Dva ranije navedena znaks sluze za o2nagavanje prijelaza u novi red, odnosno novi tabulator. Buduei da je obrmuta kosa crta kontrolni anak, ako unix feivewmet= uti obmatu koeu cru (apr 2a navodenje putane), obrura kos ‘rtu morate oanait drugom obrnutom kosom ertom (\). Nizovi se mogu stvoriti i s pomotu dostovnih literala nizova (engl. verbatim string literal), koji potinju simbolom @. To konstruktoru String govori kako se niz mode koristti doslovno, @ak i ako zauzima vise redova ili sadréava kontrolne znakove. U doslovnom lceralu niza obrnute kose crte i znakovi iza nj smatraju se zamo dodat rim znakovima u nizu. Stoga su sledece dvije defniaije jednake: string Literalone “\y system imyotzectory\\ProgranningC#c5"5 ering verbatiat tera e-Vysystenimyirecory rogramingct.c3°; U prvom redu koristi se literal niza koji nije doslovan te se obenuta kosa erta mors izdvojti". To jest ispred nje se mora napisati druga obrnuta kosa crta. U drugom se edu koristi deslovan literal niza pa dodatna obrauta kosa crta nije potrebna. Drug primer prikazuje doslovne nizove u vige redova: RD | Pogrmianje@ ing literalTwo = "Line One\ntine Tas string vertotin iteraliw = @'Line one Une Too"; FB) seounuardon Cvesu deka ponovno stoznatne. Mtete kris ona koje amen pi nails ej irk Metoda ToString() Jofiedan natin staranja nizoa jes pozivanje metodeTostringt) ma abc {dd bane rezuhata var niza. Sugden pom prensa oe no ana, erp prota veo Geo sea o masa elect cman sso reprerenacu Usjedetem se prinjeru meade spot ate e vtiiednosti pozive za spremanje svoje vrijednostiu niz eae string integenStrrg syintege.Tostring(); Poxiv metode mylnteger.Tostring() vaca objekt String kof se» i che jek String koji se zatim dodjeluje inte Klasa String pruta brojne preoptereéene konsteuktore koji pod’ eéene konstruktore koji podtBavaju ealititeteh- tkeza ddl ejednst iz tipovima string, Nek od thtonstuboon meee ‘alt vam strane niza prosedivanjem pola znakovail pokazivaéa na snak, Poche, divanje poli znakova kao parametrakonseruktoru String svata novu inatsnce sea kompaubiinu s CLR-om. Za prosijedvanje pokazivaga na znak potteban e marker unsafe koje objasnjenu poglavju 22. Rad s nizovima Klasa string prufa razne metod itode 2a usporedbu, pretradivanje i tad s nizovima, ana vodnije su prikazane w tablici 10-1 7 ” ia Tlic 10. Metode pola za Basu string fa pae Soka srvty nooo eles pane comare( Preps sab neta sted Conger) Ppa ela nao -kututolke postavte. naceeuen sree concat( Prope saa mda op ean con Annas metas tapanjndeegn, asls0) Desperation veo Foxade W:Niiregani iat | 223 Tablica 10-1. Metode i poja 2a klasu string (nastauak) Metal sw fora) Prepetee naa meds aj frat nis pomauspeace format, 2oin() Peper sat paar ene py vars Indes Aerath amt vias onpateTo() Nersessian, conytot) op raitonkar UPe Ueno fndekith() ata edgraalndil ne aethv ong Equals) edema sues Insert() ata oti suet aa om. Lastindexof() (eis poser pon efenon maa ia entra Padveft() ‘toe visu porns ker tans pope ramscima Masi aa, adkight() ‘stove val pana dk es stan pana macnn kon reaoie() (ieee ala seusct) ada ate fier odetenaknina up startsuitn() Ounaaa pd iadnin dom. substring) Dota pie Tacharkezay() _‘Kptomsloeiznzaupale mak. tatower() ata laparicanapisowmai sva, soupper() oda sntan veld, rie() War se pee say aan zc spdeal zane, Trina) PonaasebaoTr in) aliocanieinica _Tessstart() ease lao Trin() 2 napoli. U primjery 10-1 prikazana je upotteba nekih od navedenih metoda, ukljuéajuci Conpare(), Concat() (i preoptereéeni operator 4), Copy() ( aperator =), Insert(), Endskith() i Indexo4() Prinjer 10-1. Rad snzovima ‘region Using directives vsieg Systems Sing syst. Collections. Generic; sing Systen. Texts sentnepion rnanesrace Horkinghithstrings i © rimjer 1D. Rad wizovima (rastavak) public Cass StringTester static void Wain() ‘ 11 Nizovs 5 kofine Come rast string st string 92 = string 33 © g*Liberty Rsociates, Inc. Provides custen .AET develope, Snesite Tealeing and Congul ting"; Ant resutt; // Cova verltat usporedivenja 11 Usporebuje va niza pritoe ratlskife vei { nila slova result = string, Compare( #1, 52 Consolesuritel inet compare st: (Ob, 52: {2}, result: (2)\a", sty 52, result ); 11 Preoprerctere uspredivanje, wine Boolean ‘paranetar (true » ignorira rash Saved 4eibih & mlih slova) result» string-Compare( si, 22, true); Consolecriteline( “compare” inseasitive\n ); onsolesriteline( *54: (0), 52: (2), result: (2), 1, 2, results 17 Netoda 29 mastovjanie nizova string 46 = string.Concat( st, 52); Conse ciritel inet 36 concatenated fron st and 52: (0) 36 Js 11 Kors pneoptereteni operator ‘tving st ast + 525 Congo siritelinet "57 concatenated from si + 32: {0}, 37 Js 11 netoda 29 kopiranje niza String 56 = string. Copy 27 5 Cangoe rite inet 8 copind Fon 57: {0)", 38 1 orists praopteretent operator string 9 = 38) Console ritetine( "59 = 58: (0), 9 )s 17 Teh nating 20 usporedivanjer Congsdecirnetine woes s9- Cais)? fa)", s9.tquas( 38) ); Console uritLine( oes Equals(59,58)?: (0)", string.tqels( 29, 58 ))5 Console titel ine( 2a | Programiariett Pagal 10: Nan iregsiorizanh | 225 Primjer 10-1. Radsnizovima (ni ak) “oes sge-38?: (0}", 99 ses 17 ova korisna svofstva: Index 5 duBina Console. trite ne "\astring 39 is {0} characters Long. *» s9.ength ); CensobesriteL ine The Ste character is {3} so-tengen, 918) 35 11 Testira da 1 iz tartava 30 skagen mokove Console sriteline( “s3:(0}\nénds with Training? (a)\0", 3 SBebrdsmith( “Training” ))5 Congo critel net Ends with Consolting?= (0)", sastedsultn( “Consulting™ ) Js 1 ve Sodeks podriza Console crieline( *\othe first accurzence of Tzaining ConsolevriteLie( in 3 {5 (0}\n", SBelndexOF( “Training” ) )5 1) Uets rijee excellant prije training string #10 - #3-Tosert( 10, "excellent * J; ConsateshriteLina( "0: {0V\n", 510°); 1) Nodete kowbinirats dia niza na slJedes eatin: string sit = #3. Ingert( #2, IngexOF( “Training” ), excellent”); congolesuriteLine( "11: (O)\n", 511 Js > , Primjer 10-1 potinje deklaracijom tri niza string st = "abot ng #2 = "ABCD": tring 53 = e'Lberty Associates, Inc. provides cston NET development, fnesite Training and Consulirg"; Prva dva niza su literal nizava, a te¢i je doslovni literal niza. Prvo se s1 usporeduje 58.52. Mecoda Conpare() je javna statigka metoda klase string i preopterecena je. Prva preoprercéena inatica uzima dva niza i usporede ih 1 Usporeduje dra nize 4 priton razlikuje velika i nala stove result = string Compare(st, #2)5 Gonzole writeline(*conpare 21: (0), 52: (3), result: (2), 26 | Fegeniane © ova usporedba razlikuje mala ivelika slova te mote vraiti razitte vrijednosti,ovisno orezultatima usporedbe: + Negativan cjeli btoj ako je prvi niz manji od drugog niza + Nulu ako su nizovijednaki + Pozitivan cijli broj ako je prvi nlz ve6i od deugog niza Uovor sluéaju alae pokazuje kako jest ~manji od s2. U Unicode (kao iu ASCULju) malo slovo ima manju vrjednost od velikog slova: compare St: sed, 52: ABD, result: -t Druga usporedba koristi preopreretenu inaticu metode Conpare() koja uzima tri, Boolean, parametat ja vrijednost odreduje treba lise w usporedbizanemaritirazlika izmedu velikih i malih slova, Ako je véjednost ovog parametra ,zanemati razliku* true, usporedba se izvodi bez obzira na razliku izmedu velikih i malih slova, kao w ljedesem primjeru: result « string Comare(st,s2, true); ConzolertelSoeconpare insensitive"); Console Reel ine( "str (0h, 522 (2), result: (2), 51, 92, result); Recultat je lpisn sdvaiskaza tet ne()kaka biedov bill dovojno | rath’ tskanje uk (Ovog se pute razlika izmedu velikih i malih slova zanemaruje i rezulta je nua S60 ‘oznaéava kako su dva niza identiéna (bez obzira na razliku iamedu velikih i malih sloval: compare insensitive sa: abcd, 62: ABCD, results 0 U primjera 10-1 zatim se nastavljaju nizovi Postojinekoliko nadina dase to postigne. Mofete koristiti meted Concat() koja je statitka javna metoda klase string: string 56 = string.coneat(s,52)5 ili jednostavno mozete korstti preoptereéent operator ulanéavania (): string $7 = 81.4 525 U oba se sluéaja u izlazu vidi kako je ulantavanje bilo uspjetno, 56 concatenated frot st snd 52: abedabco 7 concatenated fecw $1 522 abeoRbCD Sligno come sei kopiranje niza moze iavesti na dva natina. Prvi je s pomocu staticke metode Copy() string 6 = string.Cop(s?)s ele 0-Niireuariizad | 27 Time se zapravo svarajudva zasebna niza s stim vrijednostima, Buduéi da se nizoy re mogu mijenjai, ova je natin beskoristan, Boje je Korstiti preoptereéeni operatar dlodjebivanja il metodu Chon fspomenuta jeranijew pola) koi daju die variable koje pokazuju na sti nz u memo ‘Metoda Indexo#() unutar nizalocira podniz, @ metoda Insert 4) umete nowi podnia Ey kopij izvornog niza Po jedi kod pronalazi prvo pojavjvanje Tyeining usa ConsoevriteLine( rhe 88 accaterce of Taking *}s Consotectieeine (in #3 {eo}, " Sar Indeot(Trainig)s Uialazu se vii kako je poniak 102 “he First occurence of Training in 33 is a0 string 69 = 38s Klasa String prufa tsi natina 2a provjeru jednakosti dva niza. Prvo, mo2ete koristt preoptereéents metodu Equals() iizravno upicat s9 imal 8 ita vrijednost: Console eriteLine("\aboes #9-Eauals(s8)?: (0)", 9 -£q1s(58)); Drugi je natin prasljedivanie oba niza do staitke metoce Equals) klase String onsale -arsteLin( "Does cquals(s9,58)2: (0)", string-Eqals(s9,s8))s Konatno, motete koristti i operator jednakosti (cu) klase String: Console sriteLine( "Dues 5800587: (0)", 49 = 58); Tuvriednost zatim mosete hors 2a umetane ijt excelent irazmaka utile Rij se, zapravo, umece w kopiju niza koja vraéa metoda Insert() i zatim se dese ue nizu si: string 530 » 53 Insert(101,"ecellent’; Console riteLine("es0, (0}\,s10); ela je sljecect: 10: Literty Associates, Ine. Provides cvston et develonmen, on-site excellent Training and Consulting Naposljetku, te operacie mogete i kombinirat string 511 = 53. Insest(s3-IndeF(Traning’), “excellent Cnsoe.sesteb ines: (0)%R" 211); da biste dobili identigan izlaz: sit: Liberty associates, Ine Provides'custon NET development, fonesite excellenfraining snd Consulting Svi Ge natini vratiti Boolean vrijednost, kao Sto je prikazano'v ialaa: Does satquas(s8)?: Tre oes Equals(s9,s8)?> True (oes agonal? True Sliedetih par redova u primjeru 10-1 koristindeksni operator ([) 2a traZenje zadanog znaka unucarniza, a svojstvo Length koriste za vraGenje ukupne duljine niza Console riteLine("\nstring 59 1s (0) characters long.", ‘3.cength); ConsoleswriteLine("he sth charactes 15 (2)\n", ssength, =914])5 Rezultat je sliedeti Sig 998 te ong Tradenje podnizova Tip String pruta preopterecena metodu Substring) kojom siz nizovaizdvasju pod nizov Obeinagieeuzimajuindels koji ozatava potetakidvajanjaajednaced je inatie uaima drugs indeks kj enatana pe zr operacia Metoda sutstringo) tuseiana je w primera 10-2 ‘Metoda Endsiith() pita niz da li se na zavrSetku riza nalani podniz. Stoga, $3 modere prvo pitati zavrSava li Training (80 nije shuéa), a zatim zave¥ava li s Consulting ro je stinito) 2) Yestiea Li nia zovréava 52 shapon makova Console titel ine( °53:{0}\nénds with Talning?: (3)\0", 3, Salendeusth( “Teaining™ ) Console arte ine "Ends with Consulting? (0}", saeknoouinn, “Consulting” ) fs Vizlazu se mote vidjeti kako prva provjera nile uspjela, a druga jest sdiLiberty Associates, Ine. revides custom NET developent, Gnesite Training and Consulting nds with trafning?: False Ends with Consulting?> True Prinjer 10-2. Koritewie metode Subsring() region Using dinecrives sing System; “sing Syston Collections Generic; sing Sytem. Torts tendsepion samespace Substring t 21 Pepi Fee eh | 2 pte tas strigtester static void nain() c int be 17 sina indeks pos }etnies, am fee shtazeledenor( 11 aia zadnju eet % Seeing a2 si. Swostring( Sx 61 )4 1 postaikja #3 va podniz koji potiny (1 aavrdava t2 1x (potetak siyedeee 17 take ds aoe two THEE Ch stesubstring( 0, 05 17 proatath tad rane w St fhm ststaetIndexot( je metode Substring) (nastavak) 1 prov nekolsto nizova 5 hofina Gen? TaGith ecing 1 "One Tuo Thoee Fost”; rijeti 1) posta 53 na podni zapoeingu m8 1h te, raak akon, “to" plus 8 jedan 1 hee = "thee erg 93» sa.sabsteing( $x +195 1 vrata $1 va podnss Kosi apoting® na 0 ako do je riz “one to Sha stesbstang( 0, 5 Ti awetava 0a 1K, 1 vrata ix rank mney Th tenet 6 To" fp oss Last Tndenot( 11 Fostavija $4 na podnis kofin 2 1 raza fakan x, tak0 62 38 PO % String #4 + 52 Substring( e+ 1 35 1 weata st 6a podniz koji 2aptingje va © Tif nevttava na Be, tako 62 Je “On fhe snsubstring( 0, BD; “11 Sostovdja ix na tan raemaky ald 1e8e 1 wa pa je bx sada ~f feb st LastindoxOt(| 1 postavlja $5 na podniz 99 one 4 Uh nod} rammak. Nena zadniee Fazmak Up pa s5 postavija na podniz Koji potinge r= teal ering 35 = etubstring( Sx ¢ 25 20 | Peganianjech agatinge jedan nie “to 1 10-2 Korigtenje metode Substring) (xatavak) ini ensole.uriteLine( “52: {0)\ns3: a)", 52, 83), Console strteline( “et: (O}n55: (2) y ahh 385 (ueoleseriteline( “64: (0}\"", st); EG over 10-2 zapravo ne predsaliaclegantno sjetenje problema izdvajania rijeti iz Eon aije dbrapevaaproksimaca,Pimjer potine stvaranjem nzas: Bing 51+ "0 To Tae Fo"; im se {x pridruuje vrijednost zadnjeg razmaka u nizu: Bede je korak uklanjanje jedi Four iznizas3. To se mote utinit tako dase nizu st Godel podniz koji poFinje s 0, a zaveSava s ix string 0,S8)5 Gsjednost ix se ponovne dodielie poslednjem (preostalom) razmaku koji pokazuje potetakrijeti Three koja sezatim izdvaja u iz s3. Takav se postupak nastavlja doke Bs. ne popune nizovi sass, Na kraj se ispisuja rezultat: 3: Tee a To 3: Oe ss Ore ode Split() treba proslijeditipolje granignika (znakovi koji oanatavaju mjesto jee ijt, a meroda veaCa pole podnizova. Upotreba ove metode prikazana je u + 103. Koritene metode Spit) on Using directives ‘Sften-Colleetione.cenerse; i Spten. Tent Poglae1:N negara | 3T Prinjer 10-3, Kristenje metode Spi (nastavak) dielien, a zatim novi red, Prilikom svako 0g se ulanéavanja stvara nova kopija niza, Be sa se éetiri Koraka ponavljaju 2a svaki saneepae StlnpSpit podhiz kj metoda string() pronade. Ove ee [lecieine doin tongs i ei 41 Pravi nizove s kojina eno raditi e . se sve rame © Rad s dinamizkim nizovima ie tne tee miei Fcc 0.2 Medeor i Biow aad = ci re poner ee ey rant) owner en (ropa i ai 7 teert() Freoptereenjaa meds ojo plt uneenizznaaa ee & trina) Preapedem ja tao estan zh ato ne oi mln cae Se {Zeatdodstig stir semote promis Pim malilacesrng scant [bslersapno medicneswerm nes eek ae ace sing Console.Writel ine( output ); ¥ aes tise i emcee , legion ving rectives rimjer potinje stwavanjentniza a analian: 4 Primjer potinje stwaran sing Syste: sig 5yten collections. caver; Sata Tests tying 51 = "One,Two,Thtee Liberty Associates, Tne."; Granignici se postavijgu na znakove razmaka i zareza. Zatim se 2 ova) nit posiva metoda SpLit(), a rezultat se prosljedyju do petie foreach foreach (string substring in s1.Split(deliniters)) 4h. J roavepicn espace sige ingotler ‘Mero spt tors bjugnu et parans pa'se od mofe serait na | jolie class Stringrester ig frie cing sting sw ptt 9) * u porpunostije zostavjena deklaracia poli stati votd maint 111 Pro abzove + kofina te se raditt Pognite s inicijalizacijom ialaza na prazan riz, a zatim izlazni nia sagradite u Zeit ‘ving t's “be To hee Liberty Resetates, the, koraka. Ulantajte vijednost ctr. Zatim dodajte dvotozkeu, zatire podniz kojije vail? 22 | Pregrmirane Flav 1: Nin regula trai | 233 rinjer 10-4 Koristene Base Stringer (rasta) Regularni izrazi SF egularn erat (engl. regular expressions) predstavliaju moéan jezik za opsivane ek ® Sgr rad stekstom, Regularan se iraz prinyjenjuje na niz—to jest, na skupu znakova & Tokay je niz esto ciel tekstualni dokument. 1 Konstante 39 130m 4 2387 fonst char space =" "5 fanst char Coma = °,°5 a posijelits 1p pokge guansinita + tngina Ge se regenica padi hat{ | delinters = ne chat ‘ Aegulesni izrazi se primjenjujs na nizove da bi se provjerilo odgovara li iz regular sam i2razu, da bi se vratio podniz ili novi niz koji predstavija modifikaciu jedneg dela iavornog niza (Ne zaboravite da su nizovi nepromjenjiv i stoga ih ni regulara jarazi ne mogu promijenit) spec, : coe . h : 11 vporzeba ase Stenghllder 20 agra (1 sbhaneg ze Sector ep ~ seu Stenger; iner= Primjenom ispravno sastavijeniog regularmnog izraza na sjede¢iniz: dre, 0, theee Liber %. sata se bilo koji ili svi pripadajuci podnizovi (npr. Liberty ili one) ili modificirane ina- cepripdsjulhpodnizor pr ers On. Una eplarog az odseden ete Satring in atstiel aiatas ) > esl se fra sta od da dpa anakovslitralai metazakova ea jeonak | Jebel pronatuclnom nat Maca pesca sibel ko sh ka naceaba 1 nator nl pare vegan, Aalatorjestij odgovren2a a= 4 rane relents A, ping, ape regula eas (peo To) Sbject sr tgpenonmat ddaje fomatisens iz : ceeeeetipendernat( (OH {a} etre, string 5 Console sritetine( output 5 ate ) > fdifiran je samo posljednji dio programa. Za modifikaciju niza se umjesto oper aio ieee ee jor metoda AppendFornat() Klase StringBuilder Kako bi se rom ‘Ova) je postupak mnogo uéinkovitj Ila2 jemu ¢e odgovaratl svi podnizovi koji sade rjeti Fron’, {ako potinju novim redom (*)i zavrSavaju dvotockom (:). Jo", Subject il ® Znak * u ovom slutaju analizatoru regularni izraza govori kako teazeni wiz nora * potinjci novi redom. Rijedi Froa" i To su literal, a metaznakovi - hjeve i desne © zagrade ()) te okomite cre (|) se koriste za grupiranjelterala u skupovei oznatava- sie kako se treba poklopit bilo ka od opcia (* fe takoder metaznak koji se korsti ma omatavanje potetka reda). tora ulanéavanja koristi meto {ormacicani iznvi dodavali dim se stvore je iti kao ona} iz primjera 10-3: 4: ne 2 he stopabi se sjedei re 4: Ubersy rontolsaect ate): foc 10ga0 progitati kao: ,Pronadi sve nizave koji potinju novin redom iz kojeg sled [Ss bilo koji od cetisierala, From, To, Subject ili Date za kojih sedi dvototka. 5 Potpuno objanjene regularlh zraza suvie je slodeno 72 ovu ki, 43g. no sv epularn az Koji sek . 4B agg, 0591 regular zac koji se Kost uprmjrima sa objaSnjent. Ako LS fi elie uporpunostrazumjetregulamneszt2z,preporutam vm Kaigu Mastering Regular Expresionswiedanja O'Reilly Media, In, | Ogranigenja graniénika re aarienias ea ojuteebate Kors regularnl ire | Upotreba reqularnih izraza: Regex NET kostur proza objektno orjentiran pristup uskladivanju i zamjeni regularnih Peghnj 1:Naoegolar asi | 5 at | Pegmianiece Regulara ara eu C#temelje na regesp iz jzika Ped 5, ukjudujueh eyalfkatore (2,242, (4a), pacino negaivnotraZene re uvjetnu procien Sviobjekti NET kostura koji su povezani sregularnim irezima potitu iz imenskog prostora Systen. Text Reuglaréxpression, Sredi8nja klasa za podrsku regularnim ize. ima je Regex koja predstavlja nepromenji i preveden regular izraz.lako se mogy stvorti instance klase Regex, klasa pruza i niz Korisnih stati¢kih metoda. Korigteje clase Regex prikazano je u primjeru 10-5. Primjer 10-5. Koristeje hase Regex 2a epulare ieraze region Using directives sing Syston; Using system Collections. Generics sing System Texts Using systen Text ReulartxpressSons; endregion rameace Usingtegtx public class Tester ( static void Main) ( string st = ‘One, Two Te Liberty Assoctates, Ine"; seger thefegen = neu Repex( "Ty Ls Stringautlder sBoslder * new StingBuilder(); int i= 3, force (tng string Integer spt st) ) : -sBuilder .AppendFarmat ( MO} (a's de, sate Js » fonodeetetint (0), stslér)s ? , Prinjer 105 potinjesraanjem nizas1 koje idenigan niu iz pinjera 10-4 string + "to, Tne Liberty Associates, 24."5 Sevata se regular ita koji 6 se Kors za petrativane tog nea Regex thekeger = new Regex(” Is 1, "3s Jedan od preoptereéenih konsteuktora klase Regex uzima nie regularnog iaraza ko Parametar. To je pomalo zbunjujuée. Sto je, u kontekstu C# programa, regulrni izraz? Je lito tekst proslijeden konsteukoru ili sam Regex objel? Istina je kako je BE | Pogamiajece lista objektno orentiranog jezika a i 8 jek argument prosijeden konstruktoruje samo nie Fo sakova; thetegex je stvarniobjekt regularnog izeara , Fosarak programa sligan je ranijem primjeru 0-4, osim to se 2a 1 jetode Sp1it() poziva metoda Split() klase Regex. Metoda BG si nadin kao i metoda String. plit() - via gulamog izraza unas objekta theRegex. hiz $1 umjesto egex.Split() djeluje na poljenizova kao rezultatuskladivanja ig Moda Regex. 5plit() je preoprereéena, Najjednostavnijainatica se pozivaz instancu gb tase Regex, kao to je prikazano u primjeru 10-5. Postojiistatidkainatica ove mene {ois wim nie 2a preteazvane i uzorak s pomotu kojeg se prtraZuje, kao sto jp Bieion Using directives Hsing sto; sig Syston. Collections, Generic; ig Spaten.Texts sig Syston. TextRegularapressions; Fen BP etic cles tester E static void Main() ‘ string s1 = "One Tve, Thre Liberty Associates, Inet; Stringbuilder sbuilder = nou Stringbtlss()s int 18 35 {ovech Cstring sate In Rees seit st, * 1, 1") ) ‘builder typendFomat( *(0}: (1)\", idee, sbstr Js onsole-erteLine( *(0)",sBullder ); rine 1046 goon jc deitan pines 105, jen os wd .jedino ose u drugom prinjeru ne ancira objcktpa Regex U prinjeru 106 e umjeseo tog korist sachs racy code Sit) koja prima da argument: nis ose niregularog eae og prisavia uzomalcko ba gonad Gleoda instance split) jetakoder Plvanjapodjela coded pote ‘reoptereéena s inaticama koje ogranitavaju beoj oloza) unutarcilinogniza na kojem ée pretrazivanje elo WW ireguamlizan | 237 Koristenje kolekcija za trazenje Klase Regex 4JoS dvije klase iz NET imenskog prostora RegularExpressions omoBuavaa pony ‘jeno teadenjeniza i vraganje rezultara u kolekeji, Kolekcija koja 8 vraéa je pe atehcal lection koja se sastojiod nua ili vie Match objekata. Dva bitna svojsvanatcy 4 lbjekta su njegova duljna’ vrijednost, a svako od th svojstava mote Se protiac na natin prikazan u primjetu 10-7. Primjer 10.7. Koristenetpa MatehCallecton i Mach objekata region Using dhsectives using System: sing systen.Collections.Cererics ing systen. Texts hing Syston Text. egulartepressions; ronespace Uingatencelectin t class Test © unite statte void Maint) © setng steingt < "This fs a test string®; 1 Teattbilo Koji arak ita keg sled bijeli prostor sep thekeg = ne Regex( °(\55)\3" Is 11 uxina kolekciju proradenth pklapanje Iatehceltection thlatches = thebeganatches( strings 11 eeolact kroe tolekciju ‘oneach ( Match hetatch An. thtatches ) ‘ Console i telnet thatch Length: (0), thatch Length 5 iF ( theateh. Length t= 2 ) { ConsotesititeLine( “thetateh: 10)", "etatehToString) i U primjeru 10-7 stvoten je jednostavan niz koji reba prona¢i: string stringh « "This is a test string’; §jednako jednoscavan segulari iztaz s pornoéu kojeg se prettazuje: Be | Pegamianie ge thefeg = Nou Regen(@" (ASE); Enis pronalazi nak koji nije bjelina, a znak plus ozna¢ava jedanili vile. Ni \s (nai {San salim slovore) ozna¢ava bjelinu, Stoga se ovim nizom traze bilo kakvi znakovi joins bjeline, a iza kojh sijed Belin a | Upamtite kako simbol (8 isprednizastacadoslovn nz ime se ibje 4B gg, BF NpoUTebe obrnutchose ce). © yialazu se mode vidjeti kako su pronadene prve Zeit rijedi. Posted ij nile pro- ‘nadena erizanjenesljedi bjelina. Ako umemneterazmak izrmedu rijeti string iispred zavrsnih navodaika, program ée pronaéti tu rie ree gis Teng fe Aalina pronadenog podniza ito je swjstvo objaneno kasi w © pom posi Koridtenje Regex grupa F podnizove koji so pronadeni Zesto je korisno grupirati radi analize odgovarajuceg, ® ia. Na primjet, moda éece hijeti pronaci i grupinati sve (P adrese pronadene bilo adieu nizu. Bade x kris 2 citar tual meine aa 2p), tell oxo tea hol bbe ter nd 098 Sp Gen wae) + Klasa Group omoguava stvaranjegrupa rezultata na temeljusintakse regulatnog izraza © ipredstavja tezultace iz jednog izraza za grupiranie Primjr 10-8, Koibtere hace Group thepion Using dizectives “7 asing systens {sing Systen collections, Generic; sing Systan. texts _gtsing System Text Regulartipressions; Fogle :Naodiregubia | 239 Primjer 10-8. Kovitene klase Gresp(nastavak) endregion ranespace RegExGroup c class Test 4 public static vod Hain() ‘ string stringn = "04:02:27 127.0.0.0 Ubertytssociates.con"s 1) Grupa tine = jedan $14 vide aramenks $16 dvtothd Aza tojth slsjeds Selina Regex theteg = nen Regex( 8° (2ctine>(\d)\:)4)\5" + 17 ip address » jeara 114 vise zravenki za kojth slijedi totko eCapldh jest 10 site = fedon Sb esite158)" ) fe amakove 1/ rina kolekehju pronagensh nizova FatchCellection theiatcher = they. Watches( strings; 11 brozank kro kolekefu foreach ( Match theiatch in thetches ) $6 (that eth I 0 : Console.triteLine( “\ntheHatch: {0}*, feasting contd trite ine 10" heaton pe on"): netting heats craps Ds coma tin ae (2), heath tests Dy Primjer 10-8 ponovno potinje swaranjem niza za traéenje: string strings 27 127.0.0.9 LibertyAsseciates.com"s Ova) niz mode biti jedan od mnogih koji sa zabilieZeni u dnevniku Web poslusieis ili koji su, dobiveni kao rezultat pretrazivanja bsze podataka, U ovom jednostavnom primjeru postoje tri stupca odvojena razmacima: jedan za vrijeme unosa zapisa jedan za IP adresu jedan 2a stranicu. Naravno, kad tjeSavate stvarni problem, mazda te ‘morati provestisloZenije upite i Koristti druge graninike i siaéenija pretrafivanja U primjeru 10-8 Zeljli smo stvoriti jedan Regex objekt za pretraZivanje nizova o¥eg tipa kojibi se onda podijelili utr grupe: tine, ip address i site. Niz regularnog izrazt je priligno jednostavan te je primjer lako razumjeti, Medutim, upamtite kak bistew 20 | Pogamiaaject E cvanom pretrazivanj vero} yizkako je ove prikazano 1 gpa toe» jedra {1 vide zanenks 14 soto 17 Hea to}in sje belina oe fegexteteg = nu Reger" (ctie (ys + 1p sbtess» Sed iis vse tarot I teks 11 S20 ke}ihslijedt anak Capel ue + 1 site» Jedn NE vise amaona Peaster: [3g Usedotodimo se na znakove koji saraju grup Cetin (al) jatno koristti samo dio izvornog niza, ane cli izvorni ‘Ni ctine> to grupi daje maziv tine i grupa se poveruje sod {fdatecgleim azazom (\:))\e Om seteguamibnne rede eae ne 1 selon vite samen odnosno chveea ke ele “kolekciju svih rezultata: ae eae Frinjer 10-8 prolazi kroz kolekciju Matches ipronalzi sve Match objekte ko je duljna (Len 4 ath objelta natch veca od nul, Match je promadens ispisuje ecijl con selina: (9), ‘thehatch. Tostring()); 7 Eola plas: = thetotch: 04:03:27 127.0.0.0 LibertyAssociates.con eMC gi Sima grupa tine iz kolekeje thetstchGropita se iednostispisuje Consaleumriteline("tine: {0}, ‘thettch. crops tine"); Time se dobiva izlaz ine: 04:08:27 su Kod zatim uzima grupe ip i site: & Console.taitetine(*ip: (0)", 5 __thetaten. croup "ips £ Gonsolesritetine(*stes (0)", 4 ‘thetateh-Groupst sites “Time se dobiva izlaz: fp: 327.0.0.0 site: Libertyzssociates.com Peale: hizo egies | 2a U primjeru 10-8 kolckeija Matches ima samo jedan Hatch. Moguéeje, medutim, pronag vile od jednog itaza unvtarniza, To modete utinti ako da strings primjeru 10 § rmodificrare na shjedeti natin kako bi umjesto jednog pratio vige unosa log ile ralazti na jednom od dva polo2aja. Kako biste te polodajegrupirali u jedan rezultat na dva mjestau Uzorku regularnog izraza swvorite grupu 2ccaspany> . tegex theeg» new Rope ?etime (Mal \:)a)\s* 6 elrccmeanp sey Qesp (A )o\s" er ecanpanp’5s)s"); string stringh + "04:03:27 127.0.0.0 Libertyfssseiates.com “ + 04:03:28 174010.0 fo0.con * + ogso3:29 27,0.0.0 bar.con * 5 FA Ova grups regularmog izraza uzima sve odgovarajuce nizove znakova ko; Ena tine, al i sve odgovarajuée nizove ko : prom oe Time se uNatchCollection stvaraju ti rezultata pod nazivom thetatches. Genetia se ji se nalazeiza ip, Pomodu ovng regulacrog [§ tara molete analiciac sede: . eee sljedect iat: thetatch; 04:03:27 227.0.9.0 LbertyAsseciates.con ties 0403227 string stringt = "04:03:27 Jesse 0.0.0.227 Liberty * pt 227.0.0.0 nach : site: Ubertyhssectates.con Uniau sena oba zadana polozaja nalazenazivi. Rezultat je sedec Uhetatch: 04:03:27 Jesse 0.0.0.427 Lier etatehs 09:09:28 £27.0.0.9 fo.can time 0803.27 ss tine: 0:03:28 4 {pr 6.0.0.127 ip: 27-0.0.0 PF congarys taberty site: foo-can {$10 se dogodilo? Za8to grupa Company prik: / Zao grypa Conary pikazuje Liberty? Ge je ev termi kj je [kote pronader Tose dgocl erie dru terminpepas ook Coarse ‘im, uhvatila oba termina, To se moze vidjeti ukolekeiji Captures, Sua co ie iiCaptures, kao S00 je prikazano thotatch: 0¢:03:9 127.0.0.0 bar.con tine! 04:03:29, ip: 127.0.0.0 site: barca U ovom primjeru theNatches sadrditriMatch objekta, Svaki put se kroz vanjsku pedis foreach pronalazisijedeci Match u kolekciji i prikazuje se njegov sadr2a} Primer 10-9. opitvane kolekcie Captures eg Using drectives foreach (Match thetateh in theatehes) asng syten; Za svaki pronadeni Match objekt modeteispisati ciel rezultat, razne grupe ii oboje, 4 tin Spoon collections. certs; [Sot Sate et Koristenje kolekcije CaptureCollection £ ames Saki put kad objet Regex pronade podiaraz, stvara se instanca Cpture koja se dodse Iolekeiicapturecoldection.Svaki bjekt Capture predstavja jedan rezulta.Svaka ipa espace Capturetotlection ima svoju kolekeiju rezulaca prikupljenih za podiztaz koi je povezan s grupom. t class Test c PUBLEc static vosd Men A 0 Kijuzno svojstvo objekta Capture jest Length koje oznatava duljinu pronadenog pod: niza, Kada Match upitate za duljina, uzet éete Capture, Length jer Match ievodii2Crow F stein Inge caevet vei Cpture : 11 Nix a3 salizicanje x 1 obatite pozornost da se ime 1 pojajuje na daa neste string strings = ‘4:03:27 Jesse 0.0,0,127 Liberty *; Sema nasjedivanja regulannihieraza w NET-u dopusta atch daw ., oje sue ukljtl metode | svojst2 ovih roditelikih klasa. Group fe, wodredenom smishy, dohvaéanje: dohvacanje koje wahursje zat ‘to grupiranjs podizrars Patch je 2auzvrat Group:Ratchje veaburenje nit gripe podierata koji ine cel te2uea regularnog itaza (video cdnosu fo je\ drugim odnosima potratite u poglavj 5). 10 tear ina tpi epi ety apt hep the» eget Oa Ecemnp sane s AN) Capen dense ¢ Ethane U CaptureCollection se abigno nalazi samo jedan Capture, ali to ne mora obavezn0 biti tako, Mode se na primjer dogoditi da analizirae niz u kojem se naziv cutie mote » steko neaultata 20 | Poganiane@ lech egw | 28 ga ee, Obradai 1) brokaat. kxot kolekctju oneach ( Match theish in theiatches ) 4 (-thetaten. Length |= 0°) ConsolearitaLine( “thototen: (05", ‘therateh.ToString) 3 ConsalentriteLina( "tine! (0)", ‘thetotch.Croups"tine"] )5 CancaleirsteLine( Sp" (0 ‘thetotch.Crouns"p") 5 Cancale trSeeLine( "Conpany: {0}", ‘thetteh Cros “conpany") 5 kao i mnogi drugi abjektno onijentirani jezici, pogreskama ineuobigajenim uve: ‘ima upravlja s pomogu iznimki, Iznimka (engl. exception) je objekt u kojem su utab 7 rene informacije o neobitno} pojavi u program f 2, Vaio je napravi ratte izmeds programerskihpogtetaka, korisigkihpogreaka Sianimki, Programersku pogresku (engl. bug Gini programer i trebalo bi ju ispravei Pri isporuke koda, Iznimke ne predstavjgju 2aftita od programerskih pogresaka ako programerska pogreSka mofe prouzrotitizbacivanjeiznimke, wnjihovo} obradi -nesmijete se aslonitina iznimke, Programerske popreske itebat ispravit. 17 Frolaes kroz Kolekesju rezultata 11-0 geoph. company group untar Rolekeise 177 groups renuitata, foreach ( Capture cop in ‘etch coups Conan”) .Cptues ) © caaseseiteine “cp: (0, ep Tostring) Pogretku moze izazvati i akeije korisnika. On, na primier, maze unijt broj na mjestia 1a kojem se ofekuje slow, Korsnidka pogeeska takodet mote iebacit anim, at {0 motete sprit hvatanjem pogreSakas pomodu koda za provjeru valanost. Kor snitke pogreske bi se trebale predvidietii sprit kad god je to moguce Cak i ako uklonite ve programerske pogretke i predviite sve korisnidke pogreske ‘mote doéi do predvdlivih problema kojisene moge sprit. Mote, naprimjer, pone f_Satimemori ili motere pokuiati otvori datotek koja vide ne posto znimke se ne ‘mogu sprit ali se mogu obraditi kako ne bi blokirale pregyam, p Kad program naide na neogekivanusituaciju, na primjer ad ponestane emorie, on iba ie Gli spokeeée")iznimku, Kad se iznimba tabaci, zaustavja se ievedba trenume metode {stog se odmocava dok se ne pronade odgovatajucu metoc 2a obradu iznimka ‘To znati da Ge se metoda koja se trehutno izwodi prekinuti ako ne mode obraditi ‘znimku, a pozivajuéa metoda ce dobiti pliku 28 obradu iznimke. Ako nijedna od Pozivajuéih metoda ne moze obraditi iznimku, to ée uéiniti CLR, a program ée se odmah ugasit |E Metoda 2a obradu inilti (engl exception handler je bok koda pojektran za obrada isbadeneiznimke. Metode za obradu iznimkiimplementiraju se kao iar catch U ie. alnim uyjetima, ako je ienimka ubvaéena i obradena, program mote ispravit problem ‘nastaviis radom, Cak i ako program ne mote nastavit s radom, bvatanjem ianimke ‘omogucava se isp smislene poruke o pogreSiprikladno zatvaranje programa. ee injes tradenjem kolekcije kroz koju Group spremljen u Groups[“company"} unutar objekta theMatch: 24 | Pogamicanjece ‘Ako u metedi posto kod kojise mora izvoditi bez obzira na abacivarie fenimke (op, adi oslobadanja dodijljenib resursa), taj kod modere stavti u blok finally unucar kojeg ée on sigumo biti pokrenut, Zak i ako dode do iznimke, {zbacivanje i hvatanje iznimki : Nopomena za C++ propamere: U CH se ne mote izbacs bilo Koj Iskaz throw Kako bi se u C#f klosi objavila neuobizajena situacia, izbacuje se jznimka, Za tose oristi kljucna rijeé throw. Sijedeth red koda stvara novu instancu Systen. Exception zatim je ibacuje: ‘throw new System Exception); Lebacivanjeiznimke odmab zaustavjaizvedbu, a CLR tradi metodu 2a obradu iz ‘Ako se metoda 2a obradu iznimki ne moze pronaéi u tekuéoj metodi, izvedbeni okolis ‘edimotava stng provjerava pozivajuce metode sve dok ne pronade metodu za obradu anim, Ako se stog odmota sve do Main(), x metoda za obradu iznimki alje prona- dena, program se zatvara. To je prikazano u primjer U1 Primjer 1-1. tzbacivanjeienimke ranespace Programing, (Sharp t using Syston public cass Test pbc static void #ain0) Console sriteLine( “Enter Maine") Test t = neu Tests tFunct()s Console-rSteLine("Eat Main , public void Funex() ‘ onsolesriteLinoEnter Fares. -.°05 Me | Poganiane rinjer U1. Iebacvanj ene (nastavak) fue) Covsole artetine( "Exit Fun..." ) public void Funca() c CorsolesriseLine( "Enter Fure2.-"); ‘You nex pstonEceptlon(}; Cancoleststeline("Eeit Funct. .")s eda ovaj program pokrenete u redimu 2a ispravijanje pogtetak: ojavit Ge se okvir Sporakom ception was unkandled” (anima aij obraden) ki kao to je prika- A rano naslici 11-1, Troubleshooting 1s (Fate ec Ska 1-1. Tika koje sp obrodera Alors View ei prise es pojtinostiminie jai cba a On jnosaran pie ne konzoli ispisuje svaki ulaz i ialaz iz metode. Metoda win() stvara instancu tipa Test i poziva Funea(). Nakon ispise poruke Enter Funct, metoda Funea odmah posiva Func2(). Func? ispisuje prvu poruku iizbacuje objekt tips E systen exception Invodenje se smiesca zaustavlja, a CLR u Fune2 tra3i metodu za obradu ianimld. Metods ne postoji ce izvedbeni okolis odmotava stog (skaz exit se ne ispisuje) do " Funcx(). Kako metoda 2a obradu iznimki ne postoi niu to metodi, poziva se zadana ‘meroda 2a obradu koja otvara okvir s porukom o iznimci eae Obici | 257 ~(Ricaion at 38 Salen Bion war row) IBrtencaere acter} ot “Excoctin aye Siston ccesto was own” Tonnes © a Tienngireacentn Test Fire mc xurait nd vor Slike LU-2,Pojodinastizionke Iskaz catch Metoda 22 obradu iznimbi se u C# naziva blok za hvatanje i stvara se S pomoéu kdjuéne rijeti catch, U primjeru 11-2 iskaz throw se izvodi unutar bloka try, a blok catch obavje8tava kako jeiznimka obradena. Primjer 11-2, Hoatanje ignimbe ‘region Using ctzectives sng Systems sing Systen col ectSons.Cepersc; using Syston, Texts endregion rasespace Catehinghtreeption { public clase Test te bade seatse vase ting) Console.tritetsne| “Enter Main eat t= new Tests teFanca()s Conaohesinite ine "Ost Moin 2s) Progra jer 1-2 Heatanje enimke (nastavab) ) pebitc void Funex() console ritetine( “Enter Funct..." fanea() Cansoleshriteline( "Ext Funes..." ); > pubic wold Fone) c ongolesritetine( “Enter Func..." J; ty { onsolecritelsne( “Entering ty block. ‘igo nen Syste Exception); ‘ovsobesiritetine( “Tasting Uy block..." } catch i apse tetra en coh ad wae » Consleshritetine( "Est Faeds”) Eimer 11-2 gotovo je idemtitan primjeru 11-1, razlikyje se samo po tome Sto Sadi lok try/catch. Blok try se obigno stavlja oko potencijalno ,opasnog' iskaza, na pri njer onog za pristup datoteci, dodjelu velikog prostora u memorijisiéno. Boa iskaza try nalaz se genevithiiskaz catch, Iskaz cateh iz primjera 11-2 je genericki Pe nije odredeno kakve tipove iznimki treba hvatatl U ovorn éeslutaju iskaz hvatati ‘abagene iznimbe, Kotistenje iskaza catch 28 hvatanje odredenih tipova iznimki ebjatnjeno je kasnije u ovor poglavlju, sduzimanje korektivnih aklja EU primjera 1-2 iskae catch samo inveStavaohvatanju obra inimbke.U pres strariog Zivot verjstno Ce se podizet nekaakcja zaspravianje problema koje $F vxrokova ibacivane anime. Ako, na prier, koran pokuSava otvortdatteku ja je samo 28 itanje, mote se pozvati metoda koja korsriku omogucava promjent Earbuta te datceke. Ako je program ponestalo memore, Kors se mote prusith Emoguénost zatvaranja drugih aplikacja. Ako nema drugog ilaza, blokeatch mote fis poruku o pogresi kako bi korisnk anao 80 nije wed valve cobain | 208 ‘Odmotavanje toga potiva Pazlvo pogledste izlaz primjera 11-2. Primijetit ete kako je Kod u8a0 u Kein(y Funct), Fure2() i blok try, Nema naznake da je Kod izafao iz bloka try, iako sey da je izaSao iz Funct(), Func2() i Main(). 10 se dogodilo? lzvodenje se zaustaviia odmah nakon izbacivanja iznimke i predaje se bloku cate, (Ono se topée nee ut two stat ha. Nikad mete dodo rea ko ops iskaz exit za blok try. Blok catch upravija pogreskom, a lzvodenje se zatim vrata krog kod koji sie iza catch Kada ne bi bilo bloka catch, stog bi se zbog iznimke odmotao, ali to se ove ne dogada jer postoji blok catch. lznimka se sada obraduje. Problemi vige ne postojei program nastavija sradom. Ovo de biti neStojasnije ako blokave try/catch premiestte cdo metodu Funct (), kao Sto je prikazano u primjeru 11-3, Primjor 11-3, Hvatanje « pazivnaj metods region Ung onectives using Systems Using Syston.collections.Generic: Using Sister Tet sendcepson sanespace CatchingtxcepiontaCalLingéine pubic class Test pubic static void Moin) onsolesriteLine( “Enter Wain. Test t= ren Test); teFuncd()s Console ititetine( "Ext Main D) ) pubic void Fuea() ‘ Console eiteLing( “Enter Funct." 3 fa + ConsolestriteLine( "Entering try block...” ); Fanea(); Console riteLine( "exiting try block } catch ongolecirteline( Exception caupnt and handed.” Js 250 | Regaine prior 113. Hoatane u porno) metodfnastavak) ) Console ritetine( “Exit Funct." ) , public wid Funca() c (oosole ritetine( “Enter Funcd,..* ); ‘om new Systen-Exeptlon(); Console iritetine( "Ext Func Tesimba 2 ov0g pura ne obradue u metod Fune(), ved u Funca(). Kad je poowana ametoda Fune2()isisuje se iskaz Enter jzatim se izbacue znimka, lzvodenje se rau sta, aizvedbentokoli trai metoda za obrady iznimki koja, medutim, ne posto Stog se odmotava i izvedbent okoli8 metodu za obrada pronalaziu Funei(). Fosiva ce iskaz catch, a iavodenje se nastavjia odmah nakon iskaza catch, ispisujul iskes exit za Fanct() izatim za Main() | Bien je da tazumijece zaso se iskaz Exiting Try Block i Exit Func? ne ispisuju, Ove |B jeklasifan primer ukojem smjestanje koda u program za ispravjane pogresela i pro- lazak kroz njega mogu pojasniti svar. Stvaranje namjenskihiskaza catch ¥ osud smo kori samo genertke kaze catch. Mogu se napsatjnamjenskiiskasi {fateh koji obraduju samo neke iznimke, ma temelju rithovog tipa. Primer 11-4 pra, “je kako se oznatava tip iznimke kojuiskaz reba obradin, tone Primer 11-4. Zadavanje enimke 20 hata region Using dizectives sing Sten, sing System. colleetions.ceneic; sing Sten text fesrgin | oer Sectors public clase Test i public static void Main) t Test t = now Test()s tclestrane(s Poa Tobin | 251 Primjer 11-4, Zadavanjelenimke za hvatanje(nastavat) 11 Foksiaj dijeljenja dva broja 11 S cbtade noguce izinke public void TestFuac() t wy { double a + 5 double b = 0; Console urdteLine( “(0} / (3) = (2), 2, by Oebivide( 2, 6); ) 11 Prva ide tip najtesée i2vedene Ianinke earch { Syston DividedyZeroeaception } Console-hriteLine( Dividesyzecakeception cave”); catch ( system Arithneticxception ) ‘ Console trite ine( “aritheeticexception caught!" ); ) 11 ener ith tip izinke je 2adnjh catch c ongole-riteL nel *Unkaoun exception event” )s ) ) 11 Dijeli ako Je eeavoljeno public double Dobivide( ‘double a, double b ) i it (ba 0) {throw nen Systen.Dividebyerotxception() it(aso) row nen Syston Ariteticexception(}; return 3b; } , U ovom primjeru metoda obivide() ne dopusta da se nua podijeli nekim drugim lijelienje nekog broja nulom. Ako broj pokuSate podijelit nulom, iabacuje se instanca DivideByZeroException. Za dijljenje nule nekim drugim brojem re postoji odgovarajuca iznimka: dijelienje mule deugim brojem je dopustena mate- imatitka operacja ine treba se izbaciti iznimks. Pretpostavimo, medutim, radi OR primera Kako ne Zelite da se mula dijli drugim brojem, veé da se izbact iznimks brojem, nit do ArithweticException 32 | Pogaminjece fd se izimlea izbaci,iavedbeni okolié redom mimi odabice prvu odgovarajucu, Kad progra Breve seed izlaz: Provjerava sve metode za obradu iM pokrenete s 395 ib7, genericat 5/7 = o.raztsraenesrngs Brema ogckivanju, iznimka nije izbatena, Medutim, a ko vrijednost a postavite na ul, genera se ova izlaz: : . ‘on. Buduéi da co nije odgovarajués i enim ArithnetcException koja odgovata, reipostavimo, na kraju, daa ivideByZeroFxception Iskazi try/catch se mogu rasporediti tako da se neke odred se neke odredenije iznimke hvataju u eoj metodi ado se drug iznimbe, koje su vie genercke, hvatajuu metedarna hoje ialaze wife u pozivnom stogu. Totan raspored bit ée odreden vasim specifnine nekim insta i i f ickim instancama isbacivanjeiznimke i odmotavanje stoga mote uzrokovatt Hem. Ako ste, na primje, orvorl datoteku ina drugi ror ‘agin zauzimateresurs, moze in zatcbati moguénost zatvarana daoteke il pradnjenja privremene memorje B'° postjiakcia koju moran ives ez obcira na BPI ako trebate zatvoriti datoteku), mozete. izabrati izr i ae medu dvie strategije. Mokete rover US. Kovitene Blok finally (astavak) cate ( Systen-Diviceeyeeretxception c console riteine( esr cat \dogeketioku teh Va avo apa akc ha poveeva se opasnost 0 Pogrka, U Cp fy, Medan Sprain ci ks as. ss i ny esac xin en ie osredene mata Apo da dna abe os are at vee Kako ce se na ktaju merode, bez obzira na sve, da‘oteka zatvo svar njeSta u blok finally gdje se ono onsen sisitetine( “Unkoain exception caght™ Ys ) Razvan in sees sri prod oa tera Store “on vee er obra na eacivane anim ConsoleairiteLine “Close fe y prinjer 15. Korsterjebiak rely region sing relives 11 Dies ako fe dort ove due doisce Ssbe a, dale &) ing Syste - eing Systen Collections Generics aC) cing SystenTexts throw ew Systen-Dividebyrotaceptien(); sf (ae) endregion throw ew System. AeithnetLcException); seturn 9 / Bs ranespace Usingrinaly jase class Test gublic static vod Main() U primjeru je izostavljen jedan blok catch kako bi se uitedjelo na prostoru, a dodan est ta ane Tt) jeblak nally. Blok finally se irvodt ber obtira na jebacivanje iznimke tu ob izlaca stestFure(s i 1 oxukavs podsgelith ova broja 1 1) obra oguce Saninke pobtic vot Fes) wy ‘ Blok aly s€ mote stoi sli ee Wakova catch, no 2a vodene 48 g., Boks tray potreban je lok ty Pogzetno je ai blk ray 5 * $8 pom neat contin, trail gta conte. atte “Open 486 be ‘oes 5 le b= 0 saath vataunt “toh =F a anal 2, 8) cena cent es ty or ay mt pla” Js Be poeretk ~ al jos nismo pescupll iznimcl nit pregedal sam objekt Exception bjt ysten. xcept ion pr az krine metodeisyosta, Soto Ressape je ocmacie znimci, a pri tazlog tenog pbacivana.Svojstto Message mote se 70 ita - kod koji je izbacio iznimku moze seojstvo Message postaviti kao argument onstruktora iznimke. 11 pro ide tip naftette L2vodene Saninke Boosey prude veru do dake ssa pore poezne amkom, —— Peale Teche iinkh | 255 ISH | Pogramianiect bloke try, Svojtvo StackTrace se moze samo éitati, a postavja ga izvedbeni okols. U prinjey 11.6 se svostvo Exception. tlelpLink postavlja i dohvaca kako bi korisnik dobio info. macije 0 DivideByZeroException. Svojstvo iznimke StackTrace moze dati trag u stogy za skaz pogreske. Trag u stogu prikazuje stog poziva:niz poziva metoda koje prethode _metodi u kojoj je izbacena i2nimka, Primjer 1-6. ad sobjtom Exception region Using directives using Syetens Using Syaten.Coldectton. ners; sing Systen-Texts sendcepion oes cpt ¢ pic cas et t public static void Main() i rest = ev ets Tietocth ) 17 Rokatova podsjelits ova broja 17 cbraduje noguce s2ninke public votd TestFone() ¢ ty ¢ Console.triteLine( “Open file ere ); double @ = 125 ouble © ConsolevteiteLine( *(0} / (2 3, by Osbivide( a, b ) }s ConsolesieiteL net “This line may ox may not print™ i ) a, 1) NajeeRée itvodene Saninke Sau prve 256 | Progamizanjece #8) Nepomenaza va6programer-u Cf arbaebit piv pilkom dla 8g, Hen mpc nc an oe oh Po ® & mogucnoticbacvana pores weed konektor, noida cela ch | nwancoc vargele eat start unuar ka ay Ty Imei, mate sro ogranienje despa varie ma lok yg seonaneée moti referencia onitarHakovs ath i fray Nabe je varia bjlea dtlrd sped loka ay instance mt injer 11-6. Rad objektom Exception (nastavat) Ete ( Sendivdeertsception«) (onsaleciritetine( \WOtvidedyzercException! hg: (0) esters); (onsale-areline( “\oelpLink: (0), e,Helphink ); Conseleniriteline( "aiere's a stack trace: {o)\nt, eStacktace }; » Cath (ystenepten ») (Consoles ine( “Unknown exception caught” + e.Hessape ); } finally ( Congo krtetine( “clase file here,” ); ) 11 jes ako fe dozvejeno fpblic double Dobivide double 3, deble b ) 0 if(b0) ( DivideByeroeaception @ = ew Divided ZeroExcption(); estelpLink = http: //amuLibertyassocates.ca; throw if(anoy throw nen rthmeticbacption(); returns by Tag ustogu koje vidi w ilazu popisuje sve metode redosijedom obrnutim od redo- gleda ponvania.utagu se vidi kako se pogredka pojavilau meted DeDivide( koje Pozvala metoda TestFunc(). Kad su metode duboko ugnijezdene, trag ustogt varn ‘mote pomoti u razumijevanju redoslijeda pozivanja metods ‘2 Uprimeru se umjestojednostavnog izbacivanja iznimke DividebyZeroException stvara g nova instanca iznimke: DividebyZerotaception e = new OividetyZerotxception(); Ne Prosieduje se prilagodena poruka pase ispisuje zadana poruka: Dividebyerotaception! mg: Attempted to divide by zero. Fool Obes inia |257 (Ova) red koda se mote modificiati kako bi se prosliedila podrazumijevana porka row Divietyzeroexception( “You tried to divide by zero which is oot netningfl); U ovom slutaju, izlazna poruka oslikavatée prilagodenu poruku: DividebyZerotsception! Meg You tried to divide by zero whch 15 rot resningtl Prie iabacivanja iznimke postavlja se svojstvo HelpLit fetlelpLink = "hetp://nsLibertyassoctates.con Kad se iznimka ubvati program ispisuje poruku i HelpLink catch (system Oivigenyzerobception €) Console Ar Stlina("\nDividebyzereexception! Wg: (0)", .easage) onzaiesMriteLing(*oiepLinks (0}", eselpLing); ‘To vam omoguéava da korisniku prudite korisne informacje. Uz to, ispisuje sei Stac- Trace uzimanjem svojstva StackTrace objekta iznimke: ongolesmeiteLine("\ere’s a stack trace: {0}\", esstackirace); U izlazu ovog porziva vii se potpuni StackTrace do trenutka izbacivania iznimke; here's 9 stack trace at Propranming Sharp. Test.0ebivide(Oouble 2, Oouble b) in Crhencexceptionlb. cs! Line $6 at Programing. Sharp Test TestFun() in. sexceponds.¢5 Tine 22 Nazivistaza su skra¢eni pa vas izlaz mote izgledati drugatije. Prilagodene iznimke Ugradeni tipovi iznimki koje CLR pru2a, zajedno s prilagodenim porukama prika zanim u prethodnom primjeru, bit 6e vam dovoljni za pruzanje dovolino detaljih informacija catch bloku. Ponekad ée vam, medutim, biti porrebne zasebne metode za obradu iznimki ovisnoo uuzroku iznimke. Za co éete morati swvorti vlasite prilagodene tipove iznimi (toga modete stuoriiizasebne metode7a obradienienki). Prilagodeni tipoviiznimkimogy ddodati vite informacija ili sposobnost, no glavni je razlog postojanje drugatijeg.tipa kojeg blok catch moze razlikovati [: 1 Microsoft preporuéa da seu potpunost iabjegava ichacivanje snow AB. 205 objets Exception, pa Eas objets AppLicatLontxception. Te je 4 objekcenajboj eretirai kao apetrakne pave 38 | Pogmianjech Jednostavao je potrebno stvoriti vlastitu klasu prlagodene ienimie. Jedino je ograni- fen) da ona mora izvoit (izravno ii neizeavnc) i Systen.AppLicationeneeption U piers 11-7 prikazano je swvarane prlagodene imimke. Prine 1.7 Storanje prilagodene inte region Using directives using Sten; SE sing poten Collections.Ceneric; ing Ssten Tests endregion romespce Custontncetions pbc Clase mycurtonxception + Systen appiationtnception public Mycustenreaption( string message) ase(aesage) ( ) pualic class Test c pti ste wad mind) Test t = new Test(); trtestrone(s , 1 Pokutava poset dra brojo 1 obradage neg denishe public void TestFune() ty Console ritetine( "Open Fite here* ); dove a= 0; double b= 53 onsale siiteLine( “fo} / (2) = 2)", 3, , DoDividel a, 8 ) Js Conse iriteline( "This Line nay or say not print” ); > 1 wajtesce i2veden tip taninke ide prvi ate (ste divsetyeotiception onsae eriteline( “\woividebyZercexception! tg: (0)", Pea Ohad | 259 rimjer 11-7, Saran prilagodenetevimke astavak) Biopusten. Umijesto prilagodene iznimke mote se korstit | Aritimetictaception, no F obi moglo abuniti druge programere jer se djlitelj muta obitne ne smatra aritmet Eom posteskom. extessate onsale rite ne StaespLinks()\n", e.MelpLink ) ren eee /ponovno izbacivanje iznimki F Motds Cee hyjetida blok cath iavede neku potetnu korektivnuakciu zatim ponoveo baci iznimku do vanjskog bioka try (u pozivejuéoj metodi). On mote izbacit ist Emote iabacsi drat iznimu, Ako iabact drugaéju ianinku, motda Ce ievorn ‘enimku ukljucit unutar nove iznimke kako porivna metoda mogla razujet pret ferdne iznimke. Svojtvo InnexException nove iznimke uzima izvor ini ConsolesMrite tel omycustonexception! Mg: (0}", esmessage ): onsole-riteL ne *\oelpLinks() ny esHelpLink 2s ) catch [Neke anime ij mislasamo u kotekst koje st iebagene. To Conga sriteLino( ed 4g, s osobito oanosins, primjerice,NullReserenceception koja mote bit 5 rezultatpogretnog unesa, Kadatone moet predvidepreshodom pro \jetom unoss anieke tebe ubvai zai baci Axpunentxception koja Ge ponivatelu dat rotnju informacuo veroku problems, L nally Console.MriteLine( “Close file here.” ) ) 11 Dijels ako Je donwjn0 lie double Dopivide( double a, dvble b ) i sf (bao) Ponckad jena granica lj sf dizajna dobro postvi metas heatanje ‘ako bi se ubvatile neoédavene rime, U tom sata modeteizbact prilagodent ianimki Entersaleerorexception koja Rijenesxombo ag alist kako je» kerponeatos neta polo krivom ser Kako je Tnnenxception takoder iznimka, jona mode mati unutarnju iznimku, Stoga se ciel lanac iznimki moze ugnijeadiai unutar drugos lance, kao 810 se Figurice babuske A savjaiu jedna u drugu. To je prikazano u primjeru 11-8 ividebyteratyception © = Tew DivigesyZerebxception); eelptink = "tips nt Libertyassocates.con"; throw 6 ycustonexception e = new hycustonEecepion( “ant have zero divisor”); epi = : iteps/ ue Tibertyassochats. ‘throw ren Dividetyzerotzception( “EL - ivideyZera Exception’ ); Kako je kod sveden na osnovne element zlaz moze biti pomalonejasan. Najbohinagin 12 razumijevanje ovog koda je propustiti ga kroz aat za ispravjanje pogretake Potnite pozivanjem metode OangerousFuncy() u bloku try: ty Dangerousrune(); okie Ohad | 20 Metoda Dangerousfunca() poriva. metoda DangerousFune2() Koja posi meio DangerousFun3(), a ona zatim poziva metod DangerousFunes().Svi ti potiv nage se sntasvlastiih blnkova try. Metoda fangerousFuncs() na kraj ibacule init Divideby2erotxceptionDivideByZerotxception inageima vastita poruku oPogrese sh slobodino mogete pros prilagodenu poruku. Ovde, kako bie shied dogadainse lakSe idetifciao, prsljedena je prilagodens poruka €1 ~ DividebyZexo8 ception anima izbagena u metodi DangerousFuncé() uhvagena jeu bloku catch unutarmeode DangerousFunc3(). Logika metode DangerousFune3() je da u slutaju uhvaceneiznimfe ArithneticException (poput DividebyZesotxception) ne poduzima nikakvu akejuy, ys samo ponovno wzbacuje vnisokss catch (Syston AitinetSctxeption) Console hriteLine(Aesthaetic exception caught In 053, aod theo." “sm Sintaksa ponovnog izbacivanja ist iznimke (bez modifkacija)sastojise samo od rit throw Lenimka se stoga ponovno izbacuje do metode OargerousFunc2() koja ju hata, pod ‘uzima akciju ispravljanja i izbacuje novu iznimku tipa Exception, U konstruktor te ove iznimke, metoda Dargerousfunct() prosjeduje prilagadene poruku (€2 ~ Furr caught divide by zero) {izvornu iznimku. Stoga izvorna iznimka (2) postaje Ime Exception za novu iznimku (E2), Metoda DangerousFunc2() zatimn i2bacuje ta nave ianimku €2 do metode DangerousFunct() Metoda DangetousFunca() hvata iznimku, izvodi odredenu akeiju ce stvara nov janimku tipaMyCustonException, Ona novi niz (E3 ~ Custom Exception Situation!) pro- sljeduje do konstruktora, isto kao i upravo ubvagenu izntimku (E2). Upamtite, uprave ubvagena iznima je ona fja je umataraja iznimlca BivideByerotyception (Et), Sada imate iznimku tipa HyCustonfxception (€3) unutarnjom ianimkom tipa Exception (£2), koja zatim ima wnutarnju jznimku tipa DivideayZeroException (Ez). Sve se to zatim izbacuje do metode test koja hvata Kad se pokrene, metoda catch ispisuje pork 5 ~ caston Exception Situation ‘nasi prolaziksor love vanjskih iznimiki, ispsujus nthove poruke: shite (immer |= mull) ‘ énsote rite n("(0) mer Messag0 Sovee = Sones lnecseagtion , Uialazu se vidi lanacizbageni i ubvaéenh inion Retrieving excegtion history Es Func cought vide by 2 1 bleiebyzere Dxepton erin? ae njsto toga modete iza iznimku pozvati metodu Tostring(): onsale Nite(eTostring()); By ilazu se vidi cel og pores is njim poverani stogewi poniva tethzovingnceptions.Myustonfaception: £9 - Custon Exception situation! Sy systen-Excption: £2 ~ Func? caught divide by zero > ‘Syten-OivicetyZerebxception: C1» Gividelylero Exception at Rehaosngeateptions Test DangerowsFanca) Sn c2\xethroingenceptlonch sethrnlagecceptions-cseLine 114 at Rethrowingecceptions Test-DangerousFinc3() sn c2\ethrowingenceptians\ retheoelngexceptions-césLine 102 at Fethrowirgecceptians. est.CangerousFurea() sn c:\rethronirgenceptions\ ethiowingercetions cs:Lire 79 = Ea oF Unter exception stack trace == at Rethrowingexceptions. est .CangerousFunca() in c:\eethronsngenception®\ rethrowingexcept ions. ceTine #9 ‘at tetnowinghncepions. Test Gargerosfuact() 48 dight ? nostavne klase Student i Dog, Objektima Student plik ja dod fe eae eubhic class Stent Cnparison thet srstCanstrst ¢ : public Stoertstring we) psc rca ten Ta) this.name = rane; return seight.tostrine0)s kKlasa Student zalujeva duije metode: prvu koja premoscuje metods TeString()idrogu yp rete it ts koja ée se uéahuriti kao delegirana metoda, Klasa dok takoder premo$évje metodu ToString() i implementira staicku metodu s Fspravnim porpisom za delegata. Obraite pozornost da metode delagata Dog i Student F nemaju sta imena, One ne mora imat sta imena jer ée se dinarniéki dodijliti dele gata u vrijeme izvodenja, student mora premostiti metodu Tostring() tako da w Pate ta metoda, koja porivt ‘ostrng() 2a sadr2ane objekte,ispeavno fankcionira. Implementacijom se samo walt 4 ime studenta (koje veé jest objekt niza) piblic overside string ToStrirg() " t a S) _Deepirane metode mofetenareat kako god elite, no koritenjepata- leith nanva (na primer anichstusentCawesist ih ehongonest rst), fein kod jednostavniim 22 Cianj,razumijevanje i odriavanje student mora implementiatii metodu kojoj Paix. Sort() moze delegirat ova odredivanje redoslijeda objekata return (String.covpare(st-rane, s2-name) <0? Comparison thet stCanesFirst oopar ison. theseconConesFirst); U primera 12:1 prika: mmetoda. n je cijeli program koji ilustrira natin pozivanja delegianih m0 | Fegan ogc 12: Uelogn dota | 271 Prinjer 12-1. Rad's dlegatima region Using 4 tives using Syste using Syston. Collections. Generic; sing Syston. Text; endregion ranespace Delegates ublic enue Comparison t therunstConestirst «4, ‘thesecondCenesFirst = 2 ? 17 dednastame Wolekes§a 23 dvije stavee public elass Pairct> 11 Privatno polje ta a objekts private TI} thePair sw 12]; 17 Deklaracja delegate public delegate Coparison WhiehtsFirst( T objts T bj2 5 17 ProsLijedent konsteuktor uzina dva cbjekta, 1) sted hoje su pink jet public Pais T firetObject, |, Tsecnahyet shoratefo] = firstonjects thePair[a) = seconabjects ) 11 Yana netoda koja sortiza ava objekts 11 po kriteriju oi zadaju objeets public void sort( \hdehISFirst theDeLegatecFunc ) ‘ 4¢ ( thedelegatedFune( thePain{o], thePain{2] ) = Comparison. thesecondtonesFirst ) 1 temp = thePate{ol; therairfo) = theaiz(s); ‘theraisla] = tems > ) 11 saw woteda koja sortira da obiskta 17 prema redolSjedy suprotnan of enap | Pogamianes Foviner 12-1. Rad s delegtima (nastavak) 1 koji z3daju beds pblic void Reversesert( WhichisFirst thoelegatedrenc ) 5 (deepen ti, tea) = CnprisoneFstansritse Suits tee : 11 Yat of chjekata da daju seoje vebjedwosth niza pile ove string Teste) return thoPais{o)-Tostring() +", yt beta iste } 11 kraj ease Pa Pic cass og i private int weights ube bog( sot weight ) { | eg» webs 11 si se sostiraju po tetint public static Gnparizon ini choogConesFirst( ‘Dog ci, Dog 62 ) return dtveight > d2aweight ? Comparison. thesecondnesFirst omparison-thFirstConesFirsts ) pe ove string Tosti) ‘etuinsedght Tasting); } ) 11 ej hase 00g public clas student i private string name; pubic Student( string nine} elo 12: Delega dogday | 273 Primjer 12-1. Rad delegatima (nastavok} 11 Student. se sortraju abecedno public static Cnparison c } public override string Tostrine() ‘ ) public class Test public static vod Main() ¢ 2 | Pogaiane Sinjer 12-1. Rad s dlepatina (nastavak) aghair.Revrsesort( thenogpelegate ); Cansoleskritel ine "After Haversesot dopPaiz\ts (0}*, bichstucentConesrirst( student 51, Student 52 ) dha. Tostsieg() return ( String. Conpare( sp.sane, stinane ] £0? ‘Canpatison the arstconesFrst CanparisentheSecondcovest ist); ogra Test stvaradva objekta Student i dra objekta Dog koje zatim dodaje w honte} ar ait. Konstruktor student uzima stringza ime studenta, a konstruktor dog uzima int za ein psa: 7 student esse = new Student esse” yj Stoent Stacey » raw Studer *Stocey” bog wile = nen Oog 661; ive Fred + new Dog 12): 11 raj Kise Student poixcStudent» studestPair = enw PaineStudent>( Sess, seacey ): airog> dopa = new Paixeoge( Milo, Fred); CasolesieSteLine( “stulentPairit\t\t! (0), student. Tosteing());, unoelestrtecine( "dagraent\entit: (0), Aogpatr.Testrirgt) ); “Jaime ispisje sade£aj dva kontejnera Pair kako bise vidio redostijed objekata. izlaz jedi: jes 11 meas a students 5 60 959 11 Lede sn oojektina PE Stent esse = neu Student "Jesse" Stud Stacey ~ new Stadent( “Stacey” ); Bog mile = row Oop 5 Js peeeaegenanie stadetfair Sesse, stacey aircstudnt> stuentPait = eu Palrstudent(3esse, stacey) Sefate ra Palreoge dogo = new Paizcbogy( lo, Fted Consoleaniteine( ostudetPalnNt\t\t (0)"> studentfair.Tstring() onsoleatitecine( "depron: {0} bate. ToString) Ys ‘Kao Sto smo i ogekival,redoslijed objekata je ist kao i prilikom dodavanja w konts)- © pete Pair, Zatim se instanciraju dva objekea delegata: % MaircStedents.shichIsFist tHeStudentDelegate = S ee PairuhichsFirst Student ichstadentcoaestinst ); 1 nstancia delegate oiscStudenty.snchtaFlest theStudentDelegate = ew PaircStudent>.WHicHSFIrst( ew PalrOogyWaichIsFst( Student nihstodentConesFirst ); Gow omatit veep : og thichDoganest inet; PairhichtsFirst theDopDelepate = sr Pah ogy ehTSFiest Dog. aichoogconesFirst 5 Pri se delegat, theStudentDelegate, stvara prosjedivanjem odgovarajuce staticke meiode iz klase Student. Drugom je delegatu thedogDelegate prosiedena statitka snetoda in klase og 11 Soxtixa s pare delagata ‘StudentPaie Sort thestodentOelegate ); ansolesititeline( "After Sort studertPain\t\t:{0)", students. Tstring() ); 2 Delegati su sada objekti koji se mogu proslijediti metodama. Oni se prve proslieduju ‘etodi Sort() objekta Pair, a zatim metodi ReverseSort(). Rezulati se ispisuju na konaoli studentbabe Revesezext thastudentDelegate 3 After sort studentPatr + desse, Stacey onsolecuritecine{ “Aft Reversesort studentPain\t:{0F", After ReverseSort stedenratr Stacey, Jesse student. Fostring() After Sort deghote ne After ReverseSost dgPair 65,22 dosPaix.Sort( theDogbelepate 5 Console ciritetine( PAT ter Sort dogpain\®\t: (0)", aghast ToString() 5 Paha: eg ogee | US Delegati i metode instance Delegatiiz primjera 12-1 uéahurujustatishe metode kao u sjedegem kodu public statte Cnparicon ‘huchStoentonesFirst(Stert st, Student #2) Delegat se zatim instanciras pomocu klase unjesto s pomogu instance fatrestudent shichtsFinst thestudertDeegae = ew PoirhicnsFisst( Student shichStudentConestinst); Utahuriti mozete i metode instance pubic Conparison UcrstudentConesFirst(Stadent student 52) U tom éete slugaju delegara instancirati prosljedivanjem metode instance, a ne ktoz Klasu: FatrestadentsbichtoFinst thestudentDelegate = new PoircStocent>.dhichlsFinst( Sessehiehstudent Canes itst); Staticki delegati Primjeru 12-1 moe se zamjeriti o od pozivajuée klase (u ovom sluéaju Test) zahi jeva inseanciranje delegata koji su pocrebni2a sortranje objekata u Pair. Dobro bi bilo kad bi se delegati mogli dob izravno iz klasa Student ‘Dog. To se mo%e post tako da se svakoj klasi da vlastiti statitki delegat. Student mozete modiGcirat tako da jj se doda: public static redonly PabrcStudent» ihlchisFirst OrderStudents « ne PaircStudent>.WhichTsFirst( Stodent MhichStodentCanesFinst ‘Time se stvara stati¢ko polje delegata samo 2a Citanje pod nazivom OrderStudents, Pole Grderstufents se kao poe amo a Stanjenakon svaran vide ne moge modificzat. Slignog delegara modete stvoritij unutar klase 0og fublic static readonly patetOopp-thichtsFirst Ordos = ‘ret Pair Dog WhichisFrst( Dog. WhichDogConesFirst}; ‘Ta dva delegata su sada statitka polja unutar svoj klasa. Svaki je unutar klase pove san s cdgovarajuéom metodom. Delegati se mogu pozvati bez deklariranja lokalne instance delegata jednostavnim prosledivanjem staickog delegata klase: studentPair.sort(studentOrderStudents); Console rite ine “After Sort studentPaie\t\t: (0}", ‘studentPai.Tstring()); student Pair ReverseSort(Student.Orderstudents); Consale-ariteLine"After ReverseSort studentPair\t: (0)", 26 | Pegamianece | ‘student. Tostring()); aga. Sort Oop Order0og); Censole.niteLine("After Sort dogPate\e\ts (0), agra Tstring()); hp gpa ReverseS0r (00g OrderOogs); Coteleliteine(Aéter RaverseSor depoint: (0) dogPair.ToString()); eb = Ila ovog promijenjenog koda it je kao iclaz u prinjeru 12-1 Delegati kao svojstva Problem kod korstenja staikih det nikad nee koristiti, kao So je oe Sworiti na stotine delegata mogh Aldea kao svojstava, egata je Sto se oni morgiu instancirati Zak i ako se us sa Student Dog u primjer 12-1. Ako tebate ite razmisltio implementiranju polja statitkih Za Student, uzmite deklaracij: ic static readonly PatrestudentMhichtsFirst He stati x nto sthchlsFinst Orderstudents « dent ihTsFinst( Student. Whichstudentcomer ist )s i zamijenite ju sljedecom deldaracijom: polic static PaleStafet tehsFest Orestes ot t return now PaireStadent.hichlsFirst(shichstudentconstinst ); ) Isto take, statitko polje Dog zamijenites: pic stticPardop ahiehttist Cres et { Teturn now PaircOog WhLchsFiest( hitOogtonesFirst Jy , - Dodjeta delegata ostaje ica studenPair.sor(Stadent.onderstedets); ‘agar. sort (Oop. orcerons);, 4 2 elerat se stvara nakon pristupninsvojsvu rderStadet: |) __eturn ne Pais MehsFist ihehstudentConstiest), alee prednest ovogpristupa sastoj seu tome to se delegat svar tek nakon So Segeat Te Msi estan omogucava da odzed kaa je delat poieba, no | 4, Ais gmonncwa da pojedinostina staan delegaaupravjaklasa Student (odno- gle 1: Delegaogoaap | 277 ViSeodredisni delegati Ponekad je korisno ktoz jednag delegata pozvati dvije (ili vie) implementirane ‘metode. Ta) e postupak iznimno vaZan prilikom upravljanja dogadajitna (objaSnjeny uunastavku ovog poglavla} Uprimjeru 12-2 prieazan je ovakav natin kombinicanja delegnt Primer 12-2. Konbinianje dlepara UE jeion Wing tives ili je imatijednog delegata koji poziva vi8e od jedne metode. Na primer, mada éte Bog Systems kad se pritisne gumb hrjetiizvest vi8e od jedne ake. sng Sraten Collections. Cenexse; ing Sten. Text Dva se delegata mogu kombiniratis pomoéu operatora zbrajanja (). Rezultat je nox vieodredisni delegat (engl. multicast delegats) koji paziva obje i2vorne implement, rane merode. Pretpostavimo, na primjer, kako se radi o delegatima Writer i Logger, ‘Oni se mogu kombiniratiu novi viSeodredisni delegar ytulticastDelegate na sjedet, iseion erspace MatScostOelegates B pttic etass mclossastioelgate ryfulticastOelogate = Weiter + Loggers 1 DekLaractJo detepata ic delepate vid Stringbetaate( string ); , Delegate mozete dadati viSeodredi8nom delegatu s pomoéu operatora plus-jednako =). Ova} operator delegaca 5 desne strane dodaje viseodreditnam delegats s ljeve strane. Pretpostavimo, na primjer, da su Transmitter i nyulticastOelegate delepat Transmitter se delegacu mylulticastDelegate moze codati ovako) BE patic cites mytapeneting ass syhulticastDelegate += Trancnitter 2 pant seat wi ites Da bisaug vidjti kako se vigeodreditnt defegat stvaraji koriste proéi éemo kroz kom t westring( strings) plecan primjet. U primjeru 12-2 stvorit éece klasu MyClasshithDelegate Koja defnira Consote.uritet ine “writing string {0}" Gelegat koji kao parametar uzitya niz, a vraéa void: ? public delegate void strinpbelegste(string«); pubic stotie void Loystring( string 5 ) c , Zatim éete dfinirat klasu nylnplenent igClass koja sadrdi tri metode koje rataju void i kao paramecar wzimaju ni2: Writestring, Logstring i TransnitString. Prva metoda ‘spisuje niz na standardni izlaz, druga simulira zapisivanje u datoteku dneynila, a ‘weéa simula slanje niaa putem Incerneta. Delegate instancirate kako bi pozvali odgo varajuce metode: ester String pas Logger('String passee to Logger"): Tranamiter("String passed to Tranenitter\a?); Console.nritel ine “Logging string (0)", + ); ible static void Trasnitstring ' ra string 5) y nsole.neitetine( “Transmitting string {0}", s ); ) He blic class Test a biste vidjeli kako se delegati kombinirajy, stvoritcetejo8 jedmu instanc dele pica gata ppc state void mint ‘mclasshitnoeZogae.Stringdelegate mjulticastoelegate; 1 Defiokra tei delegate stringbelegat Nyclassithvelepate Stringbelegste writer, Logger, transtteere kojoj éete dodijelitirezulta ,zbrajanja" dva postojeéa delegara ryfubticastdelegate = Writer + Loggers ‘Ovom se delega spomogu operatra += dodse jo jedan delegat (pt ot Sey dt sence yclasvthbelegate. tr ingelegate® symalticastoelegate; aytulticastoelagate += Tranenitters [Na keraju se delegatiselektivno uklanjaju s pomoéu operatora -»: syhulticastbelegate -= Loggers 11 nstaneira prva tri delegata, 1 prosljedivonjennetods 33 vihurivenje 1 Pepa oe |r Posi De eaap | 20 Prinjer 12-2. Kombinivanje dlegnta(nastaval) Weiter « sow MyClassuthoelegate.stringbelegate( Nyloplenentingeass.nstesering ); Logger new SyClassh hoelegate.Stringelegate( se itpenetolss. p50) ren HyCLasskitioelegate.Stringbelegate( yeplenent ngchanTeseseitSteing. ); 11 Pontva nets delegata Writer Meiter( "String passed to hriterin); 17 oniva netods delegata Logger Logaer( String passed t0 Loeger\n" )s 11 Poxtwa netody delegate Trans Transnitter( "String passed £0 Tran stern" Js 11 Covork orisnis 2 ate Koubinrats 11 bin calegata dan viseocredsens daegat Console striteline( mileicastOelegate ~ Wester + Logger”) 11 Xoabintra dvs delegata 2 rezu}tat se 11 prsézvtije wptulteast Delegate ryalticastOelegate = riter + Log 11 Fania delegizane wetote. Bit ée 1 poovane ye netode ryan hcantbelegetel “rarst sting passed to Collector" ); 11 Gowers warisnity dn cate dodats 11 treet delegat viSeodredisnon delegstu Conga uiteline( *\angPlticastbelegate += Transscter” 11 oodale trey degata sy lescastDelegate +» Transmitters 1) rosie tel delephrane netode ryulticastDelegte( “Second string passed to Collector” ); 11 Covers orks da ete oklontth 1/1 elegat 2a zapistvanje v dnenik Cansolecerteline( "naytulticastDelegate -~ Loge 11 aise delat 2a rapisivanje u dhovnk rpultscastOekegete Loggers 1) Ponta de prenetale 11 dekegtcane wetose yal astoelegate( Fer 12-2. Kombinvanedelegota (rasta) "ie string pissed to Collector" )s dj Test primera 122 definiraju se inscance delegataipozivaju se prve ti vrster, B oggr | Trnsnitten. Ctvriom se delegat, ilticastoelegate eatin donee ombinaci pa dra delegata. Taj se kormbiniranidelegat zatim pocva to rezaine sporivanem metoda oba delegaa. Dodaj © delegate porivaju se sve ridelegirane me Fe jozove mMulticastOelegate, pozivaju se se tri delegat,a kad se pozovemytultscast wetode. Na krajuse uklania Logger pa, kada se samo dvije preostale merode, tot viscodredisnih delegata mote se nabolje razumjet na primjeru dogadaja, koji su Ff basen unastavku ovog pop, Kad se dogo dogada popu pritska na gumbs, = Bedgovoriti na taj dogada . Dogadaji * Graftke korisnitka sutelja, kao Sto su o rie mote se predvidjeti, Sustav miruje de cobradu dogadaja, padajuéi popis mode pokrentti dogada) raja nie bitan klasi koja izaziva dopada) aklase na to odgoveraju na prikladan na Objavijivanje i pretplaéivanje klase mogu pretplt (engl. subscribe) vijuje dogadaj 2ick, a druge se klase nazi E pedruZen! viscodredisni delegat moze pozvatiserju metods za obtadu dogadaja koje perativni sustav Microsoft Windows ili pre. sledoik Weba, zahtijevaju da programi odgovaraju na dogadaje. Dogada) (engl. event) mois biti pritisak na gumb, odabir opcie iz izbornika, dovrecak prijenosa datotcke itako dalje. Ukratko, dogodi se net na 8o trebate adgovort. Redoslied dogadaja lo pojave dogadsia, a onda iavodi akeiju 2a Ugrafickim korisnickim suée}jiraa bite koji element mode pokremuti dogada}. Na pi: amr, kad pritisnete gum moZete pokrenuti dogadaj Click, Dodavanje elemenata na isthanged Druge klase ée bit zainteresirane za odgovaranje na dogadsje. Nagin njthova odgova Gumb jednostavno kaze ,Ja sam prtisnut", U jeaiku C# svaki objekt moze objavit (eng) publish) skup dogadaja na kaje se ostale Kad klasa objavi dogadai, sve pretplacene klase se 0 tome obavjestavaju. Zahvaljuéi ovom mehanizmu va8 objeket moze rec +»Mogu vas obavijesito shedecem*, a druge se klase mogu pretplatit i reci,Da, oba- viestte me o najnovijim dogadanjima®. Gumb prilikom beskonaéno mnogo promatrata. Gumb se naziva iedavacem (engl. publisher) jee obja iskanja mote obavijstii ivaja pretplatnicima (engl. subscribers) jer su pretplaéeni na informacije 0 dogadaja Click. ogee: Deeg agatay [781 ‘Oval projek implementa predioisk Publish Subscribe koje opisanu ‘oeesinon rade Design Patterns (a itdanju Addison Wesley). Gamma opie svihu ovog predloS: .Relaciy jedan prema vite iemedu obje vote definaje tales da se, ads jedan objet promyjenistanje, sv obj povezanis im oome obavjStavaj i automacski aburitau™ CObratie pozornost na to da Klasa idavad ne 2na, nti joj je bitno, posto li pretplatnil, Ona sama pokes dogada. Tko cena ta} dogs Jy odgovorit ina a nin nije nena bigs Uzmimo kao sljededi primjer klasu Clock koja pretpiarnitke klase moze obavijesti svaki put kad se rijeme promijeni za jednu sekundu, Klasa lock moze biti odgovorna ia prikaz vremena u korisnigkom sueljy, umesto 2a pokretanje dogedaja, pa aio Sse onda uopée zamarati s delegatma? Ako se korsti idiom objavjvanja/preplacia ria, Klasa Clock ne mora znat kako Ce se njene informacje Koistit. Veza izmedu pe | ‘enja vremena i prikaza tih informacija se cako prekida, Nadal, prilikom pokretanjs 264 | Pograniane fo nema pretplatnika na dogadaj, vrijednost je null. Prethodni rest provjerava je i Fednost ul kako bi saznao ima li pretplatnika prije poztvanjaOnsecondChange. seconhange prihvaca dva arguments: i2vor dogadaa objet izveden iz EventArgs. odiomku koda miozere vidjeti kako se referenca sata this prosljeduje jr je sat i2vor dais. Drugi patametar je objekt tinelnformation F reranie dogadsja poziva metode koje su prcko delegacacegstritane sklasom Clock. Spas jedoradal objaviien, a2urira se stanje klase Clock ‘his.second~ at. Second; iisueinate © at-Rincte; thisstour = at-tour; {Uovom kod nljeprogenasigurnostdtetv.Sigarnon i sinkronizacje |, tet teme so pola 20 raj klasau primjeru pojednostavena i ima samo dvje metode. Prva je pomotna inetoda Subscribe) koja presplatujena delegata OnSecondChange sata. Druga metoda % jemetoda 2a cbradn dopadaje Vinelaschanged): public class Dispayclock t bic votd subscribe(Clock theClock) public void Tiestaschanges( ‘abject theclock, Tinelaotventargs ts) ‘ CansokeMasteLineCurzent Times (0) (80:02), ‘ticheu. Testing), Lorine, Tosteing), {isecondTosteingO); i t theClock.onsecondchange += new Clack. Secondchongeandex(TinstasChaged) ) ¥ ,? | Kad se pozove prva metoda, ubscribe(), ona stvara novi delegat SecondChangeHandler prosljedujuéi merodu za obtadu dogadaja Tinelaschanged(), Zatim tog delegata eg stra s dogadajem onsecondchange od Coc. ‘Zatim se stvara druga klasa koja takoder odgovara na ovaj dogada)-klasa Logcurrent~ 4 Tite. Ona obitno slut za biljeZenje dogadaja u datoteku, no w ovom primjeru dogadaj ? seispisuje na standardnu kono Fg piggy | 285 public class LogCurzentTine c public votd subseribe(Clock theClock) ¢ theclock-onsecanschange ew Clock Secondchangetandles(kriteLogenty) ) 11 ova neetoda txebala zapisivati u dhevnik 71 ¥4 sspisojeo v tonzoly kako BL ilustrizali efekt. 11 ovaj objet ve Quva stare. public void wrstelogintey( object theCloce, TnelnfotventArgs ti) fl Console ete ine “Logging to File: (0)=(2):(2)", ‘ishour Tosteing(), Chinincte,tstring(), ileecond.ToString0)s ) Jako su dvi klase u ovom primjeruslitne, u programu se na dogadaj moze preeplai beskonagno mnogo rezlgiih klasa Jos treba stvorii klasu Clock te stvoritiklasu DisplayCleck i prerplaitl je na dogads} Zatim ete stvoriti klasu LogCurrentTine i akoder je prerplaciti. Na kraju éete bias Clock reéi da se pokrene. Cijeli je postupak prikazan u primjeru 12-3 (2a izlaziz api kacije rebate pritisnuti Crl-C) Prinjer 12-3. Implementacia dogadaa delegatima sropion using directives using Systen; using System. Collections.Ceneric using Sisten- text; sing Syston Treading; endregion nanespace Eventswioelegates , 11 Klasa 24 cwvanje Snfornacife 0 dagadau 11 u oven te slasu twat sano informacje 11 dostapne v kasi lock, ali mote Cuvatt 11 sosatne infomacije 0 stanju public tlass Tineinfetventarge ( public Tinernfotventhgs( int hour, int minite, int second ) c eventares this-hour « pau, thiscainute = minute; this.secong © seconds Pe ea # pranier 12-3. Implementacadsgadaja« dlegetina inastavah) pablic revtonly Snt ours bli readonly int ainutes pedlic readonly int secon 11 Was subject ~ to Je K1asa osu Ge druge Kase pronatrati 11 Nasa cbjavjuje jecnog delegata 11 xSeconcchnge pale class Clock t private int tou Private int minutes private tnt second, 1 Oelegat ojegpretplatnic moraju inpleentineti bic delegate void Seconithangeandder « hject clock, y, emeeeiaes tetformtin 1) nstanca delegata ublic SecondChangelandler OnSeconichange; 1) Roeete ost 11 objevit Ce togadaj 2 syaku sekunty public void fun() t foe (33) ( 17 Spava 20 atssehunds Thread. Steep( 20); 1 sing taanutno vrijene Systen.DteTine ot Systen.DateTine. i 11 Bo se sebunds pronijenila 1 cbavjestava pretpatske if (at.Second 1» sacind ) ( 11 Stuara objekt TineInfotventArgs 17-20 prosijeaivanje pretplatnis Tinetofotventrgs tineInfornation = ‘se TineinftventArgst Gtstour, etminite, ot. Second )s Uf ho se petio pretplatio, cbavjestara pretplatnike 36 Conscntharge frat} Onsecondchange( ‘this, timelnforation alae 2: Dat dado} | a7 Primjer 12-3. Implementacija dogadaja s delegaima (nastavak) ) , 17 Ruri stanje this-second = Seconds thisshour = dt. Hour 11 Pronatat. DisplayClock se pretplatuje 11 na dogadaje sata. ?os30 DisployClock Je 110 prilaauje trenutre veijere public class Displaylock t 11 Pretplatuje sen dogadag 11 SecondChangetandler sata Public void Sabseribe( Clock theclock ) theclock.oaseconachange = ew Clock Secondhangetandler( TinekasChanged); : 11 Netods koja Seplenentire 1 delegiranu fankclonalaost public void Tinehaschonged( chject theClock, Tneknfofventhrgs th ) ‘ ConsolesriteLine( ‘Curent Tine: {o}s(0}:(2), “Sohour Testing), eoninote. Tosteing(), ‘second Testing) 5 } ? 17 orogs pretpatnik Eiji je posae rapisivanje v dtotetu public class LogCurzenttine t public vold Subscribe Clock theClack } c theClock.onsecondchange + ‘new Clock-Seconhangetandler( writetogEotry ); ) 11 Ora bi netode trebala zapisivati u datotetu, 11 Aspisujeno aa koala do bisno Widjels eft. 11 Ora} objekt ne tua stanje. public void kriteLogtntey( ‘object theClock, TineInfotventhres ti ) 7 : Console siriteLine( “topsing to File: (0):(2}:(2", our. Tostz ing). ‘Liminute,rostlng(), 28 | Progrenrnjech rinjer 12-3 Implementacia dogadaa sdelegatima fnastavak) ‘second. Tostring()); lie class Test public static void int) ‘lock theClock = new Clock(); 11 Brau prikar 4 gpvort mu da se 17 pretplati na vpravo stvoren sat DisplayClock de = new isplayClork(); de Subseribe theclock )s 11 Pravi Logobfekt 4 govor aw da 17s pretglatt na sat Logeurrenttine let = ew Logcurrentrine(}s let. Subserine( theClock); 11 Pisete eat ‘theclecktnt || Ova) kod stvara duije klase, DisplayClock i LogCurrentTine, koje su pretplagene na _- dogadaj rece klase (Clock. OnSecondchange) "F nsecondChange je polje vieodredignog delegata koje na pocetku ne referiea ua nia Kasnie eferira na jednog delegata, a zatim na vite delegata. Kad promatratke kiase 2 Hele primit obavijest, one svaraju instancu delegataizatim te delegate dodaju nse. 2 conhange. Na primjcr, u mero Subscribe() od DisplayClack moet vdjeti ova ed & boda: 5 theClock.onseconchange +e ew Clock Secendchangetander(Tnehaschanged); © ‘spostavia se kako i klasa LogCurréntTine 2eli © Subscribe() nalaz vio sligan kod: public vod Subscribe(Clock theclock) ¢ primiti obavijest. U njenoj se metodi theClock.onSecondchange += re Clock. Seconathangendler(ritetogtatry); } _ RjeSavanje problema s delegatima s pomocu dogadaja Postoji, medutim, jedan problem u primjeru 12-3. So bi se dogodilo da klasa LogCur entTine umjesto operatora pretplacivanja (+=) koristi operator dodjljvanja (+), kao Ushedeéem primjeru Fogle 2:Delegacoady | 209 public vod subscribe(Clock thectock) c ‘theCLock.onseconchange = nen Clk, SeconachangeRane (a. ) Ako utinite tu malu promjenv, vidjer dere da se poziva metoda Logger(), alinei met DisplayClock, Operator dodjejvanja je zamijeniodelegata u viSeodredi8nom deep onsecondchange, ato nije dobro. Logentey): Deugi problem je da ostale metode mogu izravno pozvati SecondChangetandier, Ny primer, metodi Main() w klasi Test mogli biste dodatsliedesi kod: Consoe.tritetine("Calling the method dizectly!"); Syston OateTine dt - Systen.03t2Fine Now. Ahour5(2) Tineinfobventge tineznforacion = ‘ea TSnelneoryetrget (eHow ot-Minte, a, Second); ‘heClockonsecondchange(theClock, tineInforntin): Metoda Nain() jeovdjestvorila lati objekt Tinetnfotventirgsiizravno poavalaonse. condchange. Ova) kod dobro funkcionira,iako to nje bila namjera razvojnog inZenjera klase Clock. Ialaz je shedeti Calling the nett ae Ghrrert Tine: 18:36°7 Logging to file: 38:36:7 Carrert Tine: 16:35:7 logging te Fle: 26:36:7 a Problem se sastoj u tome St je autor klase Clock planirao da se metode uéahurene w dlegatu pozivaju samo prilikom dogadaja. Ovdjeje metoda Main() pobjegla keozstra 4nja vrata i sama pozvala te metode, Nadalje, metoda Main() je prosljedila netaéne podarke (vremensku konstrukeijr pastavijenu na dva sata unapried). Kako da, kao autor klase Clack, osigurate da se merode delegata ne¢e izravno poovati? Delegat mozete udiniti privatnim, ali onda se klijenti uopée nee moti egistizati s delegetom. Potreban vam je natin kojim éete re¢i: ,Ova) delegat je namijenjen obradi dogadaja. Na njega se mo¥ete pretplatt’ il poniBtti pretplatu, no ne modere pe poavati Kijutna rjed event (va) seproblem moze rei korbtenjem klutne rit event. Ona prevoditeli one ava kako delegata moze pozvai samo Kasa koja ga definiraaostale se klase a dle gat og pretpla il pnitipretplatus pomocu operator + Da bisteispravili problem, promijenite definiciju OnSecondchange: Public Secendchingetndler CnSecundchanges usljedecu definiciju 250 | Pogamiane ce F anic event Secondchongtandler Onsecondchange; Fdavane ute rei even sje ce oba problema, Klase se vie ne mogu na doga- fj replat preko operatora dodjele -) kao St su to mogle rai, aici og izvavno Beever dogads), kao So je to util metoda Main() w prethodnom primjeru. Oba ce Baia generiati pogeedku w prevodenju ‘eg, enrich. Oconange an oly peo pee (encept an used fron within the type “Progranting. odifcrani dogadaj onSecondchange motemo gledati na dva natina, On je pevo samo jitanca delegatakojoj smo ograncili pristup korsteci kljuénu nijet event. Drugo # Pradnie shvacanje jest da je OnSecondcharge dogada), implementiran delegatom tpa BF secandChangetandier, Ova su dva iskaza jednaka, no drugo je vise objektna orjert_ Erno bole odrazava narsenu ove kljuéne rijeti:Stvaranje dogadaja ko} objcke moze jazvati ina koji ostali objet mogu cdgovori Ep Forpun invorni kod, modifcitan tako da se umjesto neogranitenog delegata korsti F dogadsi, prikazan jeu primjer 12-4 E pinier 12-4. Korbtenj icine ried event B srepice sing otrecives sing Syst G sig syste. Collections,ceneric; sig syst. Text, “E isrg Sytem, Threading endregion espace Eventheperé 11 Rasa za tuvinje inforacija 0 dogedse 11 oven Ce slucaju cua sane inforacije 1 dostupne v lash cloey, als wots taati i 1 dedatne infomacije © stanje public class Tineinfofvantargs » EventArgs Public resdenly int hours pubdée reaabaly ie wine; Pubic readonly int Secor bli TinslafotventArgs(int hour, int winte, int second) c 11S sinjokt - to je Klasa koju ce druge Kase promtiat Pole: Delegates | 51 Primjer 12-4, KorteneMjuéne ried event frastaval) 1) Rasa obj jue jog, delepata: 1 nSecondchange. Peenateaei se pretplacujy na taj dogeda) public class Clock t private int hours private ik inate; private int second; 1) oelegat koje pretplatnics aorajy inplenentirats public delegate votd SecondCangeondler 0 ject clock, Tinetotseventhrys Snetatoreat ion % 17 Kijtna rijet event radzire pristup delegate public event SecondChangelandler OrSeconichange; 11 Pokrece sat 17 en}oust Ge dogate) 19 evoke sehund public void Run() t fois) c 1) Spava 10 wilisehandi ThzendSheept20), 11 vxina trenutno veifene Systen-bateTine t= Syater.Dateine. Now; 11 Ako st sekunda pron jenila 11 cbavjettava pretplatnite LF [eeSecond > setond) ( 11 sevara objektTinexnfotventares 11 20 prostjedivanje pretplateiks VinetnfoEventArgstinolnfornation - "ew TinslnfoEventAgs( Gtohour at Minted. Second) 11 Ako £0 netho pretplatio, cbovjeStava pretplatnike AF (Onseconahange = nil) nsecordcharget this, imelnfoonation); ? ? 11 Aturtea stanje this second = dt. Second this sinite = dtiminute; thischour = dttoury 2 | Pogamiane ser 12-4. KoristojeRhcve rit event (rastavak) 17 prpatrat. Displayclock se pretplauje F i ms oogadaje sata, Posd0 Displayclock. je ta pikansje teense Wel jone puotie €1355 isplayClock c 1 ta ina sat, pretplatose se 9a 11 eats} Seconshangstandler MBIie ved Subscribe(Clecktheclock) ( tneloch.Orseconshanye ee ‘no Clock. Secondchangetonlex(TinsasChaged); ) 17 toda koja inpleestirs 1 delegizana finketonslnost pubic void Tineraschanged object “haClock, Tlntatventacgs i) este settee es (0810 ‘anata Hesrneaiiy , 85 ) 17 ori petpataik 2 Je psao sapsivanjew dtotety peblie cass Lagcrrenttine = C pide wid sbcibe(ak eho) ‘aClock -eecondhange 1 lc Sconchneneiteont) 1 Ova bi netoda treba sopisivati v dato 11 Tsptsujeno na kanzolu da biswo vidal efekt 11 Ova} ebjekt ne Ewe stanje, pibhic 058 dostetegiaty( object thetlock, Tnel@fotventags ti) mutes he: Le, ‘tiuhour. Tostring(), " Se. ) ) public class Test Toit | Primjer 12-4, Koritone Rljucne red event (nastava) public statie void Nain() Clock theclock = pew Cock(); 17 pravs.prikat 5 govorl mu ds (ir peetplats a upravo stoczen st Dhaplayelece de = ne DisplayCl0ERO) te subgersbe(theclock ); 17 vows Lag cbjekt 5 govord mu 3 fh se oretglath na st CogcarentTine Ick » nox Logcersesetine()s Tete subscribe( theclek ); 11 powce st thectoek, unt); } } Korigtenje anonimnih metoda 1 prethodnom ste se primjeru na dogadsj preplatili posvanjem neve instance dele tats prosjedivanjem naziva merode koja implementa dagada} ‘he ockonsecondchange += ew Clock, Second hangetardler(TaneasChaged) ‘Delogat motetedodijlitipisanjem skeaéeneinatice het lockcusecrdharge += Tinlachanged U nastavku Koda TineHasChanged morate definirati kao metodu koja odgovara pospisy dllegata SecondChangeiandler: public void Tiaetaschangedl fbject theCloce, TinlafotventArgs ti) t censoiesteitetine(*curzent Times (0)3(2}:02), ‘ishovr- Testing), ‘iiminate toString), ‘scescond Testing) ) [Anonimne vam metode omoguéavaju da umjestonaziva metode proshijedite Bik cron Toked moze utint utinkovitjim jednostayim za odrEavane, a anonimans ‘Receda ime pistup vanjablama unutar dosegau kojem sa defiirane vouch wscidchange ou elena object tech, Telnfotventegs ¢f ) Console ic itelie( “Carzent Tame: 0:40:12)", at | Pegamiane aaa UNRRSH- s.hour.TaString), SSinute-Tostring), {oseconaTosting() Ds E opratte pozotnost da se umjesto registriranja instance delegata koristi kljuéna rijeé \gelegate, i2a Koje se navode parametri koji ée biti prosiedeni metodi te zatim tjelo B petode unutarvitigastih zagrada i na keajutotka-zare2, “ova smetoda’ nema naziva pa kazemo da je rijet 0 anonimnoj metodi. Ona se mode Fe sonar ean kor dela, no 6 jespravo on so vam epotreina ~ Dohvat vrijednosti iz viseodredisnih delegata =U vein siuacia metode koje éete utaburit sviteodredisnim delegatom vratit ce FF void. ViSeodredini se deegati,u stvai,majeS¢e korst s dogadajima, a sett éete fe da ptema pravilu sve dogadaje innplementiaju delegai koji waburuju metode koje sraaju void (i peivacsja va parametra: poSijaelja i objet EventArgs) Moga se, medutim, stvoriti vieodredini delegat 2a metode koje ne veaéau vrijed- fost od U sede ete prijs sori vl jdnomave tess laws deg tom koji ufahuryje bilo koju metodu koja ne wzima parametre ali vraga cjlobroju J wijednost: : public Class Casskithelagate public delegate int belegateratseturnsin(); public elegatetnatsetuensint. theDelegate; Kaleo biste to testirali,implementirajte dvije Was kaje se pretplacuju na delepat. Prva utahuruje metodu koja poveéava vrijednost brojaéa i tu vrijednost vrata kao cjelo- Irojnu veijednosti: ualic class Firstsubseriber c private Int ayCounter public vod Subiccie(ClaseatiOelegate theclassbithoelagate) ‘ ‘heClasskthvelegatethaelepate += ew Classithbelegte, elegateThateturnsint(Oisplaxourter)s, ) public int oisplayCounter() ‘ retura seyCounters } , © Druga klasatakoder shu 2a odréavane brojata, 2a njena delegirana metoda udvostru { €uje vrjednost brojaéai vraga tu udvostrugenu veijednost: Petar ea ogy | 295 I, public class Secondubscriber c private int ycounter » 95 public void Subseribe(Clacewithoelegate theclassuithbelegate) ‘thecLasshithbeegate.thepelepate ‘i CLasseihvelegatebelegateTnatReturesint (Doubler); public int Oowstex() ¢ return ayCounter += 25, ) ? Kad se ovaj delegat pokrene, naizmjenitno se pozivaju obje uCahurene metode i svaka vraéa vijednost: nt result = theoelegsteQs Console weStel inet “Delegates fined! Returned resus (0}", reult)s Problem je u tome So svaka metoda vrata svoju vrijednost i prepisue vrjednost koja je dodijeljena objekta result. lz igleda ovako: Delegates fired! Returned results 2 Uelegates fazed! Returned result: 4 Delegates fired! Returned result: 6 Uelgater rec! Returned result: & Delegates Fired! Returned result: 10 Prya metoda DisplayCounter() (pozvana od strane FirstSubscriber) vratila je ved nosti 3, 2,3, 4, 5, no te su vrijednostsprepisane vrjednostima koje je vratiladruga metoda ‘Va8 je cilj naizmenitni prikaz rezultata svake metode. Za ajegovo postizanje morate preuzeti na sebe powivangje metoda koje su uéahurene u viSeodredinom delegatu To o%ete udiniti uzimanjem popisa pozivanja od delegata i eksplicitnim pozivanjem svake uéahurene metode: foreach ( DelegoteMhatieturstnt del in ‘theelegate Get Invocation st() ) c int result = 4210); (nso eritetine( Delegates fired! Returned result: (0}", result); ) ConsolesMritetine()s Objektu result sada se dodjeljue veijedanst svakog pozivanja ita se vijednost pike _zuje pri pozivanja sedege metode. Promjena se vidi u ilazu: 296 | Pogamiaajece delegates fixed! Returned results 4 Delegates fires! Returned result: 2 Delegates Fired! Returned result: 2 ulegates Free! Returned results & Delegates fired! Retuned result: 3 Delegates Fired! Returned result: 6 Delegates fied! Returned result: 4 Delegates Fired! Returned result: & Delegates Fixed) Returned result Delegates fired! Returned result Pra delegirana metodaodbrojva 2, 3,49 dkedeaga dose velednost £11820, Cele iovon kod prkazan vetoes ee ae TF primer 125, Run poevonedelegiraih metoda EF pegion Using directives F sing ster: sig Systencollections.Ceerte; ‘bing Syeten Texts ng stem Threading; ES eodcegion pi dass Cassitonepte 1 vbteobreisns deleat tft wahrae net pblic delegate int Deleatethattetursint(); Pubic DelepaterhatRetunsint thedeleate; public void fun() c for (55) { 11 Spavs pola sehunde Tare. Steep( S00; 4 Cotteegte ma 1 Skepiesto poriva satu delegzans meade foreach ( DelegateThatRetarnsint de in ‘thebelegate.cettnvocationlist() ) int result « de1()5 Consolenritet nel Fale 2: Deeguidogeda | 297 Frimjer 125. Runoposivanje delegtah mezoda (asta) at Retursed result: (0)", Delegates result i ) 1 kaa} foreach fansobesiiteline()s yar kea5 3 bye S05 1 x23} 108 ) yy a3} cass uve Case Steetsubsriber private int ayCounter » 2: unc vot suscribe clashithelegate thecassAitineteate ) © speciassusttoelegate. theDelegate + , ee elegant Oisplcouter Ys oblic int fsplaycountert) 1 5 seconSueriter punt ‘ private it ayfaunter otic vo Subscribe Claskithelegate theClassittoehene © gactassthnelegacethebelegst += . a ning iegate olaptethatetusesIt( Over Js > public ft Dobles() return aycounter +25 ) public class Test c public static votd #3in() aasssitioekegate theClasshithDelegate = now ClassktheLegatel); sirstsubscriber £5 « neu FirstSubsertoer(i Fersbscrite( theclassithoelegate )5 seconesubsceiber ss > new Secondsubsesiber()s ee oseribe( theClassuithbelegate )s 8 | Pegamianie Fyimjer 125. Ruéno povanje dleiranih metoda (nastavak) ‘heclassusdoelegare Run) Easinkrono pozivanje dogadaja Mote se ispostavic kako merodama za obradu dogs treba prvitevremena da plore m dopa U tom lus, obaretavanje Kasniih metoda moze jt vlo “dugo, dok Cekate i tezultateranijih meroda. Pretpostavimo, na primer, kako metoda Staplycounter()w Firstsubscriber mors obavii mnogo posla oko izracuna povrat- og rezultata, Tobi izazvalo kaSnjenje u obajeScivanju SecondSubsribero dogadajt To otete simulirats dodavanjem nekalko redova Koda u mesoda DispLayCounter iablic int Dsplayconter() (onsole.hrstel ne(“Busy 59 Displacounter.."); Thvead. Sheep(#000); Georae.krtetine(‘Uone with work dn DisplayCouter return vomyCaunters ) B kad pokrenete program, vidjet éete kako prilikom svakog obavjestavanja metode irstSubscriber dolazi do kaSnjenja od éetri sekunde, Umjesto pozivanja svih metoda iroz delegate (kao Sto je prikazano ranije) mofete za svaki delegat pozvati metodu tegininvoke(). To 4 u2eokovati asinkrono posivanje metoda i modi éete nastavit s radom, bez Gekanja na povratni rezultar pozvane metode. Ba razliku od metode Invoke(), metoda Segintnvoke() odmah raga. Ona stvara posebns dsetwu 1 kojojinvodi svoj akelje’ (vie informacija 0 dretvama potrazite & poglaviu 20) To, medutim, predstavlja problem, jr pak Zelite dobitirezuleate od pozvanih metoda. fa aopolaganju su vam dvije moguénost. Prva je stalno provjeravanje svake delesi- ne metode kake bist vidjel je reaultat dostupan, To je kao da od swag pomoénika rabite da obavi neki zadatak, a onda ga svakih pet sekundi zovere i pitate Jest potos?” (ime gubite i svoj njegovo vijeme). Svom pomoéniku zapravo trebate eet | Napravi ovo i nazovi me kad dobijes rezuleat” Metode povratnog poziva |GDelepiranje zadatka 1 primenja povtatnog poziva kad je zadatak obavlen modete * postigi koritenjem poveatnih pociva koji se implementirau (kakvo ianenadene! © “ pomocu delegats. .NET kostut pruda mehanizam za povcatne pozive definianjem [peta octallac TEE pruta pond det, anova dese naeeojee il preva ie te pone, ese bapa eat | 2 (Seriatizbie wblic delegate void Aayecallback( synctesut ae » q AtribueSeriatszable je opisan v poglavju 18. Ovdje, medutim, mozete vidjet kako je AsyncCallBack delegat za metodi koja vrata void i uzima jedan argument, obic, tipa EAsyncResult, To sutelje je definirano NET kosturom, a CLR ée meiodu porvaig’ objektom kojiimplementirasugeje pa ne morae poznavati pojedinostisutelja Mode | jednostavno korisii objekt koji vam je ponuden. er 12:6. Asinkrono posivanie delegata on Using dlzectves ire St Be iy sste Collections. cnerte; icine tener Bingen. Tueadig; gion Evo kako to rai, Od delegata zatratite popis pozivanja i za svaki delegats tog popisa eespace Asynchdelegates ppozovite Bepintnvoke sda parametra. Pevi ce biti delegattipa AsyneCal1Back, a drug Ce biti delegat koji poziva Zeljenu metodu 3 de Bepininvnke(nen AsyoeC222back(Resltsteturned) del); pbc cass Clasehithtedegste c 11 wiSeodredSSnk delegat host uéahurava netods 1 koja vraea Int blse delegate Jot DetoaterhatReturnstat(); ‘ovom redu koda poziva se metoda utaburena u del (co jest, Oisplaycounter) i ka v edu koda por nda utah (co jest, Displaycounter) i kad Public event DelegateThathetursint thedelapate; ‘metoda zavrSi, obavijest Gete primiti preko metode Resul tsketurned, ‘Metoda kojoj treba uzvratii poziv (Resul tsReturned) mora odgovarati povratnom tia Ipblic void fun) {iporpisu delegate AsyneCol18ack te mora vraativridnost void i uzimati objet tipa i for (35) Toye ‘ viva wold feultstetunedAsmetent tn 11S oa senda r The tg Sn Kad je metodi uzvraéen poziv. .NET kostur prosljedue objekt tAsyncResult, Drugi pparametar 2a Beginlaveke je va delegat i on Se sprema u svojstvo AsyncState sutela ‘AsyncResult kao Object, Unutar metode povratnog poriva ResultsReturned taj Object mofete izdvojit i prewvorti ga u njegov zvorni tip: HF ( thedelegate t+ alt ) ‘ 11 Eesphicitoo poxiva eva elegirany nets foreach ( DelegatethatRetrnsint del in DelepiteThatteturnsint del ~ (OelogateriatReturnsint)sar.Aeynestate; thebelegate-Cetiaveeationlsst() ) Sada taj delegat modete upotrijebiti za pozivanje metode Endtnvoke(), Prosliedyji 11 Pontvaasiokzono 4 primljeni objekt TAayncResult kao parametar. 1 proshjeduje delega kao objeht stants el tegindoucke new agynecalibackt Resultsteturned ), nt result = dl, Endinvoke( $20); “el ) Metoda EndInvoke() veaéa vrijednost pozvane (i sada dovrene) metode koju dodjel {ete lokainoj varijabli result i koju sada slobodno mozete prikazati korisniku, YH kraj foreach ey Ukupni efeke je da uw metodi Run() naizmjenitno dobivate registrtane metode (pro yest tr FixstSubscriber.DisplayCounter, a zatim Secondsubser ber Dauber) i svakt posivate 1 a3} ne asinkrono. Izmedu pozivanja prve i druge metode nema Cekanja jer ne Cekate da Dis 1 Boiva netodu 23 urimanje rezultata playCounter vrati vrijednost put deleted yet Sar Kad bigplayCounter (ii poten) ima recut, poziva se metoda povratng por Gresuttstetuned) horse bjekttasyrcResslprosijeden kao patametat aus njestvarnh vrjednosi, Cea je implementacj prikarana v rimjer 12-6 1 retvara chjekt stanjanatragw tip delegata Delegoterhcaeturnsnt del = ree (Belegatertattetumsint } iar-Asyrstates 1 Fociva tndtnvoke a delegatu da vane rezultat nt result © del.endlvote( tat J; 1 Pritazuje rerultate Console iteine( “Delegate returned result: (0), result); 300 | Peganianjece eee : | Powe Posie 2 Ddegatcageag | 301 Prinjer 12-6, Asnkrono posivanedelegata(nastavak) > ) 11 kaa} clogs fuodic class Frstsubseribar private int myCounter « 0; fblic vod Subscriber ClasewithOelegate RheClassuithoelegate ) ‘ sheclassuthoelegate, venelepate ¢= new Classdtoelegate, elepateThatReturnsint( OlsplayCourter }s d usc int oisplayCounter() f CopsolesriteLine( “Sosy sn OssplayCourter...” ); TheeadSleep( 10000); Consaecirsteline( “Dore with work An OisplayCounter return HeyCounter; ) public clase sacondSdbcriber ¢ private int nyCounter = 0; public void Subscrsbe( Classhithoelegate theclasskithoelegate ) ¢ ‘haclasgusthoeegate. thee return wouter ? public class Test public static void Main’) Clacekithoelegate theclasshithoelegate teu Classhtielegatel); Einetsubsceiber fs = naw FirstSubscrsber()s fe.Sibecribel HaClacealewoelegate Secondsubscriber es ~ now secondSubscriber(): ss.Sibscribe( theclasshithDelepate ); ‘hecassuithoelegate.fan()s ? ? 302 | Rogaine eee DION Programiranje na jeziku C# POGLAVLJE 13 prethodnim poglavijima su za prikaz jezika C# i CLR-a koristene konzolne aplika- ie. Premda se konzolne aplikacije mogu jednostavno implementirati vrieme je da Se pozabavite pravim razlogom za8to uopce ubite Cf jezik, to je zgradnja Windows anim danima Windowsa,aplikacije su se ivodile na stolnim ratunalima, u savr- oj izoliranosti.$ vremenom, projektanti su nasi korisnim da rasporede aplikacije Giljem mree, sa korisnitkim suteljem na jednom ratunalu, a bazom podataka na {drugom. Ova podijela odgovornost, odnosno distibuiranj aplikacie, naziva se dvo: @ acjnn arhitekvor i priseup kijemepaskstiel}. Kasnije, kada se projeltant patel ristiti Web poslusiteje da udome poslovne objekte koji mogu upravijat pristupom {hari podaraka, razvil st se troslojni, odnosno viseslojni prstup. ad se Web tek pojavio, postojala je jasna razlika izmedu Windows i Web aplikacija, fndows aplikacije su se i2vodile na stolnim raéunalima ili u lokalnoj mredi,a Web Flikacie su se i2vodile na udaljenom poslu2itelju i pristupano im je preko pregled: foi. Ova raza je postala manja kako su Windows aplikacije poéee koristiti usluge Web, Mnoge nove usluge ukijuéuju izvodenje poslovne logike na klientu, pohranj- je podataka na posluzteljubaze podataka i udaljena neovisna ratunala na Webs. FXbsitne samostelne aplikatije, ka siosa Excell ili Outlook, mogp imepitati podatke Puibavliene preko Weba u jednu cijelinu, a Web aplikacije mogu raspodijelitdio posla ii ee korisnicko suéelje bit u sklopu programma koj se izvodi na stolnom ragunalu? BE cakimattauometko posietehorinitho sul fe donee pot 5d. solna, poito seta prkazanau pregledniu mogu mati komponente 3s LIS Ag koe setavede lela, a samostaine aplikacije meg iat ugraene 2 ‘Web preglednike. gone prdnon Webra. Mat mee ei pomotu bil, ‘ett hose mote soja posted akoder, poste emote ae Sarge stash apace ema trod pau Web, mops ‘Kontrolu nad izgledom i uvidom v aplikacij, odnosno moguée je postci boljuizvegi, Salon somos aac NET ud isk poeane al aie skopore sat 24 rogramiajeWindon ncpliaee Ob pcp suemcieas prevenaciaremage reece rae ‘eure cp os erttom komuniteti ote bone a spon puoepopa aro dae ; Aza itad Web pita seco Wb Femmes ph Al sh Windows daca eer Windows Porm temasu oop poy Nasljedecim stranicama ete nautit kako iaaditi Windows aplikacj korstedi Visual Studio, Ova aplikacija ée obuhvaviti vedi bro) C# metoda koje su razmatrane u pe hodiim poglavima Izrada jednostavnog Windows Forms obrasca Windows Forms je alat 2a izradu Windows aplikaciia..NET kostur nudi obimnu pod:tku za cazvoj Windows aplikacia,&jje stedisni dio kosturza Windows obrasce Nije iznenadujuce da Window's obrasci korisre merafary abrasca. deja je posucena od velo uspjesne VB okoline i podr2ava brzi razvoj aplikacja, Premda je to diskutabilno, CC# je prva okolina 2a razvo) koja je spojila alate 2a br2l razvo) iz VB okoline sa kva- 4 tetnim objektno orijentitanim karakteristikama obiteljiC jezik Koristenje alata Visual Studio Designer Tako je moguée napraviti Windows aplikaciu koristet bilo koji editor (Eaki Notepad) i prevodenje iz naredbene linije, nerazumno je tako raditi kad Visual Studio.NET toliko olakfava posao. Da biste poteliraditinovu Windows aplikaciju, prvo otvorite Visual Studio odaberte File + New ~ Project. U prozoru New Projece napravite now Windows apikaciti 3 nazovite je ProgCSharpWindowsForm, kao So je prikazano na slici 13. Visual Studio odgovara izradem Windows Forms aplikacie ito je najbole, postavie vas u okolié za azvo), kao Sto je prikazano na sic 132. j Prozor Design prikazuje prazan obrazac Forni. Dostupan je i prozor Toolbex s3 skupom gotovih Windows programa i kontrola, Ako prozor Toolbox nije pikazan, pokutaite pritisnuti natpis Toolbox, ili odaberite View -+ Toolbox u Visual Sedo 306 | Permian ce : e i i ai Sika 13-2, Obolt za razvoj = lahorniku. Takoder mozere korisie ‘tora Toolbox” reac Crt-AleX na tipkovnici za otvaranje pro- * Visa Seatio dozraliaspilagodb dng rae de ao oe ods woken aoa nM Fite da srl eta iphone Piaf 8: PrgramicanjeWidowsapitacja | 307 Kad je Toolbox prikazan, modete povutinatpisili gum izravno na obra2sc, kao jeprikazane oa slic 13-3. HT prreey Slike 13-3. Okolina zarazvo} Windows Prijenego tonastavite, pogledajte okolo. Toolbox e ispunjen skontrolama kojemosete dodati Windows Forms aplikacj. U gotnjem desnom kutu trebali biste vidjei prozor Solution Explorer koji prikazuje sve datoteke w projekeu. U donjem desuom kuca se nnalazi prozor Properties koji prikazuje sva svojstva trenutno odabrane stavke, Naslic 133, odabran je natpis labels i prozor Properties prikazuje njegova svojstva, _Motete korisit prozor Properties da podesite svojsva raznih kontrola. Na primje, dda biste dodali tekst natpisu labels, matete upisatiijeti Hello World" u poljedesto cod svojstva Text. Ako Zelite promijeniti pismo natpisa Relioer\d pritisnie svojswo Font prikazano u donjem desnom kucu slike 13-4. (Takoder mozete dodati tekst za gumb button tako Sto éete ga odabrati te u prozoru Properties upisati jet ,Cancel” ‘unucar njegova svojstva Text.) Bilo koji od ovih Koraka je testo labs nego mijenjanje ovihsvojstavai2ravno u kod (ako je to naravno moguée) Kad je obrazac podeten, sve so preostaje je napravti metodu za obradu pris na gumb Cancel, Dvostrukipitisak na gumb Cancel enapraviti merosu2a obradu dogs ‘aja, registra u, i postaviti vas na stranicu koja Sadr2 kod za obrazac, glje moet upisti ogi za uprajanje dogadajima kao Sco je prikazano na sii 135 308 | Rogaine | { y a 1.5, aon voto rita gaa Cael a Kursor je veé na mjestu; samo trebate upisai jedan red koda: appdicaon Exit (05 Kad pokuSate upisati ovaj kod, alae Inellsense ée vara pokubati pomoci. Kad upisete A, bit ée prikazano ime prvog objekta koji potinje sa A. Nastavite tipkati do Appl ‘onda pritisnite toeku: klass Application je upisana za vas‘ a dostupne su i me postavke objekta application. Upisite Ex i todkuzarez ~ red koda je napisan, U okolisu 2a azve) kursor reper ake da je lake pati KOd. Veein _, Tate kutsorvrojtno nece repent w o¥9j en Visual Studio generira sav kod potreban za stvaranje inicijalizaciju komponenata Primjetite da datoteka s kodom (Rermi.cs} sadréi samo naredbe using, Kenstruk- tor i metodu 2a obradu dogadaja. Oni medu vama koji su programirali u prijasnyim ‘naticama ezika C# modda se ptsju ge je ostarak koda 2a incialiiranjei postavja, je svojstava kontrola (koje nisu navedene ovdje) Primjette da definicija klase sadesi kljucna ried partial. To ukezuje da se ostatak definicje klase nalazi u nekoj crag datoteci. Ako pritisnete gumb Show Al Files (zaakruzen na slici 13-6), vider éete da je Designer dodao drugu daroteku, Form. Designers. | ode i Fa posrebeov08 Primer da bit od bi jednstvanfokusae se nakoinito jaatzje i Korake potrebne za povezivanje njegovih konceola. Konaéan izgled korisnit. fog suéelia oplikacie je prikazan na sis 1347 ‘soureo Flee oO Fame 2 Dato Canine oe (Dat ian Binonstartes incertae (Base ce Bose ote Econ Elon age Ent ean = Gace 8 Sterne iat tof =) Slika 13-6. Prikazsvihdatoteka Datoteka Form!.Designer.cs sade#i sav kod koji je generirao Visual Studio. Izrada Windows Forms aplikacija Dabiste vidjeli ako Windows Forms mogu bit iskorStent za izradu realnijih Windows aplikacija u ovom odlomku éete napraviti pomoénu aplikaciju FileCopier koja kopita sve datoteke iz adabrane skupine mapa u odredinu mapu ili na uredaj kao Sto je disketa il mredni disk, lako neéete primjenjivati sve moguée detalje, mozete zamislt kkoristenje ove aplikacije rako da oznatite deserke datorekai kopirare ih na vie diskora, slatuei ih cako da zauzmu Sco manje prostors. Cak mozete prosirti apikaciju da kom primira datosoke, Pravicilj ovog primijeraje da uvjesbate moguénosti C#jezika kojeste nnaucili u prethodnim poglavhjima te da istrazite imenski prostor Windows. Form. * Printed nelliensepamti va nd tbo poEine sim. Oba eo vel pogodnost 310 | Pegaminjece ‘Slka 13-7. Koren sueleeplikacije FleCopier Korisnitko suzelje za Filecopier se sastoj od shedecih kontrola + Natpisa Gource Files Target Files) Gumba (Clear, Copy, Delete, i Cancel) Polja za potvedu ,Overwrite exists" Polje za tekst za prikaz putanje odabrane odredifne mape Daije velike kontrole za prikaz seablastestcukcure mapa, jedna za dostupne iavo- tigne mapeijedna 2a dostupne odredisne uredaje i mape ij je omogueiti korisniku da pregledadatoteke (ik mape)u leo) (evorifno) kone ‘oli za prikaz seukcure mapa. Ako korsnik peti gumb Copy, datoteke oznazene 1a lijevo) strani bit €e kopirane u odrediste odabrano na desno} strani. Ako korisnle pritsne Delete, onaéene datoree é biti obrisane Ostatak ovog poglavljaopisujenekoliko znadajki apikacije FileCopier kako iste upo. ‘nali osnovne znaéajke Windows Forms, Pog 3 Poganiaaj Windows aad | 311 Izrada jednostavnog obrasca za korisnicko sugelje Prvi zadatak e ovvoriti novi projekt koji Gere nazvat FileCopier. Razvojni okoli prika, 2zuje prozor Designer, u kojem mozete povlatiti gotove programe na obra2ac. Mopuds je prosirti obrazac na velitinu koju Zelite. Povueite iz prozora Toolbox i spustite ne obrazac natpise wisource, LblTarget, Lblstatus, gumbe btchar,btnopy,bndelets btnCancel, pole za poturduchtOvenstite, pola 2a tekst bxtTargetDirikontolezapet kkaz strukture mapa twaSource, twéTargetDir te postavitenjhova svojstva Nate tako dy obrazac izgleda otprilike kao na slic 13-8, i if ff i Slik 13-8, Freda abrascau Designer prozoru Polja za potvedu pored mop i datteka porebna su prozoru 24 odabir dato, ali ne odrediftom prozora (gdje je moguce odsbrati smo edn mapu)-Postav svoj Check- Boxes KontroletwSource na true, aKontole tfargetir na false Da bist to napravl, odaberie kontrola i podest vijednotiu prozora Properties. Kada fe ovo utinjeno,dvaputpritsnite Cancel gumb da ise wapraiti med a obads dogadsa. Kad dvapatpritsnete konto, Visual Studio stvori mefodu 28 ‘brad dogadaja za a objek. Saki objektims ,podracumijevan ogadaj ko Visual Studio Kors kad dvapur prsnete objek. Za gumbe, standardan dogads) lick paced vid bcc ick (object sender, Systems 0) pplication. 6xit()s Motete obraditi mnoge razigite dogadaje za razlitite kontrole. Jednostavan natin dao nnapravitejepritiskanjem gumba Events u prozoru Properties. Odatle mo%ete napraviti HDT Pogramiaajece ove metode 28 obradu jednostavnim upisivanjem novog imena ili odabiromn neke od ‘ih meroda. Visual Studio registrira metodu za obradu dogadaja i otvara editor oda u kojem napravi zaglavle i postavi kursor u praznotijelo metode. Toliko tose tiécjednostavnog dela. Visual Stadio geresits kad 2a postavhjanje obra sca inicjaliziranje svih kontrola, ali ne popunjava TreeView kontrole. To morate vii iti rato. | Savjeti o NET Windows Forms obrascima za VB6 programere Sino eda osnovne NET konttoleimaju pun toga zedithags som VB pret fasdnicama- All poste odredensizmene koje bistevasmogleukvatt neopémmten smite uabzc ove syjetepiikom trade obravaca UVB6 nekekontrole prikszuj tekst koristedistojsvo Ter ance koristesvojetvo Caption. U NET-, sv soit vezana za tekst se jednostavno aovu Text GumbiComordButtans u VB 6 korst sojstva Default i Cancel ako da th hors bao mode odabrat pricskanjerm pte Ete ih Escape. U.NET-, ove svoj dio objet ar Soja scepter ancetatenseboriteaaeSvane oh gUnD | 2 obras preurima odgovarajucu meted, Usb hans posi i) mee Ab lc da tach | 4azankae modalan djalokiokvir, protjeite enurgeator val mero Sha). U B | .NET.u ove dije metode ou raxdvojene u die calcite metode Stow 1 shade). = Popunjavanje TreeView kontrola Treeview konttole rade identiéno, osim So lijeva kontrola, tvaSource, sadZi popis mapa i datoteka, dok desna kontrola, twwTargetDix, sadr2i samo popis mapa. Chee pp Roores svojstvo u tuwSource je postavijeno true, a v tvaTargetDix na false. Takoder, Flak twsSource dozvoljava visesiaki odabir, koje standardan za TreeView kontrole, utwTargetDir dozvolitéete samo jedan odabir. Kod zajednitki za obje TreeView kontrole faktortst éete u zajednitku metodu F421 Directoryiree i prosljediti i Kontrolu se zastavicom koja ukazuje dali treba uzeti F covotcke. Tu metodu ete pozvati iz konsteuktora obrasca, jedanput za svaku od ‘ontrola FilloirectoryTeee(tource, tue): FlloivectoryTree(twerargetor, false); Implementacija FillDirectoryTree daje ime parametru tw Treeview konttole. To é predstavjtiizvorisnu Treeview i odredignu TreeView kontrola. Trebatéete neke Sys- f ten.10klase pa dodajte deklaraciju using Systen.10; na veh obrasca Formt.cs. Zatim dodlajte deklaraciju metode obrascu Formt.cs: Private void Falibrectoryfree(Treeview tm, bee isSoutce) Pogladle 1: PregramianjeWindowsapliadja. | 313, TreeNode objekti if ( AsSource ) TreeView kontrola sade2i svojstvo Nodes koje wzima TreeNodeCol ection objekt. Tre. NodeCollection je kolekcija objekata tipa Treenade od kojih svaki predstavia &vor y stablu, Poénie s praZnjenjem kolekeije: svatlodes. hear) Sada ste spremni napuniti kolekeiju Nodes rekurzijom kroz sve mape vih diskova, Prvp tuzmite popis svih logikih diskova w sustavu. Da biste to utinili pozovite statigky metodu GetlogicalOrives() objekta Environment, Klasa Enviroment pruzs tu infortna. cc pristupa trenuthoj okolini platforme, Modete korsttiEavironnent abjekt da biste saanall ime stroja, inagicu operativnog sustava, ime sistemske mape itd et subbirectorytodes( foot, ndBot.Text, true, ) , se Getsuboirectorodes( rot, oot Te false, )s ) ‘Vjerojatno se pitate zasto je potrebno proshijediti nagoot.Text ako vet prosliedujete adioot? Strpte se -vidjet dete za3to je vo potrebno kad se vatite U metodu GetSubDi- rectoryNodes(). Sad ste zavsili 5 metodom FillOizectoryTree(). Pogledaite primer 1341 kasnije u ovom poglavlju za kompletanispis ove metode. string{] strorives = Exvisonment Cet ogscalOrive(); GetLogicalDrives() vra¢a polie nizova koji predstavljaiu korijenske mape logitkih dliskova, Iteriat Gete unutar te kolekcije dodajuti Evorove kontrol TreeView. Rekuraija kroz podmape GetSubDirectorytodes() potinj sj jednim pozivom merode GetDirectories(), oval put odlazuci dobiveno polje DirectoryInfo objekata private vod setsuboiresctortodes( Teese parenthade, string fillNane, tool getr!letanes) foreach c ‘Obradite svaki logitki disk s pomoéu foreach pete. ng rotDirectonyane in strDrives) Pruo Sto treba provjerti jest da li je logi¢ki disk spreman. Mo prijediog za to je da ‘uzmete popis mapa najvi8e razine pozivanjem metode GetDirectories() na objekta tipa DirectoryInfo koji sam napravio za koriensku mapu: Dixectoryinfo dir » nov OsrestoryIno( ullkne Directoryfngol] airsios = ir,cetDirectories()i DirectoryInfo dir = new DizectonyInfa(eootOirectoryne); dlescettitectories; Primitive da proslijedeni Gvor ima ime parentNode, Cvorovi na trenutnojrazini ge biti potomci proslijedenog évora. Na ovaj nagin preslikavate strukturu mapa nahijerathiju Directoryinfo Klasa izlaze metode instance za jzradu, pomicanje i enumeriranje treeview kontrole, ‘mapa, njihovih datoteka | podmapa, DixectoryInfo Klasa je detaljnije objaénjena w poglaviju 21 Prodi kroz sve podimape, preskatuéi one koji su cenaZene kao tidten GetDirectories() metoda vrata popis mapa, ali ovaj kod zapvave odbacaje popis, foreach (Dixectnylnfo dirSvb Sn dibs) ‘ ‘Gvdie ju poaivate samo da napravite iznimku ada disk nije spreman, AF ( (dirsup. atest & Filetteributes. aden) 1x0 ) ‘ ) Filesttritutes je enumeracije. Njene ostale moguce vrijednosti ukljuguju Archive, Compressed, Directory, Encrypted, Hidden, Normal, ReadOnly, itd Smestite poziv unutar bloka try ne poduzimajte nikakvu akciju unutar bloka catch ‘Ako to udinite disk se preskave ako se dogodi iznimka. Kad znate da je disk spreman, napravite TreeNode objekt koji Ge sadriavatl njegov oe orijensku mapu i dodajte taj vor TreeView kontrol Treelode ndRoot = ney Treetede(rootbiretorytne); tvaades.Add(ndRoot); Da biste dobilt zmakove ,#" desno u TreeView kontroli, morate pronaéi barem dvile ragine magia (lako da TreeView kontrola zna koja mapa ima podmape i moze upi sati anak ,+* pokra) nj). Ne elite prolaziti kroz sve podmape jer bi 10 bilo prev spore, 43 [ME] Srostvo desu tributes jepredlodakbitave ena tribute ma ‘Ako iavedeelogicku operaciJiameds fe vijedhostipredloska bios Filesteributes.tidéen, bicse posta ako dstocela ima atibuthicden, inaée se svibtow bru, Postel skriveni tov moteteprvjeit cake $0 ete prover i rezulirjua int vejednost alitita od mle Posao metode GetSubbirectoryiodes() je da prode dve razine u dubinu, prostedujuél korijenski évor, ime korijenske mape, zastavicu koja zadaje treba li trafiti datoteke i trenutnu razinu (ijk poeinjete na prvojrazini: 318 | Pogramianje ce Fogle Progamicre Widow opine | 315 [Napravite Treetlode s imenom mape i dodajte ga u kolekeiju Nodes Evora prosl ‘metodi (parentNode): ‘Treelode sblode = new Tresote(tixSib.Noe); parentode Nodes. Ad suthode); Sad provjerite tekuéu razinu (koju je proslijedila pozizvajuéa metods) w odnosu ng konstantu definiranu za klast private cont int Mawtevel = 25 tako da ide samo dvijerazine u dubinu: Sf ( Level < Maxtevel ) t Getsubolrectoryades( subode, isSuh.FuliNowe, getFilevares, levelsa }; Metodi kao novi roditelski évor prosledujee évor koji ste upravo napravili, puna puta nju kao puno ime roditliskog évora, zastavicu koju ste primili2ajedno srazinom kojg je za jedan uveéana u odnosu na tekueu razinu (tako da, ako krenete sprvom tazinom, usljedeéem pozivu ée rsxina biti postavljena na dva). * Poniv 2a Tresoce konstruktat Koristi svojstvo Mae OirectaryInfa 4h g., cbiekea, dok poaiv merodecetsw0irectorytedest) koristi svjet9 Ful “2 inane, Alea je odabrans mapa CAWindowsMedia\Sounde, sojetvo alltane weaca hind putanj, dok svojswo have vraéa samo Sounds, Prosijeite €vtu samo ime jt je 6 00a Re Seite da bude prikazano tree view kontrol. Merodi Get SwbOsrecteryloes() proslyedi uno. ime sa putanjom tako da mote pronaei sve podmape na disku. Ovo predstalia odgovornaraije postavlenopitanjezatf je potrebno pro Sljedit ime korjenskog tvora kad prvi pur pocivate ova metod. Ono 'St0 se prsiede metodi nije ime Evora; to je puna putenja do mape koja vor predstavia! Urimanje datoteka iz mape Kad prodete kroz podmape, dolazi vrijeme da uzmete datoteke iz, mape ako je zat vica getfi1eNanes pastavijena na-trve, Da biste to utinili, pozovite merodu GetFiles() na Directorynfo objektu, Metoda vraéa polje Filenfo objekata Af (getfilevanes) U. Veina datteke 22 ova Bor. Fielnfof} files = die catFiles(); FileIn‘o klasa (opisana u poglavlju 21) prutae metode instance 2a rads datotekams. Sad mogete proti kroz kolekciju pristupajui svojstvu Wane objekra FileInfo i prosl+ jediti ga konstruktoru TweeNode objekra, koji onda modete dodati u kolekciju Nodes roditejskog tvora (iworeti ako évor-poromak). Ovaj put nema rekuraija jer daroteke nemaju podmape: 316) Progam iedenog seach (Fileinf file tn files) Treode fleNode « new Tretode( Filet); [patente Wades. Add ehose); fo je sve 80 je potrebno da biste popunili dva treeview objekta. Pogledajte primer 124 Kompletan ispis ove metode ‘Aka vamjeneito od ovoga abunjyjce,preporuéam da kd sptatepro- _gramons2a otkrvanjegreaka iprodeteharakpo korak kroz ek i} Tako meet promatrati kako Treeview gradi soje tvorore EU ovom primjeru morate obraditi veci broj dogadsia. Prvo, koristik mode pritisnuti B unis Cancel, Copy, Clear ili Delete. Drugo,korisnik mote potvrditi neko od pola u Ajevoj TreeView kontrol, odabrati neki ed évocova u destoj Treeview kontrol iki priti- Fsnuti neki od ,* 2nakova w abje konttole zzmttimo prvo sludajeve kad korisnik pritisne nesto na Treeview kontrol, posto su tesituacie zanimljvie i pacencijalno predstavjaju Ved! izazov, ‘Odabir opcjau izvorisnoj TreeView kontrol a su TreeView objekta,svaki sa svoiom mecodom za abradu dogadsja, Usmite prvo «vobzitivoritni Treeview objet. Korisnikpevo odabiradatoteke i mape i kojh 2li ‘pict. Svaki pur kad korisnik pritisne pole 2a potvedy odabirajuci davoreka il { map 10 izazove vei bro} dogadaia, Dogada) ko morate obra je Afterchec. Da bist to posi, implementirajeprilagodenu metodu 2a obradu dogadaja i naz0 vie ju twwScurce_AfterCheck(), ‘ewsource.Aftercheck += re Syste. Windoe. ats TreeView ventiindler (this. tonsource Aftercheck); Implementaci ie metode Aftercheck() prebacuje posao na rekurzivnu meiodu Set- ‘heck koju ete takoder napisati. Ona éerekurstono postavit sznake za potvrd 2a | sesar2ane mape. Da biste dodali aftercheck dogadal, odaberie Hontrolu twsSoutce, pritisnite ikonu # Bvents u prozoru Properties izatim dvapue pritisnite AfterCheck. To €e dodat doga- + da), povezati ga i postavti vas u editor koda gdje mozete napisatitijelo metode: 2 private via tmnSoure Aftercheck ( Re sade, Syste tnd Fs. Teo ethgs€) Setcheck(e.tadese Node. checked) Poginke 1: ProgamianieWindows placa | 317 onetnpand. PoSco ce ce metode bit identiéne za izvoriini i odrediéni TreeView objekt da ete napravitizajednizku metodu za obradu dogadaja za oba objekta: private vold Uatxpand(object sender, TeeeVewanceltventArgs ©) ben 2a obra doped prosjekter cj ete lps tor ope dried Testeasetage spc), Ponte ae sect) set Crane from, odnso needa oie Svakiévor ima svojstvo Nodes koje uzima TreeNodeCollection sa svim podévoroving Setcheck() rekurzivno prolazi kroz kolekciju Nodes tekuéegévora, postvliaju canal 2a potvedu koje odgovaraju odabranom évoru, Drugim rijetima, kad oznatite mapa sve njene datoteke i podmape su rekurzivno oznaéene, sve do dna, TeeeVlow to = ( TreeView ) sender; tool getFiles = tw == tsouree; Treelode currenthede = esse; String fulltine = currentode.FullFath; CarrentodeNoges.Clezr(); GetsuDirectorylodes( currettade, flldine, getFiles, 1); Kornjaée su sve do dna Evojedne, meni cmiljene pre orekurai, kako jue ispritso Stephen Hawking. Dogo. | dip se to fednom prior, kad je poznati znanstvenik pigs priéuo drevaim mio. ima postanka. .Neki hud,” rekao je, .vjeruja da svt potiva na lina opromne ornate, Narva, to ptie pitanje: na Zen Korat potiva™ Pru red ov0g koda precvara objekt koji e prosiedio delegat iz object u TreeView, Sto sigurno posto znace da samo TreeView kontrola moze izazvati ovaj dogada} Vas sjedeti zadatak je da zadace Zelite Ii uzeti datoteke iz mape koju otvarate, a to ‘elite samo ako je ime objekta TreeView koj je izazvao oval dogada} twxSource. Stara Zena koja je stajala na kraju sobe je ustala jrekla: Jako pametno sinko kornjaze su ispod, sve do dna E top kojeg évora je pritisnut znak .4* moéete urvedici uzimanjem svojsva Node 06 ‘reevientventfrgs objekta Kojeg je dogads presiedio Irae crrertlote » he Za svaki Treekode ukolekif vorovaprovjerite dali pedstaia list (engl lea) Core listako njegova kolekeia ne sadrinjedan vor. Akojelst, postvitenjegov sas heck na vijednost koja e prosljedena kao parametar. Ako nije List, ponovit: ‘Kad imate tekuéi Evor znate njegovu punu putanju (koju éeretrebati kao parametar sa etSubbirectorytodes) i onda morate otistii njegovu kolekciju pod vorova, posto ‘ete ju ponovno napunici pozivanjem Getsubbizectorylodes private vold Setcheck(Treeode node, boo} check) ‘i 1 Tah. sve Eorove-potenke oveg vera foceaeh (Ireshote nn node. Nodes) ‘ ithecked » check; // Odbira évor £2 rerinuu dubinu tako da podévoroviznajuako i oniimaju podévorove te da bisteposca F iliznakove ,+" pokraj nhovih podmapa 11 ako Je Boor v stab, nastavlsa dalje Af (nodes. count |= 0) © setcheck(o check) ) } | Odabr opcliaunutar odrediine TreeView kontrole Druga metoda za obradu dogadaja za odredigni TreeView cbjek« (osim dogadaja Befo: refspand) je neSto sloFenija. Dogadaj se zove AfterSelect. (Zapamtite da odreditn! TreeView objekt nema polja za potvrdu.). Ovaj pur Zelite uzeri odabranu mapu i stavit sjenu punu putanju u pole 22 tekst u gornjem lievom kutu obras. Da biste to uinili, morate ii prema gore kroz €vorove, crazeci ime svake mape koje (Ova) kéd proslieduje oznake za potvrd (il ih brie) nadolje kroz cijelustrukeuru, Na E se alaniianad i sklapati punu pacanj ovaj natin korisnik mode odabrati sve datoteke w svim podmapama oznaéavanjem samo jedne mape. priate void twlargetDir Aterselect ( ' object sender, Systenshindows, Fore TreeVewventArgs e) Sirenje mape Svakiputkad prtisncte znsk yt pored mape u ivoriinoj ii adredilno) Treevienkon- ‘woli elite prosiriti mapu. Da biste profil mapu trebate metodu 2a obradu dogadaj¢ string UWefulLPath = Getrarentsteing( Node); 318 | Pegamianjece Phe B:Pogamianjewindowsapitaga | 319 Uskoro €emo razmotrti metodu GetParentstring(). Kad imate pn putanju, mo thn sna toute ako peal nz ha one mobs see ee tekst: 46 (theruLath.emit(\0")) ( ‘Eula ‘theFullPathubstring(o,theFullPathLergth-2); ) ‘utTangetDir-Text = theulirath; Mero cetrertsrig() exis or vant punom pao. Debian I se aor oprah dosha osu Su nan nog een ey list Gtablaste strukcure): private string Gtfarentstring(TreeNade nale) st(nage.Parent = eal} ( retuan nodeTexts } cue c return GetParentstring(nde.Parent) + node.Text + (oe. todes. Count an 07°" AN}; Usvieai operator (je jedi rernarni: aperaoe u Ci jerikea (ermarni erator Uaima tei argumenta). Logika je sedega: proves dal je svojtvo hode-NodesCount jednako mula. Ako je, vrai vrjednost peje ‘dvorotke (u ovom slucajy prazan iz), inage vrat vjednost ira doo totke (u ovom shgaja obrnt kosu era” Rekuraia prestaje kad vi8e nema roditeljskih évorova tj. kad dode do Korjenske mape. ‘Obrada pritiska na gumb Clear Koristenjem metode Setcheck() koju smo ranije razradili obrada dogadaja Click sgumba Clear je trivijalna: protected vold binClear_Click (object sender, Systen-Eventrgs €) ¢ foreach (ieeNode nade in trusource-Nedes) f } setcreck(nede, false); , Samo pozovite metodu SetCheck() na korijenskim Evorovima ieciteim da reurzivno PoniSte odabir svih sadréanih évorova, 320 | Pogamianie ch plementacija dogadaja gumba Copy ad znate odabrati datoteke i odredisnu mapuy, spremni ste xa obradu dogadaja a orisik pritise umb Copy. Prva stvar kojutrebate utiniti je uzeti popis odabra- Bik datoreka. Ono Sto tratite je poljef{letnfo objekata, ali ne znate koliko objelata biti na popisu. To je pravi zadatak za ArrayList. Dodielve zadaéu popunjavanja psa metodi GetFle.Ast() private void BtaCoy Click ( ject sender, Systen.tventargs ¢) Listeriesefo> Feist = cathiteLést(); fobjasnit cu eu meiode prije nego Sto nastavimo dalje s metodom za obradu doga- pénte stvaranjem nove instance objekca List za Euvanje nizova koji ée predstavljati ‘odabrane daroteke: eivate Listilelnfo> cetriletist() 1) Prac nesortizano poke snana dstotka Lsestring> filets « new Liststzingy()s foreach (Tretode thetede in twSource. Nodes) CatcheckedFiles(theode, filesanes; ) Bd bise vidjeli kako to funkcionira aditeu metod GetCheckedFiles(). Onaje piliéno Piednostavna: ispituje Evor koji joj je proslijeden, Ako taj vox nema potomaka (node. ades.Count =+ 0), onda je list. Ako je ta list odabran, uamite punu putanju (poaive- Piem metode cetParentstring() za taj vor) i dodajte ju w parametar ArrayList: private old GetCheckedFites( Trestale nos, Listestring> fletines ) i 17 Ro $e Uist 1 (note odes\Count == 9) ‘ 1) ko Je Ber odoran. 4 (node.treced } ( 17 vasite puns pitanju § dodajte ju v arrytist String fultpath = GetPrentString( node ); fenanes.Add( fullPath ’ regroianeWadowssplhag | 321 ‘Ako évor nie lst prodite rekurzivno nia stablo pronalazeci évorove poromke fl foreach (Treshade nin note.Nodes) ett ) keds, fileanes) ‘To vaca List popunjen sa svime imenima datoteka, Natrag u metodi CetFileList() ‘opotrijebite objekt List da napravite drugi objekt List, koji ée ovaj put sadrdavati stvarne FileInfo objekte Listeeilelnfoy FileList = new ListeFiletafoo(); Primjetite da su koriSteni List objekt sigurni za tip kako bi se osiguralo da prevoditel obiljeXisvaki objekt dodan u kolekeiju koji nie ipa Filetnfo, Sad modete prolaziti kroz imena datoceke w fileList uzimati ih is njima instancrati objekte FileInfo, Provjerom svojstva Exists modete utvrditi radi lise o datoteci il rmapi. Ono ée vratti false ako je objekt File koji ste napravili zapravo mapa. Ako je File, motete ga dodatiu novi ArrayList each (string filetane sn Flekanes) i FileInfo File ~ new Fletnfo(# 4 (File exists) ‘ ? ) ‘FiteList.Ado ite); Sortiranje popisa odabranih datoteka Pozeljno je da popis odabranih dacoteka sortirate od veéih prema manjima tako da na odredisnom disku zauzme Sto manje prostora, Prema tome, moratesortiati ArrayList dobjekt. Mofete pozvati Sort) metodu, ali kako ée ta metoda znati kako sortiatiFile- Info objekee? Da biste reli ovaj problem morace kzo parametar proslijedti 1CompatercT> suvele Napraviti Gemo klasu FileConpazer koja 6e implementirati generigko sutelje za File Info objekte: exotic ¢ (Ova klasa ima samo jednu metodu, Conpare(), koja uzima dva FileInfo objekta kao argument 55 FileConparer : IConparercFileinfo> public int Conpare(Piletnfo files, Filetnfo file2){ Sm | Promina © obigajen pristup je da metoda vrativijedniost 1 ako je prvi objet (ile) veéi od dru: Bhs ein U com so ake one olen peas eae Ja posivanje metodeabrne rezltae kaa So ste videl pet a a bist ispit file2. Length) 1 (en Length filer. tergth) ( , Vratimo se metodi GetFileList() gdje ste se upravo spremali instancirati referencu ‘Canparer i prosijedie je metodi Sort() fileList Iconparercfiletof conparer = ( KamparercFlelnfon ) nin FileConporer(): ‘ileList.Sort(cnporer), Kad je to utinjeno, mozere vratt fleList pozivajucoj metodi return filetists Pozivajuéa metoda je bila btaCopy Click. Prsjtte se da ste otis u metodu GetFile List() u prvom redu metade za obradu dogadajat protected voia tencopy Click (object sener, System.EventArgs €) { ListeFitelnfr FileList = GetrsteList(); U ovom trenutku veatl ste sortirani popis File objekata od kojth svaki predstavlja datoreku odabranu u izvori8noj TreeView kontrol Sad mozete prolazeci kroz popis kopitati datoteke i aucirati korisnitko sutelj: foreach (Filetnfo file in filelist) wy Lnlstatus. text = “copying * ‘xtlargesDir.Tert © W" + filetone + 7.5 wea Ta Fad korisnik pritisne OK ili Cancel rezultat se prosleduje natrag kao enumerirana F riednst System. Windows Fors.O\alegtesult. Mozete prover ove vrjedooat da ‘tte capyotattngtnir. Text + + le li Koisnik odabrao OK ale nae, ehkOveraite.Checkea); 1 (cesult = Systen.Mindos. ome Dineghesst oe) d ‘ cateh (Exception ex) ko jest, moBete dobiti popis imena datoteka fileNanes i prolazeéi kroz njega brisati ala od ii i a aeeuee persyList filedanes = cetrileList(); ) Ibastatus.Text = “Dove. foreach (FileInfo fe in filetanes) Kako idete dale, pikative napredak u natpisu Ib1Status i pozovite Application. cot. ty vents() da biste korisnizkom sugelju omogueil dase osvjeti. Zatim poatwite metoty opyt0() 2a datoteku,prosliedisijojodredisnu mapu uzetu iz pola za cksti Boolean zastavicu koja pokazuje da li daroteka teeba biti prepisana ako veé postoj, bistatus.Text = “Deleting * + ‘atTargetDizTeet +N" Alessime «0 Primjett Gete da zastavica koju prosljedujete metodi vrijednost polja za potvrdy caine aoe chkOwerlrite. Svojstvo Checked daje true ako je polje 2a potvrdu oznateno, a false ‘leoelete(); ako nije > Kopiranje je umotano u blok try jer puno toga moze krenuti krivo prilikom kopicanja : catch (Exception o9) datoteka c essageboxshoex.tessage); ‘To je sve - kopirali ste dacoteke! a 7 Lbistatus-1ea. = “tone pplication. babvents0); Obrada dogadaja gumba Delete Kod za obradu dogadaja Delete je jot jednostavnij Prva star koju trebatenaprvte je a pitae krisnika je i sigoran da ich obrisatidatotek protected wld brelete cick Ceaject sender, Syten sents) ( Seton indo Forms oitoteslt rest © esnpaoe shone f Ova) kod je identi¢an kodu za kopiranje asim sto je metoda koja se poriva ned dato: & tckom Delete(). Primer 13-1. Ievori kad FleCopieraplikaie Ff tregion Using directives sing System; “Are you alte sure, 14 vrata telete rile, 1 Satis Sin Sten calectons (NessageBoxtuttons.oKcancel,, 1 Gabi “aitt Systen.Col lections Generic; fesepebricontclowtion, (7 None sing Systen Componente, ing Systen, Dato, ‘sing Syste. Drawings | ing Systen.t0, Ging Systen.Windows.Forms; essagefonCefaultautton-button?);// Podrazursjevons aumb Motete koristiti statieku metodu Shoa() iz Messagedox i prosliedit jo) poruku koju Zelite prikazati, naslov ,Delete Files” kao niz znakova jzastavice kako sid: + NessageBox.0kCancel tai dva gumba: Oki Cancel. + Nessagedox. Iconéxclaration govori da Zeliveprikazatiikonu usklitnika. + vessagetex.Oefaulteutton.Button2 postavija drugi gumb (Cancel) kao podrazt I ijevaniizbor etzepion 10 exenatkss 1, File Copter = Windows Forms dennstracijshi program B11 (eh copyright 2005 Liberty associates, Ine LU ebeenaksy | 324 | Pogamiane ce Posie: Pogianje Widows apagy | 525 rimjer 13-1 evorn kod FileCopier aplitaie(vastavak) ranespace FeCopier ¢ 111 canary : U1) Sorat a denonstrocSju Windows Fors Sinplenentacl Wi isamary portal clast fraFilecopier : Fors private const det Moxtevel public femFileCopier() Initial ieconponent() ; Filibirectorytree( twusource, trie 5 luinieectoryiree( twTanget, false )s 111 csomary tin pretense hoje me bak wspecdivath Ji dekje datoteke hoje feline sortirati od vece preno man} 111 cfsumaey public cass FileConparer : TConparercFileInfor t public int Conpare(FileInfo file, Filednfo File2) t Af ( Ailes Length > file Length ) ‘ , fe ( filet. Length ¢ filez-Lerath ) ( > sic taot Equns(Fietao x, Fett 7) throw new NotInplenentedexception(); danse in einstein») { fa ne tpn ) } private void FillDirectonytree( TreeView tut, bool isSource ) 11 Fopunjava twSource, the Source Teeaion, 11 sa sadrtajen 17 lokalnog tog disks OY Najprije bride sve Cvorme, tometer; 325 | Progamiranece sner 13-1, lzvorni kod FileCopieraplikacj rastavak) 1) Vilna lopitee dlsove 4 stavlja th 17 torijenske évorove. Popunjva pole = 17, Vogitkin diskovina ma sto} String} stroriver ~ Enviroment. etLogicalbrives(); 17, brolacs koe diskove 4 dodaje Sh stab, 17, Aorist lok try/eatch pa ako disk nije sprem, 11 opr. praara diskets 111 ©, 17, nade BERL dodan ra pops foreach (string rontOirectongore sn stzbrives ) { wy 11 opunjava pole sa napana prve razine. 11 ho disk aije spresn 11 Sit Ge iabogena inka, Dizectoryiafo dit = new Dizectrylnfo( rootDirectanyone ); ir Getbirectories(); /fForsira Linky ako disk nije spreman Treeode ndtoot = now Treehade( rootdizectorytoe }; 11 odaje Eor 23 sku korijeasky mp, ‘emtades.Add woot; 11 dodaje Evorove gesapa. Wha je Treeviee ter, 11 ands ina 3 inend doth, 4 (issoutee ) c Gatsuirectonyedes( eeot, noo Text, t3ue,t 5 ) else cetsuboirectorades( rnacot, nook. Text, false,3 ); ? ) 11 ata pogreshe poput 17 disks Koji nije sprema ‘ ) Application. 0o6vents(); ) )1/ tatvare Félisoucenirectonytree Pogo B:PogamieWindewseplacls | 327 Prinjer 13-1. levorni kod FleCopieraplacte (rasta) 1 simary 111 eins ptrape Sopot 11h prelsteog terete 111 bade sh stblo ap 11 Preligeden pronto retest vor ih 3 pins 111 para peta rose, 111 Veckeo tastorie to) sort Ii ui treba une tote Te potage. private wold Getsibbirectorytodes( Ttecodepatentode, sting folie, boo! geritanes, ire ew! DirectoryInfo dir » new DisectoryTnfo( fullNone ); Disectorylnfol] diisubs = dir.cetOlrectories(); 11 odaje tvor-potmak 23 svaku podaap, foreach ( Dizectorylafo dieSib in dirsibs ) t 11 Ne prikazuse skrivene nape Se ( (dirs. Actributes & Flletterdbutes.Kidéen ) fo) ) U1 csamarys 111 Saka apa ina pan potanju. 111 Teabaa pods felsth na Kavin eetana, 111 potrijebiti sano 111 wait vor w stab, 111 otrebno je dapit napisati hase crtu 11 ere ona inate 111 ask sa pre 11 essary Treaage sublode = now Treoode( rsub.Nane ); parerthade.todes.A4d( sboge 11 Reursivno posiva GetSuboinectoryedes 46 ( Level ¢ tate) { Getsuibirectonglodes( subliode, dirSupfullhane, getFileines, levels: ); ) ( getFiletines ) 11 sina datoteke 22 ovaj Evor. Filetnfo[] les = dir.cetFiles(): 506 | Prgraminje ch ner 131 evorn kod FleCopieraplikaiefnstavak) 11 kon sprenanja évoros, 1 So sprens datoteke 12 ope fern (rietfo Fe in ies) Trefode Filetode ~ new Treelode( fite.tone ); parentode. Nodes. Add leeds); ? > 111 exmearys 111 Pravt sortirant.popis syih 111 datotekaofsbronih te koplronje 11) obredns napa WH stesmary> private void Btacopy Click( object sender, stsutvetag 11 ns pops UsteFlelnfo> (leList = cettiletist()s 1 Kopira datoteke {foreech ( Filedafo file in fileist ) ty 1 Qstietava rats do prikanuje naprese stats. Text =o ving "+ txeTargetDi. Text + "\\" file tate + ein Application. Oofverts(j 11 Kapira datotela u cited naps fteCopyto( tetTargetDinstext + AN" + Heine, Novena. cece) Cateh (exception ex ) | 11 Woda telite neSto vise of 11 prllazivanis porske Messageboxshow(exstessage ); ) Ilstatus-text = “Done. Aoplicaten.Oncvents(); ) eet krsjem siiog sab 6 pont 111 birth eons ised 111 eseary Fogle 13: Pogramicanje Windows aplikacia | 329 DPrimjer 13-1 levorn kod FleCopier aplikectie (nastavat) iva wld bce Cik( object Sender, Ste. EER € ) ‘ 17 Uaina Evor na nasjviten galozajy za svaki disk IS eoork ‘hoeth Cncaode nose in scree es ) Setcheck( nade, false 5 , ) 11 csomary> sc Tie hte Resnik petssne Cancel 2 tit ey private td becancel Click(object sender, Eventirgs €) Applicat ion-OxitOs 111 csomary: 111 oopison & pole 60 raspolaganit 111 popnjava popis ineniaa U1 —Seih odabranih dato 111 aisaep U1 ropanjova ArrayList <2 punim pata 1 edabranih datoteka frivate void GetchockedPiles( Treetde node, istestring filetanes } 1 17 Bo Je Lists. 1 ( nde Nodes. Cout { 1) ka §e vor olabran.. Cote checked) { °) saje Ju ma arralist 17 wzina pun putangu 4 éodaje Ju ma ary String fulbath = cetPareresteing( rede J; filetones.246( FulPath 5 1 fase 11 Aka ov] Bor nije Hist 11 ako ova} (or nije List “foreach ( Teeede fin node Nodes) cetchechedFites( n, Filtanes 9; ? ) 1 111 esomarys Teng er 3 rae TH puns pata 111 efsaaae> BO | PogamianeG? Drinjer 13-1 Ievorn hod FileCopier apitacie(mastavak) priate string Getaentstring Tete node) t 1 ioe ow trtfistt ok (C) waa ast ti nde Pet ml) fi sur mle Tests h. i 11 waa gare 4 anti, (1 tain tone oa} Bor tw ce 11 Ho Jem) ot Use, oe ste tos ere tet etvtetstriag left.) de Tes © Coote aes cam =O? Vp ) ) 111 eswmarye 111 Ofjele Ju operacie brisanja 4 koptranjo 111 Stara sortirant pis 111 dabranih datoteka 1) esas) private ListcHetnfey GetFiletistt) ‘ 1 stvara nesortizano palje pinthputanja datotela LUstestring> iletanes = new Listing) 17 Aceaylist Sletanes = pew AeraycXQs 1/ roponjava Flehanes ArrayList ¢ 17 pono putanjon sake datateke 22 koptzanje Soxeach (Treeiade thle in tweource.Nodes ) c Getcheckooriles( beade, Fedanes 5 ) (1 Prov popis 23 covanje Filetafo objetata ListefleInfos filet5t = noe Uist tEletnfo(); 17 wrrayist FlgList = ew ArFayLSt(); 11 1s sve ine datotoke 2 nesortiranog pole, 17 kone ogovaea datotect (9 he mop) 1 dodaje ga na pops &tatela oneach (String filetbae in flletones ) i 11 stvate datotebu § Sneron Filelafo file = new Felnfo( fietane 5 11 Provjeravapostaji Ii a disks 11 $e pes ako 36 ape 48 ( falectxsts ] Pe Pe Woda | it Prinjer 13-1 I2vorni kod FileCopier alike (nastavak) U1 TLE 4 veiednost je aatateka 1 ba 1t bilo lakee kod bi inals prazny vrijednost? fileList.tdel fe ); ? 1/ Stata snstraten sugelse tCanpozer onparerciledefo> canparer = ( IComparercFiletnfo> ) nen Fieconpater(); 11 Feosljeduje Koparator setods 28 sortiranje take dt Je popis| 11 sortizan 5 todo 23 sortiranie fideList-sort( cmparer ); return felis; ) 11 csomaty Jit Provjerava dei korSantk 2alsta tes brisane. 111 Pract opis | brise svaty datotek 1 etsomeasy> previ Beet CLA oye snr, ste oes © ) 11 Pita kortsnila Je 1. siguran Systen Mindows-orme.DialogResult result = HessageBos Shou “are you quite sure", 11 forks Delete Files", 11 tps essageBoxButtons.0tCancel, 17 Goi essageBorIeo. clans ion, 17 Tone essageBoxDefaultButton.Suvton2 ); // Pedrazujevani. gimb 1) eo je korisnik siguran. iF (result = Systen.WindonsForns.Dlalogesult.O& ) c 11 prolani kroz popis 4 briSe datotete 11 rina pops odsoranih datateta, ListeFilefnfor Flehanes » GetFileList(); ‘foreach ( Filetnfo file in filetanes ) ‘ wy 1 Reurra natpis do prikazuje napredak ‘bystatus.Text = "Deleting "+ ‘lestane 4 *...°5 app lestion.Datvente()s 11 Brisa ‘ile.oelete()s } catch ( Exception ox ) c * rijer 9. aor hod FileCopiereplikacie (nastavak) 17 Nota iehite neSto vise 06 11 prikazivanja poke estageorSha(ex.Ressage 5 ) blstatas.text = "Done pplication. 0a6vens(); 111 ssmarye 111 Veina puny putanju osabrane ape 111 Shapira ju entTargetoir 111 o/swaary> private void tovtargetOir Afterselect( object sender, Syston Kinds. Fors. TreeVleudventargs © ) 11 ina puna putanju 22 odabrany naps string thefullFath = etParentStringe.Nade ); 11 ko nije List zaveavat Ge 5 cbrtem kasonerton 1 Bre kos ert AF ( thefullPathsfadsith( “\\" ) ) ( ‘theFulrath ‘theFlleath.Substring( 0, theFullPath. Length - £ ) 11 dodajeputaniu v paje 2a tekst ‘wtTargetoir. Text = thefallPath; > 111 csumazy 111 Oblljetova wold Gvor Ssped teluteg 111-5 trensteon eSjedpts Skea, ora U1 eiseeacp private void twiSoutce Aftercheck( object Sender, ‘Syston Mndows.Foms, TeeVieubvetArgs ©) 11 Poava matods 28 rekursivns prolas 11 essed Je &v0r Jo}l Je Rorksik odabra, 1) Stanje somake 33 pobre vet gan fendena 1 doe ste stiglo do evap asta. 1) Dog tage delim proslijeeits 1 stanje evradetethed {(e-Ation t= Tee¥entfon. inion) ‘ Setcheck(e.nade,.Node.checked 111 csuary 111 rekurtvra postovfa SLi brite omate 20 pated 111 esamany3 BD | Pegamianje eae craic Wedowapita (33 Prinjer 13-1, fevorni kod FleCopieraplikacijefastaval) private wid Setcheck( Trees node, bool check ) jer 13-2. dlomak XML datotke sa dotumentaciom a apkaci 2 tpianje dtotoka t assen> 11 Trad sve (rove potorke ove évore monsFleCopierc/nane foreach (Tredlde n in naetoes ) usecnbly iGhecked = check; 17 Potvrduje évor emp nanes"T Copier. fm eCopier"> 11 to Je t0 tor w stablu, rekurzivne prolari corazac to deonstaciju nds FoonsSaplenetacje HF ( nodes. Count t= 0°) ‘sumer C cienbe Setoreck( 6, cheek 5 “ember Fane="F:FileCopier. tra ileCpier.compenents”> , “sumy> ) Required esigner variable. } ‘isams%y> cuneate private vold twéxpand(object sender, TreeViewanceleventrgs ¢) “nb ranes"¥FeCopier fen eCopt. lspose(systen.Boleae)"> £ summary Clean up any resources belng use ‘rewview tw « ( Treeview ) senders sumaty> bool getFiles = tow a tiwSouree; centers ‘Tredtade cutrentode = Ned ‘reer ane=WFileCopier.fmfileCopier.Initializeonporent’> stHing fullane = currentNode-FuLlPath; “sammary> currentlode toes, Clear(); Cetsuppirectorjodes( curzentNace, fullNone, geFiles, 4 )s RN esulted netted for Designer support ~ do rot modify ibe contents ofthis nth wth he code eter. sana neater “Geer tneRFleCopr.fra Sepier.Ctsbirectoyoes {spten nner reote,Syten rig ysten. olen Syste. 132)"> Uns he postpe {spo proslijenog vero mae Sodaje inv stablo wap, Proshjedentporoetr su oditeljski or 2 foamy, pone pata fodape, {bese sastaviu kfe grt do It trea wet datotee It pose ? } XML komentari za dokumentaciju (CH jezik podréava novi stil komentara za dokumentaciju sai kose crt (i). Modete vidjeti ove komentare razbacane svuda u primjeru 13-1. Visual Studio editor prepo- ‘naje ave komentare i pomaze da ih se ispravno oblikye, (C# prevoditel sakuplja ove komentare u XML datoteku. Mozete ju napraviti zada vanje (doc prekidata prilikom prevodenja u naredbenom recku. Na primer, modete prevest program i prinjera 13-1 sa ovom naredbom: amy se Fom.cs /doi00.108 Ges fne~Wtlecope. et eopiertnop Chick (Systen. object syste. EventArgs) > csonnae ravi sortirat popis svih tote odabranih 24 kpiranje \odredizne napa ‘dsomany> Ist ishod motece postiéu Visual Studiju pritiskom naikonu projekta FileCopieru pro 2zoru Solution Explorer, odabirom opeije View Propery Pages u Visual Studio izbornik {zatim odabirom opeije Build property page. Potvrdite polje XMLDocumentation File ‘iupisite ime XML datoteke koju elite napraviti, na primjer FileCopier.XML. Dio datoteke koja je napravljena za aplikaciju FileCopier iz prijaSnjih odlomaka je prikazan u primgjeru 13-2. © Dokumentje vel i iako je Iiudima Zt, nije previge koristan u tom obliku. Moete, |) medutim, napisati XSLT datoteku da prevede XML u HTML, ili mozete utitati XML dokument u bazu podataka za dokumentaciju. Takoder mazete povuti datoteku Bt 1 Regaine Feghe 1: PegamiareWedowsapiiaga | 335 prozora File Explorer u Windows Explorer koji osigurava zgodno sucelje 2a Gitanje XML, kao Sta je prikazano na slici 13-9, Senator aq ‘Shea 13-9 Pregled XML dokumentacjew Inernes Exploreru 26 | Pogo POLAT Pristup podacima kroz ADO.NET ‘Mnoge aplikacie«cebsjupristupati baz podataka. .NET kostur pruda Siok skup obje- kata 2a povezivanje s bazom podataka, Ove klase se nazivaju zgjedni¢kim imenom ADO.NET. ‘ADO.NET izgleda vio sliéno kao ADO, njegov prethodnik. Kljuéna razike je da je ADO.NET prirodni dio NET kostura (nije samo omorat 2a OLED} da jew peven- ‘sven nepovezana podatkovna arhitektura, U nepovezanoj arhitekcuei podaci se uzi- maju iz baze podataks i poheanjuju lokalno, Vi radite stim podacima na lokalnom ragunalu | spajate se na bazu podataka samo kada elite promijniti zapise ii uzeti sve podatke, Postojeznatne prednostikod odvajanja podatkovne arhitekture od baze podaraka. Naj veéa prednostjeda apikaci, bilo da seizvodi na Webi ili lokalno,predstavja manje opfetecenje za posluitl baze podataka, io aplikaciu moze utinitprilagodhjvijom. ‘Veze prema bazi podataka se intenzivno koriste i tetko je odréavattisuce (ili stoxine ssuea) istovremenih veza, Nepovezana aohitekura omoguésta uStedu sredstava ADO.NET se spaja na bazu podataka da uzme podatke i zatim se ponovno spaja da aburira podarke koje ste promijenili. Veéina aplikacija provodi veéinu vremena jed- nostavno titajuéi podatke i prikazujuei th. ADO.NET osigurava neovisni podskup podatala bjt dete korstit za ttanje | prikazivanja podataka. Relacijske baze podataka i SQL Tako je moguée napisaticijely knigu 0 relaciskim bazama podataka i 08 jednu o SQL-u, biena svojstva ovihtehnologis nisu Ska za razumijevane. Baza podataka j2 spremite podataka, Relacska baza podataka organizira podatkew tablice. Razmo- trite Northwind demonstracisku bezu podataka koja doaal uz Microsoft SQL Server i Microsoft Access. 37 Tablice, zapisii stupci Northwind baza podataka opts imishenu trek koja kupuje i prods preran, bene proizvode, Podaci su podijelieni u trinaest tablica: Customers, Employer, Orders, Order Detaild, Products i tako dale. : Svaka tablica u relacijskoj bazi podataka je organiaicana wu redove, gdje svaki ced predstavia jedan zapis (engl. record). Redowi su onganizitani u stupce. Sviredovi y tabliciimaju ist strukturu stupaca, Na primjer, eablica Orders ima ti stupea: onde. 1D, CustoneriD, OrcenDate Za bilo koju narudabu teebate znati ime kupea, adresu, ime osobe za kontakt itd, ‘Mogli biste spremiti ta informaciju sa svakom narudzbom, ali to bi bilo neutinkovieo, Unyjesto toga koristite drugo tablicw koja se zove Customers iu kojo}svaki red pred. stavla jednog kupca. U tablici Customers postoji stupac Custoner1D. Svaki kupac im jedinstveni idensifikator iro polje je oznaéeno kao primarn kljué (engl. primary key) 2a ta tablicn, Primarni klju je stupac ili kombinacija viSe stupaca koji jednoznaéno identificiraju zaps u tablic. Napomena za VB6 programere koji prelaze na ADO.NET ADO.NET je ponesto drugaéij w odnost na ADO. Dok ute keko implementa hove ADO.NET funcional rj te seta postavit pista kao osu “Gajejetoveext() metoda? li, Kako da provjerim gee kr) datoeke?™ Kod ADO.NET, funkcionslnost koa bila sklopu Record sets se sada ala na dvanjesta Upravjanje podacima iuzimanje podatakaprovodi se kroz sul Ista Feace, dok se podrika zo nepovezave opera nalaiu anatno pojaéanim) Dataset inatoobles tatstables mote bit shvaceno kao poljkojesadrtiDatatos, Porivanem metode Kove arst() u ADO.NET- bi bil ist kao pristupane prom indeksu poli, Peovjera sae fe kraj datteke odgovara prover da i tekuelindeks odgovaragornoj ganic ‘pola. Zelite postaviti obiljedivat za odredeni zapis? Samo napravite vatijablu i dodije- Te jo indeks reuse apis ne rebate poser Boltark sya}. ‘Tablica Orders korisi CustomerID kao vanyski kljué. Vanjski kljué (engl. foreign ke) je stupac (li Kombinacija vise stupaca) koji je primacni kijué 2a neku drugu tablicu. Tablica Orders koristi CustomerID (primarni kljué za tablicu Customers) da odredi ‘oj kupac je napravio narudbu. Da biste odrediliadresu za narudzbu, mozete kor stiti CustomerID klju® da biste pocradili zapis kupca w tablici Customers (Ovakva upotreba vanjskih kljuteva je posebno korisna prilikom prikazivanja veza tips sjedam prema vie" ii vie prema jednom" izmedu tablica. Odvajanjem informacia U tablice koje su povezane vanjskim kucevima, izbiegavate ponavljanje informacija tu zapisima. Jedan kupac, na primjer, moze imati vie narudbi, ali je neuéinkovito 338 | Rogramiane ct : | i navi informacije 0 kupeu (ime, elefonski bro}, dozvoleni limit i take daje) u Po aap natat2be. Proce uklanjanja suv informacia iz 2apisa njihovo preba Sanju zasebnt tablicu se zove normalizaciia Normalizacija oxmalzajanesamo da omogucavawtinkoitekorienjebazepodataa, ve sms Nampertose ube, AKO ada ime Kupea abe Custer table ada bi postoj rzik da se promiena vy jedno| od tableaodra2 ina drugu F lablica, Zato, ako biste promijeniliadresu kupca u tablici Customers, ta promjena se ebi vidjela t svakor redu tablice Orders (i dosta truda bi ilo potrebno da osigurate Bs se promjene vide). Dréanjem CustoneriD identifikatora u tablici Orders, mozete E Soboduo mijenjatiadresu u tablici Customers i promjena ée se automatski odraziti qasaku narudzbu. Bas kao Sto programeri u C# jeziku dele da prevodizalj primjesi pogreske prilikom prevodenja, ane priikom i2vodenja, takoi programeribiza podataka Zeledaimbaza pdatake pomogne da izbjegnu moguénost gubitka podataka, Prevoditel pomate da Pe iabjegnu pogreske u CA jeziku nametanjem pravilajezika (na prim, ne mozete foristit varjabla koju niste definiralil, SQL Server i druge moderne relacjske baze podataka izbjegnvaju pogretke nametanjem ogranigenja koja moter sami defniat Na primjer, baza podataka Customers oznafava Custoneri0 kao primatni klju. To > svara ogranienje primamog kjuza u bazi podataka koje osigurava da je svaki Custo- ter1D jedinstven. Ako u bazu podataka dodate kupca Liberty Associates, Inc. ti identiflkator Custonext0 ena vrijednost LIBE i onda pokuSate dodati kupea Liberty Mutual Funds sa vrijednosti LIBE identifikarora Customex39, onda bi baza podataka ‘odbacila taj drugi zapis 2bog ogranitenja primarnog kliuéa, Nazivni referencijalni integritet Relaciske baze koriste nazivnireferencijalniintegritet (engl. declarative referential inte {griy) 2a postavljanje ogranigenja na veze iameduraaltitih tabla, Na primer, motere postavti ogranigenye nad tablicom Orders koje name¢e da nijedna narudzbs ne mode imatiCustonerT0 identifikator osim ako Custoner10 ne predstavja (Orders. To pomate dase izbjegnu dvi vrste pogteSaka. Prvo, ne mozete unijetizapis, sa identifikatorom CustonerID koji nije valjan, Drugo, ne moteve abcisai zapis kupea ako se taj CustonierID koristi u nekoj od narudibi. Integrtet podataka je prema rome jan zapis a tablict SQL [Najpopularii jezik za izradu upita i rad s bazama podataka je SQL. SQL je dela rativni jezik, 2a razliku od proceduralnih jezika, i moze proéi neko veijeme dok se naviknete radii sa deklatativnim jezikors kad stese vet naviklina proceduralnejezike kao So je CH ‘esa Wei podcia bez ADONET | 338 ‘SQL je baziran na upitima, Upit (engl. query) je deklasacia koja vrada leup 2apsa i haze podataka. Na peinger, matere podaljeti da vide sve zapise iz tablice Customers u koja je | adresa kupca u Londonu, Da biste to napravili, napisite: select CustorerlO, Corpanyhane fron Custoners were city « ‘London (Ovaj kod vrata sjedecih Sest zapisa: CustonerI0 Conpanyfane snout Axcund the Horn BSEEY a Beverages ERS Consolidsted Hoadings FASIC Eastern Connection NORIS North/South SEVES Seven Seas Inport SQL. je sposoban 2a mnogo moénije upite. Na primer, zamislite da ditektor kompa. nije Northwind Zeliznati koje proizvode je kupac Vins et alcohols Chevalier kupio y estam imjesecu 1996. gndine. To je neSto kompliciranie. Tablica Order Details zna identifikator Product {0 2a sve proizvode u svim narudzbama. Tablica Orders ana koji su CustonerID identifkatori povezani sa narudzbom, Tablica Customers zna Custene- 1D 24 kupca, a tablica Products ana koje je ime proizvoda zs Product 10. Kako sre 19 povezati? Slede¢im upitom: Select o.0réerib, profuctnane fron Order Details) od join orders 0 an 0.OrderiD = o@.0rder10 Join products on p.PradyctID = adsProduetTO Soin castors c 6, CustORRKID = Caton ere e,Conpanyliate = Vins et alezols Chevalier" nd endexDate >= "1/3/1996" and ondexDate Koristenje OLE DB upravijanih izvora podataka Cetiri upravjana izvora podataka su trenutno dostupnas ADO.NET-om: SQLServer Managed Provider, OLE DB Managed Provider, ODBC Managed Provider i upravjani izyor podataka 2a Oracle. Prethodi primjer je koristio SQL Server Managed Provider, jie optimiziran 2a SQL Server ograniten 2a tad sa SQL Server bazama podataka, Univereainie ejebenje je OLE DB Managed Provider koji ce se spojit na bilo koji OLE DB upravljani izvor podataka, uleljucujuei Access. Modete ponovno napisati primjer 14-1 da radi s Northwind bazom podataka kore ‘Access uiniesto SQL Servera uz samo nekoiko mani iamjena, Prvo, teebate rome iti niz znakova za povezivanie: string conectionSteing “pronier-AicroesHt JT. 00500.8.0; * data source =: \\ind.ndo"; (Ova) wpt se spaja s Northwind bazom podataka na C: disk (toGna putanja kod vas mode bith drugatia) ‘Zatim promijenite Datakdapter objekt iz SqlOatatdapter u OLfDsDataAdapter: alebbostabater Ditatsapter = nen OlDiDatattanter (commandstring, connectionstig); ‘Takoder obaveano dodajte using deklaraciju za edb imenski prostor using Systan ata. O1eDb; ‘Ovaj projeleni prediogak se nastavia dalje kroz dva upraviiana iavora podataka. Za svaki objekt dje ime klase potinje sa ,Sql" postojt edgovarajuca klasa koja potinje ss ~OleDb". Primer 142 prikazuje kompletnu OLE DB inaticu primera 4-1 Prinjer 14:2. Koritenje ADO Managed Providera srepion Using dizectives sing Syste; 566 | Pranic Prijer 14-2, Korte ADO Managed Provider nastavak) sing Sytem Collections. Conese; sire 59Ste8.Companesthadey Baie system bat, sit SYSten.Data ole, Ee ing SIstom Oroving, Bene Ulcer partial cliss ADdietforns + Form c pubic Aooeerocet() Tnitalizetonponent(); 11 Povexivanje s Worthing tazen podetaka string comectionstin Providerticrasoft JET. OLE0. + Tata source = cing nbs 11 sina raise ie tabice tupace string comandstring = ng ‘Select Conpanyane, Contacthane fom Custowers"; 1 Sara ated tek stapa pot 1A Dataset * mrs OlestoatatcapterQatatdapter = ne Oebenatanaarter( onmandstring, cinnectionString ); DataSet ataset = yew DataSet): 11 Poponjava ebjekt slags podstata atondopter.F1( WataSet, “Custones" J 1 Usins atu tablicw ta Dataset DataTable datoTole « oatsetTobeso); 1/28 aks red wai prikanie paste forse (anette asatecns ) ato onpan + ctaton( Contactor") +") 1+ Foyle 12 Pstuppedaca a ADONET | 347 ds kontrolama za podatke fd iprobsimo drugaipristp koji je vibe deklaratvan, Napravite novi Windows ums Solation (nazovite go Declarativatahisplay, Paetate obrazac | proms ice mu ime v DecarativeDB csi dodaite naslov Declarative Data Base, Porucie ptasidview na obrazac fad je ma svom mest, pojavit se izbornik Acton, Prtisnite padajuti popis da ia Free iavorpodataka. Prisnite Add Project Data Soutce kako bistepokrenuli aoe joka Data Source Configuration. Pritisnite Next da odaberete tip podataka, kas sto Be prikazano na sci 143, brite Database pritisnite Next. To vas vod do farobaka Data Source Configu sion ee motete odabrati New Connection slika 14-4) [Gece Deen Sen Cs) _ ‘Slika 14-2, Koristenje ADOManaged Providera atest gramme owt oe eee ee) ‘Choose a Data Source Type ‘Wee neprontesyuih ert cous of 2a] (as yarcorete fret proj true Ske 143, Carbjak Data Soure Configuration {pe odgovarsjucy informac 24 Connetion Properties ao So je prikazan na OLE DB Managed Provider je univerzalniji nego SQL. Managed Provider i mote se koristti 2a spajanje na SQL Server kzo ina bilo koji OLE DB objeke. Kako je SQL Server Provider optimiziran 2a SQL. Server, utinkoviee je korstci2vor podataka ‘jij specifigan 2a SQL Server prom rada s SQL Serverom. Svzemenom, ve bj specializitanth upravjanh tevora podataka ¢e biti dostupan, § Obavezno pritisnite gumb Test Connection prie nego So pritisnete OK, U sjededem PF koraku pritisite,Yes, save the connection as" potvedite Jluchude sensitive data” kao #0 je prikazano na slici 14-6 Bae | Programiaje ce Fogle 1 PistppodacnainezADONET 3 Pp aberte jectal2a meedu podatakaizatim Edit Columns. Uredite zaglavja stpaca ees ‘Save connection sting tothe appcation configuration fe Poe nan sing cnecon ocala Sea caren i mince i emt Soe Foray cores ce rae ‘be youwant tsar the connection te the sppetonconierston he? Dire ove dg paver ie, Slika 14-6, Poranjvanj osjetivah padavaka Bit ¢e prikazan sadriaj objekca DataSet koji ste odabrali. U ovom sluéaj, presi tablice i prosirite rablicu Customers. Odaberite sve stupce osim stupea Region (dab gl ppokazali da upit ne mora vratiti sve stupee) i pritisnite Finish. povldajte podrudje ispod mreze podaraka i vidjet Gere 11 objekea: nr thud ‘ m Gere i objekea: northunavataset, tonexCataConvertor i custonersTablesdapter kao St je prikazano na slic 14-9 Fgh: Frituppedcina ec ADONET | 351 B ovom sluéaju ruéno podeSavate nizove znakova za povezivanje iedabiei onda stva fiteSel0ataAdapter Dataset da uzmete podatke. Zatim poveZete DataSource sv0jstvo aaridview sa Default pagledom tablice Customers koja ste uzeh, Elobodno modete postaviti svojstvo od DataGridView programski ili pofete mijeari osporedivat prstupe, li otto, Microsoft je obevio veliki poxao fakobi vam omogucio povlatenje ispustanje kontrola a-vexe sbazama podataka na fbrazac radi jednostavnijeg medudjelovanja s ADO.NET-omn, deklarativno te odeSavanje DataSet objekta fet precizno konncitati sak Bite sandardne postavke. To moder epektstvaranja Dataset abjekta umjesto da kori re utiniti deklaracivno it programs prethodnom primjeru, kad ste napravilibataset objekt, prose stecommandstring caonectLonstring Selostatdapter Oataaapter = re Sqtanaaprer(emearsstring, contectionstr ing); Di nizovi znakova su interno dodijeljeni objektima sql jedom. Uijesto toga, mofete ekspliitno napravitiove objekte fl sledecem primjeru, dodat éete klas étiri nova ana: vate Systes.Oata.slClientSconnection mConnection; private 5ysten-oata.0aaSet njosasets private Systen-Data,SelCliertSqlanind yComand private Systen-Data sqlCient.Sqldstnaapter DataAdgter; Ske 14-9 fptivanje objckatau podragjn sped mrete podataka Sakic nih predstav objektdiesvojstva motete podest ako So éetega piso and i SalCamnection, i podesit svojstva u prozoru Properties, Programsko popunjavanje mreze podataka i ‘Ako ba inzistrate da ruéno napravite ove objekte, onda ih moze i gno pores sa mrezom podaaka. ‘ Napravite novi Programm icbatabssplay.Promijsite ime cs datotek i obras j prikladno podesie naslox. Povucite DataGridView 1a mjesto, ai iguoriae bom Aetion je napraviena instancitanjem SqlConnectien objektas nizom za povezivanje String conectionstring = “server-(local)\WetSDK;" 4 “rusted Comection-yes; databaseenetthwindy syComection = new Syten.fata-SqiisertSqlonnection(cnnectiontring); Pritisnite obrazac desnom tipkom misa i odaberite View Code s kontekstnog izbor- Baa jcchiplicino corre o v string) nika, Konstrukors dodajte ave redove koda: sComeetion.cpen(); string connectsontring = “serverelocalhost;> + Trustee Comactionsyes; database-northaind”; string comandstring Select Companytone, Contacttane, ContactTitle, * 4 "Phone, FDe frow Custoners"; Jab (0 =20:2ite ovu vezu moti ete ju ponovno upotiebiti (kao Sto te vide sede Be primers) ik eorstt njezinu podrsku 2a transakeije, [EL] Obiektwoatanipter motte doevalt da naprayveu onda ju ehspl- 28 g., tment sena mu poe hontenjem fan (AK satconectisn nycomection = nyAdapter.Comeetien 11 a tae 5 pando 8 Seistndpter nthe = ‘Uiesselbthapter(comanSting, comectonting outlet onset «feu abt Oatadnte F0(Dtaet, weantoners™ Js tim eksplicitno napravite Dataset objekt i postavtejedno od njegovih svojstava: [| staset = now Systen-Oata.0taset(); 1) rovenafe DataSet 5 mzefon sostaset.Casesersith ‘ataGriavded. DataSource = Dataset 13bLs{“Custoners"]-DefaultView; stavjanje CaseSensitive svojtva na true ukazuje da se usporedbama pizova zna- ppv unutar DataTable objekata razlikuju velika i mala slva 382 | Prganirayjece Pogo Pp pdsna aeADONET | 353 Sada cksplicitno napravite SqlComand objekt i dodijlite mu objeks 2a ven i tekst natedbe: nyCormand = pe Systen.Dnta,SalCLien Sloman) tyConmand.ContectonsmyConrection; tyConmand.ComandText = "Select * fron Custoners"; Konaéno napravite SqlDatatdapter objekt i dodijelite mu SqlCommard objet koji ste ‘upravo napravill. Onda uputite Dataadapter objekt kako da preslika stupce tablice, koristetitablicw koju trite i uputite SqlAdapter objekr da napuni Dataset objeke atatcapter « nw Syeten.OntaSqiCient.SalDatatdapter(); Datatcapter.SeleetCormande nyComancs, DatatdapterTabletappings.Add("Tabe', Customers"); Datateapter.Fi11(nyOato5et); Kad ste to naprovili,spremni ste da popunite DataGreView (primjetite da sam ovaj put koristio standardno ime za Oat acrid): dataceldsoatasource= myOataSet Tables “Custoners”] Default Primjer 14-3 sadr2i Kompletan izvorni kod. rimjer 4-3. Prilagodavanje DataSet objetta repion sing dine eeing Syste king System. ColdectSons. Generics sing Systen.Conponentnedel; sing Syston. Ota Using Spsten Data, SqlCLient; eing Syston Dring: : sing Syston Md Fores; ‘endregion sanespace Custonizedotaset ¢ partial class Custanizeatataset ¢ t private systen.outa.SqlcLient SqlConection myConnections Private SyetencOnta Dataset myOstasets Private systentata,SqleLient-Sqcomand syCoanands Private systen.O3ta.sqlCLient SqlDatakapter Oatatdopter; form public Custanizedbataser() ‘ Initia zecnponent() string comectionsteing = "serversloalhast;" + "Trusted Comectionsyes; database-rorthwind"; sytomection + new Syste. ata. sqlClient.SqlComection( connectionstring ); syComectin. Open); 354 | Pogamiane primjer 14-3. Plagodavane DataSet objekia(natavak) 11 Pra Oataset 4 postavtja svojstvo rmoataser ~ nou Systen-Data Dataset); sypataset.asesensitive = ive; 11 Prov Sgicomand objekt 1 doje je 11 wenn 5 iskar select spear =e Sten tts Sgt Sc tycomand.Conrection = eyCon sycomand.ComandTent = "Select * fm Custoners"; 11 ravi ootandapar objkt 4 proslje6yje 11 SQ. Comond cbjekt. te uspostavija presLikavanje tabice Onseddpter = new Systen.Uata-Sqlliert.SqlOstakapter()s Datahaapter.seleetcemmand = conmard Datahaaper. Tablerappings.n "Table", customers"); 11 Gower ehjekty catanapter da point Sataet Datatdapter.FILN( moataSet 1) rikauje gp u medi tatairidvie DataSource = yoatase, fables Castoners),Qefou View, Pogane Psp podina tar DONET. | 355, POGLAVLJE 15, _ _ Programiranje ASP.NET aplikacija iWeb usluga INET Web uslige se prosiruju na konsept distibuirane obrade abog rade kompo rent je metode mogu biti pozvane preko Ineerneta kori8tenjem standatdath proto ola. Te kornponente mogu biti napisane u bilo kojem .NET jeiku' i komunicraja oritenjem otvorenih protokola koji ne ovise o platform. Na primjer, burzin postu itl) moze pruziti Web uslugu koja uzima simbol dionice sa pomicnog prikaza kao paramerar (vta¢a cijenu, Aplikacija moze kombinirati tu uslugu s nekom drugom sl F gom druge rvrtke koja takodes urine simbol dionice, ali vraca podatke o kompaniji Frojektant aplikacije se moze ustedototiti na stvaranje novi vijednost s pomocu covih usluga, umjesto kopiranja iste usluge 2a svoju aplikcijy, Ovo poglavlieopisuje prograsniranje Web Forms obrazaca i Web usluga korstenjem jezika CH, Programeri piu sve vite aplikacia koje se izvode preko Web Razumijevanje Web Forms obrazaca Postoji mnogo otitih prednastitakvog pristupa. Kao prvo, ne morate se bavti deta- ima korisnickog suéela, nego motete prepusii toternet Explorer i ostalim pre. flednicima da obave veéinu posia za vas. Druga, vjerojatno vagnija, ptednos ea je distibuiranje i nadogradivanje aplikacije brae, jednostavif i jetnie. Najvaznija predinos je da se Web aplikacija moze izvoditi na bilo kojojplatformi, od strane bila kojeg korisnika, na bilo kojojlokaeiji, a ovo je tedeiavesti (doduse ne i nemoguee) sa aplikacijama temeljenim na pametnom klijentu *] ASP.NET 2.0 Web Forms obras su asjdhic jako uspetih ASP $8 4, NET 1x shrnca, ots ae ASP mance Cij ASPET 20 LP obranaca fe smanivanye klicine kode 24 70% u odnows na ASP Lx. TeamadajeWebeoganian eve dlr, ane Program to To jest, v deklariae Konto na bran aie egy da pete Ponowno pier) kod _e 4308 wljek posto moguenostpsanja Koda (wijek moteepisati kod), liz vliku vec potreba,pisat ete mnogo mane koda sv ASP NET, 20 nego sax ‘Treéa prednost Web aplikacija je distribuirana obras, iako pameta kljenti (ng smart clients) sve vibe zadiru iu to podruéje. Koristenjem Web aplikacijajednosiurng je osigurati obradu na scrani poslusitelja a Web pruza standardne protokole (na pri imjer, HTTP, HTML i XML) koji olakSavaju izradu vigeslojnih aplikaciia NET tehnologija 2a izradu Web aplikacija (i dinamitkih Web stranica) je ASPNET 2.0 koja u svojim Systen.keb i Systen.Web.UE imenskim prostorima pruda velik broj tipova 2a izradu Web aplikacija. ASP.NET nudi velik bro) konteola i stodnih alata, 4 ukljueujuéi alate za provjeru podataka, prikaz datuma, oglaSavanje, medudjelovaie: skorisnicima i rako dalje, Vecina toga ne zahtjeva pisanje koda. fj Web Forms obrasci imptemeniaju propramski model kojem se Web stance dina- nicki swvaraju na Web posite za dostava pregednikc prebo Interneta, Sa Web Bforms obrascima stvarate ASPX stranicu s manje-vige staitkim sadtiajem koji se stoi od HTML-a i Web kontrola i pifere C# kod kako biste dodali dodatni dina: ith sada), C# kod se izvodi ma poslutitelu, a proizvedeni podac se spajajs eklavranim objektima na stranici kako bi bila napravjena HTML stranica koja se lie naceag pregledni. Pstoje i krviene rocke iz prethoinog odo kojihseercba primi koje tebe mat na urma kroz cielo ovo poplavje: Tema ovog poglavia je preplitanje ASP.NET. i programiranje u C# jexiku a w0j¢ jf iarada Web Forms aplikacija i Web usluga. Uloga C# programera u ASP.NET azo je pisanje metoda za obradu dogada}s koje odgovaraju na akcije Korisnika. Vecina | metoda 2a obradu dogadaja ée ili dodati podatke u bazu podataka ili uzeci podatke iz baze | uginit th dostupnim kontrolama. Za pregled samo ASP.NET-2, pogledajt knjigu Programiranje ASP.NET koju sam napisao zajedno s danom Hurwitzom. * Web stranice mogu imatii HTML i Web kontrol (to je opisano kasnijeu ovomn oglsv) B * Svacbrada se baja na postatiteju(motete mati obradu na strani kijenta korit~ Web Forms obrasci wodi metode braog razvoa (kao 0 suone koristene u Windows tenje skriprni jezik, ali to nije dio ASENET2), Forms obrascima) vrazwoj Web aplikacija, Kao ikod Windows Forms obeazaca, povl fice spustate Kontrole na obeazac i zatim pikete pozadinski kod, KoriStejem tehno- logije Web Forms apikacija se izvodi na Web posluditey, 2 korisnick medudelys 4 ee ib shige mogu,naravno, bit mapizanena ikem je ia bil oj plate Bie Web ustuga su eon glaformi, 2a potebe ove hajige kus emo ve estan Lorene Wek elas psponee NETS i ” niles is Fa op AT ah Mog [3 + Ako koriste ASP NET Web kontrole, ono Sto preglednik vidi je samo HTM | (siznimkom da nekim preglednicima nove generale mogu biti poslane jpeg skespt. Ukratko, Web Forms obraci su napravijen ako da se mogu pregledatis pometabily -ojegpreglednika Weba ako se stvaraju na posluziteju ko generiraispravan HTML od koji je podr2an od strane preglednika. Prograiirane logitkog diela obraca motete obavi u bilo kojem NET jeiku. Jaa naravno kotstitiC#. Kaoi Windows Forms obrasce i Web Forms obrasce moietenapravtiu Notepadi (ili nekom drugom ceditoru) umjesto da koristite Visual Studi. Mnogi projektanti¢e tako i utinit a, Visual Stadio prota mnogo lake natin 2a radu itestirane Web Forms obrazaca, kad korisn pritisne gumb ili odabere opciju i padajuceg popisa ili bilo kako drukéije F pedudjlujes korisnitkim sudeljem, time izazove dogadaj. Dogadai takoder mogu biti Basvan’ od strane sustava prilikom zapodinjanj il prekidanja posla, Na primer, kad yori datorek 2a Stan sustav i2aziva dogads) kad je datoteka tans uw memoria toda koja odgovara na dogadaj je metoda za obradu dogadaja (engl. event handler) F ytesode xa obradu dogadaja su pisane u C# jeviku i povezane su sa kontrolama na P HTML stranici preko atcibuta kontrola, Uobitsjeno je da ASP.NET metode za obradu dogadaja vrataju votd i uzimaju dva oramctta. Prvi parametar predstavlja objekt koji izaziva dogada) Drug parametar, frgument dogadaja, sadr¥i informaciu specifignu 2a dogada), ako postaji, Za veéinu clasp adioautton> role koje se zamijenjyju obignim ATMEL Kodom kad postuitel obradujestranicu, Kad pokreneteapikaci,preglednik prikade trl radio-gumba u grupi. Oznatavanjem jednog,ostali prestaja biti ozeageni si lekt mozete postti povlatenjem tri gumba sVisl Studio palerena obrazag ili S10 fak jednostavaije, mozete povuti Radio Button List na obrazac, suo ce deklarativne jnoZcla onom koju ste uzel iz baze podat aks) i) uredtvanje stavki. Odabir Edit Items ‘wi radio-gumba) praki adio-gumb ima podrazumijevano ime Listem, ali mosete ws jednost u svojstvima Listtem, gdje takoder modete odlutii ko} ppolrazumijevano oznagen, kao sto je prikazano na lil 15-6 #27) Komrolemott dadain snc vedo od rnin ade San [x 4, secs edit njegov tekst tin je aya skojin Kone dodge od oh oa = dns hao Mose Wed detente Dagar fojegst tone poredaneu preledatakotionre ose oo Gionaj Korda ps biste presi iz jednog u dru matin ada, rome east sist dak Menta u Visual Studio NET-u, s fotete popravit i kljucujuél pismo, led radio-gumba mijenjanjem svojtavau prozoru Pi boju, broj stupaca, smjer ponavijanja (okomito je pod! Fano) i tako dae. roperties, razumije acute se izmedu Design i Source prozora da vidite uginak promijena, ka u ikazano na slci 15-7, Pog 1: Programa SET pS Web gn | 565 Speedy Express ‘Slika 15,7. Prebacivene amedu Design «Source prozoranakon dedavanja grape radio-gt 366 | PoganizanjeGh poslutiteljske kontrole |Web Forms obrasci nude dva ipa posluzitejskih kontrola. Prvesu poslugiteliske HTM. B onto. To su HTML kontrole koje eznacavate s pomo¢u atributa runat=Sexver | Alterativa ozna¢avanju HTML kontrola kao poshatiteljskih kontrola je koristenje ASP. NET poslt#iteliskih koncrola koje se jo8 nazivaiu ASP kontroe ili Web kontrole. ASP kontrol st razvijene da dopuneamijene standardni skup HTML konttola. ASP kon: troleosigaravaju dosledan objektni modeli dosjednije nazive atributa, Na primer, ako [eristite HTML kontrole posrojivelikibroj nagina da se obrade upisams pod Svaki od njih se ponasa drugatije i uzima druge atribute. ASP kontrole pokusavaju E yoxmaliziati skup kontrola dosljednim koriStenjem atributa unutar objektnog modela trolama st casp:tadionst Gapschee oopeTextbon rove="s"> ‘aeprTerton r082"5°> Povezivanje podataka Razne tchnologije su nudile programerima mogucnost povezivanja kontrola s poda- & cima tako da, ako bi podaci bili promijenjeni, kontcole bi odmah reagizale na tu promfenu. Ali, povezane kontrole bi imale ogranigenu funkcionalnost i izgledale bi Projektanti ASP.NET-a su naumil rijesiti ove probleme i pruzti niz robustnth kon- BF rola povezanihs padacima, koje bi pojednostavnle prikaz i promjenu podataka be2 ‘revovanja i2vedbe i konezole preko Worienitkog suéelja, U inatici 2.0 prosrili su list povezivih kontrola i prufili vite gotovib funkcionalnosti HU prethodnom dijelu sce fiksno podesliradio-gumbe na obrascu, jedan za svaki od tri i sporutiteliau Northwind bazi podataka. To ne mora bit nabolji satin dase to uci, F Ako promijenite isporusitelie u bazi podataka, morate iznova povezati Kontrole. Ova) io opisuje kako mozewe dinamitki napraviei ove kontrole i povezati ih s podacima u basi podataka, | Motete poteleri napraviti radio-gumbe temeliene na podacima x bazi podataka jer ne moBete znat prilikom projektiranja koji ée tekst sadr2avati gumbi li koliko gumiba 6c biti pottebno. Da biste 10 postigl, povezat écte RadioButton! ist sa izvorom podataka. esl :Fogamtanje SENET apa iWeb sgn | 367 Napravite novu Web stranicu DisplayShippers i povucite RadioButtonList na ob 2ac. Ova) put, umesto odabira opcje Editten iz Common RadioButionList Tas petite Choge DataSource Orta se ills kit Chovee Data Sour ti naslici 15-8. Cees = Slka 15-8. Oda ievorapodataka Pritisnte padajulizhornik Selecta data source iodaberite , Dale te bate odabratiizvor podataka iz tipova podataka u vagem raéunalu. Odaberite Database tvara se dijalotki okvir Configure Data Souree, kao Sto je prikazano na slici 15:9 ‘Sta 15-9, Korfigurianj ievora podataka 38 | Pagraminje ce vlaerte New da konfigurirate novi izvor podataka i otvort ée se dijaloski okvir onnection Properties. Odaberite ime poslusitlja, kako se Zelite spot na poshuztel me baze podstaksa, Obavezno pritsnite Tese Connection da testirate veau. Kad sve fade radio pritisnite OK (shika 35-10), ESika 15-10. Konfigurivanje swostava veze PXakon toga svojstva veze Ce biti upisana u dijalo8ki okvir Configure Data Soutee. Pre Byledaje ih {ako su u redu pritisnite Next, Na sjede¢oj stranici Earobnjaka dajte ime i (na primer, NorthWindConpectionStr.ng) ako ju Zelite pohranici u konfiguracjsku otek koju éete moti ponovno koristiti Bad prtisnete Next dobit ce priliku da odaberete stupce koje Felite uzetilizadate QL deklaraciju ill pohranjenu proceduru za uzimanje podataka, (Ovorite padajuei popis Tables i odaberite tablicu isporutitelja. Odaberite polja Ship- FyexD i Companytage kao Sto je prikazano na slici 15-11, Kad ste vee ovdje, mode pitisnuri AdvancedOptions gumb da biste vidiel koje vam druge pei dastupne. fPriisnite Nexe i testirgjte upit kako bi provjerili dobivate Ii matrag vrijednosti koje Eotekujete (lika 15-12), Pega 1: Pregame SET apiaaiWeb usa | 369 —————_—= 2} = pe | ae ware plja sa Gontrofon adio-gumba i Eiko 1543 ‘Slike 15-11. Konfguriraneevorapodataka F Modete poboljfati izgled i osjecaj radio-gumba povezivanjem sa tablicom Shippers. Odaberite popis radio-gumba i postavite njegoue svostva u prozoru Properties, Ispitivanje koda Prje nego krenemo dalj rebate obra panna nekoliko svar Kad pritsnere FS da pokrencte aplikacia, ona se pojvjeu pregledniku Webs i vide se adio-gumbi prema otekivanjima, Odsberite View ~ Source vide Cte da je pepledniku poslan bien HTML, kao 30 je pikazano na slic 15-14 ‘Primjesite da HTML ne sade2iRadioButtonl ist. Kod sad tablicu sa éeijama unutar kojih su standardni HTML ulaznj objekti i natpisi. ASP.NET je preveo kontrole koje jedodao projektant u HTML razumljv bilo kojem pregledniku, loner kovisnk moe naprvitporuk koala kao van SHEED) voralctrass alu koe para vjednon pl hoe nik nie Acta obranaeTo ma mode omoquct da odsbere ops Koj ie onidens in rine, ees potene kup hk epee $lonamieran SQL koe, Tabet pesca eprein lean Joint podataka La 5a primar kjucet a HTML kod ese Bate pobrinun de ono pm od kerk ne bude grain na one oj predideno dbpocem. a ie informac sigungsm, thanjine w NET pogledje sonic htm mitsoftcomt Saw Slika 15-12, Testvanewpita Sad je vijeme da RadioButton ist povedet sizvorom podataks koji ste upravo nape vill Radieduttonist ¢popat vecine pops) pravirazliku izmedu vrjednost koja ce bik prikazana (na prier,imena tvtke za dostavu i vrijednost tog odabira (a PY inj identfkatoratvrtke 2a dostave). Postavite ova pola u Earobnjaku koristetp jue popis, kao Sto je prikazano na slici 15-13. Torii a Pelanje1SPegrmiare SENET aplago Web suga | 371 rogaine ‘Slka 15-14. HTML kod koji ASP.NET Sale preglednit. Dodavanje kontrola i dogadaja Dodavanjem jo8 nekih kontrola mozete napraviti kompletan obrazac koji korisnici ‘mogu upotrijebit. To éete uéiniti dodavanjem prikladnije pozdravne poruke (,Wel- Fie Eat View Ferme Ted tb -— OHO BBE Powe Yormm @ A a Broborarm ~ el Paecards Ween NontWvid ten] OSpensy Bess (Ue Package OF ne Strong Shope Ba Page Languagen"CA" Conplekithe"Shipper.aspx.cs! (asshome Shipper aepy” > INOCTFE end PUBLIC "-//N3C//0TD XHTML 1.1//04° Ent. o7g/TR/eneML/ OTOP > come to Northwind"), polja 2a ime korisnika, dva nova gumba (Order i Cancel) i reksca koji osigurava povratnu informaciju prema korisniku. Slika 15-15 prikazyje gotov obrazac. (Ova) obrazac ne¢e dobitinikakvu nagradu za dizajn, ali njegova upotreba Cerazasniti. 3 ad ruate"server"s ‘titleschoose Shipperctsties velik broj kljuénih pitanja o Web Forms obrascima, ‘jestina (Kao to je poducavanje) 22 koju svi mislimo da posjedujemo, ali samo nekolicing vo talenticanih to radi dobro. Kao programer ‘nam svoja ogranienja:piem kod, anetko drugi ta kod siesta na fore i Pn ‘table style width 8) sikadnisam upoznao programe koji mis dane mote napravicisav- eas Eg 4, sere korinicko sul. Lstovemeno, nian kad upoanso progr: * 41 inera koje to inveo. Oblikovanje korsnitkog sues edna od ons wn te craspekadstutionList> Top satan bat asource’ LECT [Shioperio}, (Conparyhone] FROM (Shippers)" annectionstringe SES Conect onSerngsWorthMndCone rasp sgtasources
ctdscasp:button ID=tbtrOrder” furateserverText="tnder™ /> Steve: batton TDe"bteCancel” Rs al" Poets ‘td colspane"2*>csp:tabel 3és"IbIteg natsservers¢/aspslabel> cit rubles citer “bed ‘eel> Kad korisnik pritisne Order gumb provjerit éete e li korisnik unio svoje ime i pruft povratnu informacija 0 odabranom isporuéitelju, Zapamtie, prilikom projektirania the mozcte znati ime wsporuitelja (one-se wrima i baze podataka) pa éete upadgjucem popist morati provjeritiodabrano ime (i identifkator. Da biste sve to postgli prebacite se u Design natin rada i dvapur pritisnite gumb Onder, Visual Studio ée prikazati stranicu s kodown i generirati metodu za obradu dogedaja za Click dogadaj gumba. Da bismo pojednostavnili ovaj kod neéemo provjeravati je li korisnik pine ime u polle za tekst. Za vige informacijao konteolama 2a pro s vjea koje ovo olakdavaj, pogledatekrjigu Programiranje ASP.NET. Dodajte kod za obrad dogadsja i postavite natpis taka da preuzme tekst iz pola 7 tekst te teksti vrijednost iz Radio®uttontist: oid toOrder_Click( object sender, EventArgs ©) t obfog Text « "Thank you * + tathaneText-TrinQ) +". You chose "+ shippers. Selected{ ten. Text ToString() +" whose 1D is" Shippers. Selectedialve TeSteing()s ) He | Regaine cad pokrenete progtam primijetit éexeda nijedan od radio-gumba nije odabran, Pove- epaniem popisa nije odiedeno koji gumb je podrazumijevano odaban. Post vise B ,acina kako to zacbiei, ali najlaksi je da premostite Onload dogadaj i postavite prvi tjo-gumb da bude odabran, ate sna Shipper asx. ip protected overtide. Vide dt popissvih metoda Fraga premod,sitoa take dale, ao se kareena L vote penne Colshippars | Orbraaed (openers) eistipgars |@amrd sont) endo ean ea) |R oameaccrte Som 1 ‘Seanoaltramewee Slka 15-16. Premosevanje dogadaja OnLoad Poteitetipkati OnLoad ikadjeistaknutopritinite Tab. Bir éenapravijen kosturmetode, F ali njegovo podrazumijevano tijeloizbacuje Nt Implenentedéxception iznimku Obritie inimku i zamijenite jw s kodom: F_relshippers.selectedindex Go odabira prvi gumb ie RadicButtonList. Postoji problem s ovim rjegenjem. Ako F pokrenete aplikaciju vidjt éete da je odabran prvi gumb, ali ako odaberete drugi (i F treti) gumb i pritsnete OK, vidjet €ete da je prvi gumb ponowao odabran, Izgleda da ‘ne motete odabrat nijedan osim prvog. To je zo Sto se svaki put pri utitavanju stra nice iavede Ontoad dogada), a u to) metodi za obradu dogadaja ponovno postavljate _dabrant indels FCnjenica je da Zelite odabrati ova adio-gumb samo prvi pu ka se stranica uta, a ei kad je vragena natrag prgledaiku kao rezulla priiska na gumb OK, Da biste a rijsili odabiranje prvog radio-gumba smiestite u J deklaraciju koja pro sjerava da lie stranica vragena! pitted eerie vid eit «) AF ( rTePostback ) shippers. selectedInex = 0 Pog 1:Pogramianje SPR web a | 375 Pritsnete OF stanie bi poslana posllBtehu na obradu(adese nv etodaza Primi 15-2 Kod obrasca za Shipper asses estat) 1Shippers.Selectedtndex « 0; ) } old btorder Cick( object sender, Eventargs ¢ ) riers gt YOU "+ ethane Text. tent) «*. toy tose * ¢ relshiopers SelecteditenText.ToString() #* whose 10 te Shippers. Selectedialue.Tosirin eee ed a 7 serine; ie eat wer Forrie Teak bab Ox - DF DAA Pow verom @ BS on Geese = ‘ik yo ee Lit, You cnt Tate Paap whose Dis? nem bilo kojeg. NET progra Web uslage mogu scvaratijednu natemelju drupe, juénog svojstva Weba. Stvaranje nove vriedn ctkeivanjem veé poznatih stvat. Popis Web usluga koje mo @ "eoernniten. Trgovina knjigama bi mogla omskog jezik. Projektanti koji rade oristeti prednost povezanosti kao sti uzima prednost nad ponovnim ‘Slka 15-17, Korienikovibor Je satwwan pi vracanjustranice Kompletan kod obrasca je prikazan u primjery 15-2. Primjer 15-2. Kod obrasca 2a Shipperasp.ce asap System; sing Sytem Data Sang Spsten-configastion; sing system Texts sing ysten tes sing System eh Security; thing Syste eb Ut, ting Sent entry sng Syston es UL bones Pat; sing stench UL Mtnlcoteoy etna apikacia mote povezati ushgestotina maniih Web: uslugaizcjelogsvijeta. To Nebu dae nova dimenziju: ne samo da se doa i q ju eazmjenjuju infromacij, veé sei Potivaju metode iizvode apikacije, SOAP, WSDL i otkrivanje 1 7+ radu Web usluga potreban je jednosavan,opeepiheaéen rotokol za iclaganje £ ! osivanje metodo Web aslugs Simple Object Aree een (SOAP) je predlozen public partiat class Shipper aspx a eee eo Ors pogle na SOAP fe unclike RPCorjenian i apa, SOAP" Pov met ge 180 o.NET tao ohrabre projeksnce da korine inane Se por, i NET ahietuampometes ea AF ( MTspostgack ) spanjevocima na Udicnom aches c 6 | toenken Pole 5: Pani PNET aia Web ogy | 307 ‘World Wide Web konzorciju 1999, godine. On ima prednostjerjewtemelien na XML ors standard komunikaciske protokoe 2 Invern. a a (0c 1998, godine pojam SOAP je prestao neo peedstaja hog cogs € objet w nani 2avacava, SOAP nema vezes objektima, vee HS rahe ae sa slanjem poruka. Druga, novia, promjena je ievedeninaziv: Service Laan ‘Oriented Arehiteceure Provoc! ee SOAP je jednostavan protokol za slanje poruka koji se temelji na XML-u, HTTP; a SMTP-u, Za klljent koji koisi Web uslugekoie podrBevaje SOAP potetna saline bavezna,o$ de procokoa: opis metoda koje pra pojedina usluga a koje kien mong razumijti Kors te opis svih taleih usluga dastupnih na pojedino} Web lokaciy URL. NET kostur pra pri od ta dva opsas pom jezika Web Service Desrp tion Language (WSDL) koje twrtka Microsoft razvila zajednigkis IBM-om i druging WSDL je XML shema koja se korstza opis dostupnih metoda Web usluga i. njenog sue F Vial Studio NET stvarahostur Web uslige i prutaprinjer metodeushie Kou : a smote zamijenit vss kodon, ko Sto je pikaean u prince 13-3. Podrska na posluziteljskoj strani Sra pod potrebna za izradu Web ushaga se nalazi unutar INET kostuc prt je ase unutarSyoten seb. Services imenskog prostra. Irada Web uslge ne zt Ewing spten; Jeva od vas posebno programiranje Vi samo trebae napsai kod za implemencac, fi Senter dodati [deb#ethod attibur i pustti posluzitelju da obavi ostalo. O atributima se deta. eee eaeaa nije govoriu poglaviju 18 B (webservicebinding(conformancelains-Wrilains.8P20,tatConformance lates » toe) _piilic class Service systemic, Services stebservice [ ” Podrska na strani klijenta Web uslugu koristie pisanjem Klijentskog koda koji se pona’a kao da kommunicira izravno s lokalnim objektom, ali koji zapravo komunicica s posluzitelem ito preko posrednika. Posao posrednika je da predstavlja postusiteja na klijentskom raéunahy, dda zapakira klijentove zahrjeve u SOAP poruke koje se Sal poskiziceju i da prbai odgovore koji sadrEe eezueat, (nebretha) public string Heltowori() { return “elo Worle"; Da biste od tog kostura dobili kalkulator,zamijenite HeLoWorld metodu sa pet drugih ‘metoda; Add(), Sub(), Mult(), Div() i Pow(). Svaka uzima dva paramettatipa dovbl- iavodi traZenu operacij i viaéa vrijednostistog tips, Na primer, evo koda za izraty navanje zadane potencije broja: pli debe Pande dade 9) Izrada Web usluge Da bismo ilustrirali metode za implementaciju Web usluga u Ci jeziku koristenem ‘qasa usluga NET kostura izradit emo jednostavan kalkulator i onda pristupti ne govim meiodama preko Weba ouble zetval for Cint 1 o:4'¢ y-sitee) c retval > return retvals Podnitesa zadavanjem Web usluge, Da biste co utinil, definiraje klasu koja nasjeduje ‘od klase System.Web. Services. Webservice. NajlakSi natin da napravite ovu klasuje de ‘oworite Visual Studio inapravite nov C# Webstranicu, Udijlu Templates odabeite ASP.NET Web Service i Web uslugu nazovite CalculatorWS, kao So je prikazano na slici 15-18, Se | Pogamiane Pox 15 Posten ASPAETapliaja iweb wg | 379 Dabiste idol svaku od tih metoda kao Web uslugu samo dodajte [WetMethod trib prije deklaracije svake metode. (Wetethod] Ne rebate izloditisve metode klase kzo Web usloge. Motete odabratimetode dodava. ‘jem [WebMethod)atribura samo onim metodama koje Zeit izloit, To je sve Sto trebate utiniti -. NET se brine 2a ostalo, WSDL iimenski prostori Vata Web usluga koristt 6e WSDL XML dokument da opige krajne todke koje su dostupne preko Weba. Unita bilo kojeg WSDL dokumenta moraju biti koriten XML imenski prostri kako bi ktsjnje coéke imale jedinstvena imens. Podrazumije ‘vani XML imenski prostor je httptempuriorg, ali to éete webati promijenit pie ‘ego Sto Web slug utintejavno dostupnom. -Motere promjniti XML imenski prosterkoriStenjem webservice atributa [nebservice( anespace= tp fae ber tyhssaesates.con/meservics/*) Ne ofekuje se da se na ovo} URL adresi nalazi dokument. URL adrese se kotste jer su praktigan savor jeinstvenih imena, Primer 15-4 prikazuje kompletan iavorni kod za Web uslugu kalkulatora Primjer 15-4, Web usluga kakulatora sing systen Heb; ‘Sing Syston eb, Services Using Systen. eb, Services. Protocels; [Webservicebinéing(ConfornanceClsins-WsiClains.8P20,EnitConfornanceCains = t2¥e)) public class Service ! Systenskeb.services Hebserice { [weet public double Adi{ double x, double y ) t return x yi } [Webretho) public double Sub( double x, double y ) ‘ return x yi ) {weorettos) fublic double Mult( double x, double y ) ‘ return x * yi 580 | Pegamianie injer 15-4. Web usluga kallulatora(uastavok) F [wtnethed) public double Div{ double x, double y ) return «1 ys By | [utetoa) public double Pout double n, double y j dle retvat = »; eee ee Testiranje Web usluge Ako pozovete preplednikizvodenjem programa u Visual Studiju NET vidjetcete auto # matski genericanu posluzicelisku Web steanicu koja opi 5 # peikazano na slici 15-19. Ova strani indaceaine Wahoo ia je dobar natin da testirate Web uslugu iL Sia 15-19 Prkas teste stronze Web wage Odabir metode vas dovodi do stranice ko} fpozovere upi Bic 15-20, ja opisuje metodu i omoguéava vam da ju isivanjem parametata i pritiskom na gumb Invoke, Sto je prikazano ta Pog 1S: Prograicanj SENET apiacWebesygy | 381 Q- © DBE Pus trem @ BB @ ee ite a Beowron- rors» Dian ive Glifees ~ lie La Wine Eons ‘Slka 15-20. Testranje Bow) metode Web slyge ‘Ako upifete vrijednost tu prve pole, etiei u drugo polje i pritisnete tnvoke, zatazit Gere od Web usluge da tri podigne na Eetvrtu potenciju. Rezulrat je u XML stranici koja opisuje izlaz, kao Sco je prikazano na slici 15-21, eae ES Fis tat Vew Fortes Te HED 2 | Gee ODDO Pawn ferme O/B B ‘oes ip aie iorieaeanvaevieamnis 9) Jon Qecrten = rmere Stk 15-21 Posivanje Pow() metode Pregledavanje WSDL sazetka Puno posla automatski obsvlja umjesto vas, HTML stranice koje opisuju Web ustugu J njene metode se stvaraju i ukljutuju veze do stranica na kojima se metode mogu testirati 32 | Programa? F sve Web usluge mogu biti opisane u WSDL datotekama. WSDL d B viet dodavanjem nastavka ?WSDL. URL. adresi Web ustoge betpr/Nocathost:i9975/Caealatort Service, sens) lokument mozete Gre BLA Pen Sm Ou 4 av ie Rito Seaver Sheaie ioe ee” ‘Sika 15-22, Pregled WSDL satetka 4 Desali WSDL dokumenata su ivan dometa ore kj, al moter vided a matte vie dae aka }§ etoda porn opsanaustukioroom XME Erman, Toje ines pease ie a cd ‘bi omoguéio klijentskom ptegledniku da pozove metode Web usluge na F posttiet F Stvaranje posrednika Pri nego napraviteklijentsku apikacju za medudjelovanje-sa Web usfugom kalkula ora, pevo éete napraviti posredniéku klasu. Da ka¥em jo8 jednom, to modete utiniti esl 1: rogramianje ASNT pace uiege | 38h rung al to bi bio tetak posao. Programer iz Microsofta su napravili lat wsdl kj stvara izvorni kod 2a postednika temelien na informacijama u WSDL datoteci Da biste napravil posrednika, upsite wsdl u Visual Studio odzivnikui zai putany do WSDL sazetka, Na primjer, mozete upisat: wil hetpe//localhost:39975/CaleulatortS/Serviceasevsdl Rezultat je C# kijentska davoteka Servcel.cs Gj se odlomak pojavive u prinjery | 155, Prinjer 15-5. Primer kijenthog Koda ta pristup Web uslehalkulatora 11 castogenerated 11 This code was generated by 2 tool U1 Ranting Version 1-0.20607-16 1 Changes to this File may couse incorrect behavior ang Ui wll be lost Sf the code Ss regenerated 11 clautogenerateds Wooo sng Systen; sing 5ysten. Cnponertodel; sing Systen Diagnostics using Sytem eb, services; sing Systen Web. Services. Protocols; Using Systen. An, Serialization; a 11 This Source code was auto-generated by wsdl, Version-2-0.40607-16. uw 111 scematks> [syster, agnostics Debuggerstepthroughattrsbute()] [system ConponentageDegnerCateporyttibute("code")] [sytem eb, services MebServiebindinghttribute(lone="Sarvicesoap", Namespaces "het //empuri.org/")) pubic class Service t systen heb Services. Protocols, oopttgClentFzotecol private syste. threading. sendorPostcallback Adtperationonpleted; private syste. Threading. sendorPostCallback Sutoperaioaonpleted; private syston Treading. sendorPostCallback Mltoperatoncorpleted; private Syston Tneading SedocbostCaback OilpertionCopletes private Syston. Threading. SendorPostCallback PoperationCnpleted: 1 zon pubic service() ( Ba | Proranianje Prinjer 15, Primjrkijentshogkoda ra pristup Web usu kalkulatora (astavak) ‘this.Unl = “http: //locathost:s9575/Caleulatoni Service. sex"; ) 11 scoot pic event AddCompletedéventuandlersdéconpeted; 111 rematksl> public event SubconpletedFventlindter Subcorleted; 111 crear» pblic event MultComletedtventandier Multcompleted; 111 cxenacks/> pubic event OivcopletedEventiandler Divcopleted; U1 cxnaresl> public event PoxConpletedEventandler PowConleted; U1 ceeathsl> [systen.Meb. Services Protocols. eopDscunenthethodtt tribute (Hp: //Rempurs. copa", Requesttanespaces"ttpe teapot or” Tesponseanespace="htp:/itempuri.org/"s . Uarsysten Keb. Services Oeserption Soap ingle. titera, Paraneterstylessysten heb Services Protocols Saptoratecrs public double Add(doble x, double y) ( een ject[) results » this.Imvoke(“Adl", now abject) { a return (double (reslts(0}))s 1 cents blic Systen.tAsyncReslt Bepinkld(duble x, do ston Lose een bey, Systen-AsyeCallback callback, return this.bginfnvcke("Ald, new object() { ; vhs callback, asynestate); 1 oom bt te tnssten. thet syne coject{] results = this-tenstelasyctesuityy seta (dee) ested 11 cxenattst> Public vada aidhsync( double x, double y) { Asse ym 111 exer pte vis Aecnble x doe , cece vst) ‘Af ((this.addoperationCompleted = aull)) { 7 ese 1S: PagramianeASPNETapagaiWebushaga | 385 Primjor 15-5. PrimjerKijentskog oda za pristap Web usluzikallatore (eastousk) ‘this AddOperationConpleted = seu ‘systen-Threacing. SenaiyPoatcal nock( this. OnkdOperationtoepleted); } mis Irvotetsyne(“A46", a abject ho thts AddperationCanpletes, userstate); private void OntasoperationConpeted tee arg) ¢ IF (Canis. Aadcrpeted t= mal) { Syeten eb, Sesvices,Protocals. InvokeCopletedivertAres invokeArgs = (( System Mey, services Protocols 1WvOkeCompletedéventArgs) (on) this. addcompleted(this, ew AdcConpletadventAegs{invoeetres Results, [pokehrge Error, snvokeAeps-Carcele, Snokenags-Userstate))s, U1 erates (Ovaj kompleksan kod sastavio je WSDL alat 2a izradu posrednitkog DLL- potrebnog 2zaizradu klijenta, Datoteka koristi pune atributa, ali sa va8im poznavanjem C# jezik rmotete donekle shvatiti kako neki od njih funkeioniraju Datoreka pocinje dekfariranjem Services klase izvedene iz SoapittpCllentProtocol koja se pojavljueu imenskom prostoru Syston. Heb. Services. Protocols: ablic class Services + Syston heb. services Konstruktor postavlja URL svojsivo naslijedeno od SuapittpClientProtocel na URL asm stranice kojy ste ranije napravil. rorocls.SapltpientProtocal Deklaracija metode Add() ukljucuje atribuce koji osiguravaj SOAP podrsku za ive fsbo t9n1826504/iste> dsbroon30461934/isb0> ‘stro 53185593 b> ‘sorponpeenz214sbr> ‘ses en007063/3sbn> ‘str 286r00gs8.r3st0> stesogrzneanc sb ishoosp600i819¢sbn> ‘isbn9798642897¢sbr> ‘sb 073s612900(/isbr> cisbrsosgoanensc/sti> ‘isbnosg6003765(/istm> cisbmgraamastciste> Fogo 1:Sasananjeugeine | 391 Primjer 16-1, CSharglSBN xl inastonak) Primjer 16-2. SalesRonkDBWebServices (nastavak) ctsbmosraassaic/isin> “isbmo35556836/ 33612 ‘hebene20n7205556/ 5609 1 Stvara abjekt veze 4 inicijabieia 11 ion 23 poverivanie- ae Spent SlCliet.SlCanectio( comecticstrig }s 42) Nesavno, problem je sto ove datoteke Zesto bud zastarjele (neke knjige 1 Sana Slmand objet 1 piu ves 4g 4. Swasprolane aene potans dostupne Ries cemo ga kes rw Syste. ata, salient. Command); ‘ovom poglal. comand. cenmectson * connection; tineenaining = 3; // Kad se p14 put pokrene urina Snforacsie. Dok se uditavaju ISBN brojevi traze se relevantne vrijednost! (naslov, izdavat, pelosi) aoe ‘na Amazon Web stranicansa spremaju se u tablicu baze podataka. Jednostavan pad judi popis se tada aZurira kako bi se prikazao napredak. Kad su sve knjige unesene, sustav postaje neaktivan dok ne protekne preostalo vrijeme izmedu sesija. Mozere zapoéeti novu sesiju pritiskom na gumiba Now. Korisnigko suéelje fe namjerno napa vljeno Sto je moguee jednostavnije private void binstart CLick( object sender, Sventhigs © ) 11 weajaoe njerat veenena \peateiner. enabled = updateTiner.Erabled? false true; Primer 16-2 sade cijela aplikaciu iza koje slijedi analiza, ine Prinjer 16-2. SalesRankDBWebSersices ‘region Using directives private void benbonCick( cbject sender, Eventaags © ) t using System; tinetnaining = 25 Using SystenCobections.Ceneric; Using Systen.Conponentodel; using Systenbata, Using Systen, Drawings Using Syston indows For iat wit wean } btostortText = opiateTiner Enabled ? “Stop" « "start endregion namespace AmaonnebserviceClient ¢ fartial claee émazeiebservieeCLient ¢ Form private vod upéateTiner_Tck( object Sender, Eventigs © ) 16 ( upeeriner Enabled } ‘rtclock Text = ( =-tUneRenaining )-ToString() + * seconds"; ase ‘tetClock.Fext = “Stopped”; private int tinteainings Eons tine = 50) /7 5 nit frit string comectontgs : tivte system eto sehen qcorection conection: ae Prone Systenta salient Slcomand eo Beets eubticsnzebservceiet() ineensning = sittin; reset the clock 1 Pe sap pdt va twee eta tat ont» on Uta) Sestst tei “ape St"; vitializeComonent( ) private void AnzonenserviceCLiem Load tect sendes, Poenttsgs © ) 11 broka kor datoteky poziva GetInfotromsey 23 17 sks pronadent TSE bro} 1 wiz zs poenivane tron Sales fark Catabse on Lo ee foreach ( DataRow Book in BookData,Tables[0].Rows ) ovoectionstring = *server-Loalhost; Trusted Camecto raytatabaseatencssalestals" FR | Pogamiane Primjer 16.2. SalesRankDBWebServices (astovak) string sabn « Booka} Tostring()s GetintorzomiSen( ison, "ASCNET" 5 arate oe eC Bockoata Reaaal( “esharplsbenal” foreach (Batafow Soak in Doodsta.Tables|o} Rows ) © stg sto» posto}. resting GetantorroalSeN( isbn, “SHARP” } ) fede norte ookData Rendtal(“VEnetisin.xnl” ); foreach {Daten Sok in BosDatafbles0] tows ) string Ssbn = Book{o) Tosteing()s GetintorsontSen( sho, “VINET” , ) , private wold CetTrfoFroalSON( string isbn, string technology ) ‘ iF ( isooength ts 20 ) sProductOata productOata « new ANSProductata(); estos lookup = ralls « tomokuptequest req = new LtenLooeipequest()5 eq. 1otype = TentookupRequest1oType,ASIN; eg Stemtd = nee s22396(115 rea. Tteatal0] » iste 11 eq Searehndex Books; leokap » rau TtenLooki() . loka esoctatetag = "1ibertysssocia00t"; eokup,sobseriptionla = “Oshg59SZV6OV32KE2R2"; ookop-tequest = naw TeentackupReqvest];, eokup-Reqest(0] = rea, i {teh ( Syten-exception © ) nistatus Text = e.Hessopes + eentoolptesponse responses {tens info, ‘ten|) item; Ten iter; 39) Prpanianiece Boe inj 16-2. SalesRank DB Webservices dastavak) int salestark «1; string author = string tty; string pubtte » stig. topty; string publisher = sccing tty; string Ltle = string. Emly, String SARL» stesng pty ty ‘ response « prodvctOata.Ttemoohup oo info = response. Itensf0]; tens «infor Tten, salestanc = tten.Salesank o» ull 2-1 + Convert. Toneya(iten,Selestonk); author = Fiduotes ite. Ttemttributes-latee[o))s pubbate « Fintuoes{ Sten JtemttribtesPblieatodate); (blisher « FlaQiots{iten.Itemttributes bliseeese title = Fixquotes( ite. Itenttttutes tition SUR ten. DetailPgettt, up ); ) Exteh (systen Exception ex) t Irstatus-Text = exsessge; 11 weurira pops string results = tithe + by "4 autior 4 Publisher +, * + paste + * Rane bots. teens -add( yesulte ); Ibovtput:selectedtnex » Ibviput. tens. count * solectons 17 Reuria buoy podataka sting camondirg = €"psite Sook set isto « sles title ttle sty pba pices 0 pages aie a Syetendatetie ton +, Sita 28 omen mane «cmt 1 Bh nein se nije pore, ow fe nv tape enero en > ™ I htofected = cing. estetnaey(s Af ( unRousaffected == 0) 0 i CominStg = Inet tata ato ates (* ¢ Jobo tle eral Cnt oy poate oo, agus same ee oy Peale Sstaaneu cei | iss rinjr 16.2, SalesRankDBWebServices(nastaval) f Primer 16-2 Sale RankDaNeRSores ijabla tineRemaining je inicijalno postavljena na jednu sekundu, a gumbi su azuti- fan dz postave tekst na gummbu Stat: ‘Syston. Dateien + were tecielogy + tinelenaining = 2; // ad se pokrene, wind inforwacie, + author + ° eonind.ComrandText = comandSteing: ‘tonandErecuteloruery(); , fateh ( Exception ©) aki put kad mjerat vremena otkuca poziva se updateTiner_Tick metoda. Ako mie fapnt vremena radi (Korisik nije pritisnio Stop) varijabla tineRenaining se smanjuje ra Fedan. a kad padne na nulu, vrijeme je za obrad statue. Test = ex.hessage; 4 Wowtput. Tens, A4d( “unable to update dtabase!” )s Inoutput.Selectedinder » IbOutputItens. Court - 33 4 ( updateTiner.crabled ) sprtleckert = ("inten Testing) + * seen ; TetClock Text + "Stopped finally mee © emection cose}; 11 Citi eames! ) ) (1 aaevarena 20 cettnforroisin i korak je da se mjerat vremena postavi na vijednostaitTine (konstanta jednaka 15 minuta) i da se obrade xr datoreke: |, tinefesaining = vaittine;_ 17 fesetiranje sata ataset Scola = ney Dataset): ty private string Fixquotes( string s ) ‘ (ss mull) return string. €apty; retuen steplace( """, ookdata.Readtal( “aspnet_isbamtl*) ) ) 17 aaj Kase acre ware se skup podataka u kojem svaki red predstavja unos u XML datoteci, Kad su f nlgeuetane, uzimatesvaki [SBN i pocivate pomocn modu CetnfotoeTSB pro Esjeduiet joj kao paramerar ISBN i ,tehnologju" pod kojom ée bro biti spremjen fhozu podatake: {o0 Onan fo in Boots bso.) sting ssbn = Book). tostring(); GetInfoFroeSEN( isbn, “ASP }; Program zatim deklarira nizznakova za povezivanje,ajedno'sa SQLConnect oni Sqn. rand objeatima kojiée bit iniijalizirani kad se obrazac uéita private string comectionstring peivate Spsten.oata.sqlCLien,SelCamection conection; Private Sjsten.OetaSqClientSelGamand comands Motete postaviti Load dogadajpriiskom na obrazac i prebacivanjem s Properties na Events, Dvaput pritisnite Load dogadaj i kostur metode za obradu dogadaja utitars- nia je napravlen za vas. Unutar metode stvorit éeteniz 2nakova 2a povezivane (4) 4 primjer koristi pouzdanu vezu i moda éete moratiupisati korisnitko ime izaporku, 4 ‘ovisno 6 tome kako je baza podataka konfurirana) ada €eobjekti za povezivanjei naredbeni objet biti konfigurian p horstilasegularan iraz kako bi se osiguralo da ISBN sadrZi devetcjelobrojaih private void AnazorseServiceCLient Lood{ object sender, Eventargs © ) g riednost za kojihdolaz ili cjelobrojna vrjednost i slovo X i onda bi se invela pro. efoFroniSéN je srce programa ~to je dio u kojem kontaktirate Amazon Web Ser- ceonectionstring = "Serverelecalhost; Trusted Conaectianctruejdatabase-snazenSlestanks"; occas gpiacon.cs datoteka definira veti broj korisnih objekata. U primeru éemo koristiti exit {te Ota Sallie SlcommectioconectLnstring ProductData, ItenLookup i TtentookupRequest kao i Item objekte i kolekcije, Evo ew Syston. Oat. Sql ient.SqhCannand(); cenwang.Comection » conection; Festa 1 Sstfanjew eine | 387 386 | Pograianie ‘ad mo%ete postaviti lokalne varijable da pribvate vijednosti koje ste uzeli, Fixguotes ‘petod Je pomocna metoda za peetvatanje eduastrukih navodaika u primllenom nizu prakova tako da ne stvataju probleme w bizi podataka: saestank « item Sales» pull <1 : Convert Tota32(stonSoesank); Saher = Febanter, em ttemateibutes dthor{el Ye abate - FLxQutes( {ten Atemttributes.Publicationate); polisher « Finqotes(iten Itentttributes. Publisher); Ele = Fbidvotes(iten.Ttenttributes. Tite); SRL = Men DARL IPAREER probuctdats Yajise ponasa kao postednik prema 1. Deklarsajte nov instance AProbuetoak2 Has ectar ispravio iniijaliziranu instancu Tres ook 5. Unite HtentookupResponse objekt vt tadvojite ple Tens iis unite rv obekt aml 3 eH 5, Pogledst Ten svojstvo tog Ites bjekra 9 0je pallets objekata eee ev en pol i zjegs vue sve informacion! Kokeste teal Kat imate ov inforrnacie spremni ste atuirati padajuei pops, Sto je Vatnije a2ur- Gc baru podataka, pro napeavitinstancu TenLonkupeiest jeg Type Prilikom azZuriranja baxe podataka prvo ete probati Update ickaz, Ako je bro) zahvaée- rip TtentookupRequest IOType. ASTI sin redova jednak nula, red jo8 ne postoj u bazi pedataka pa Cte unijet vrijednost Da bi ove radio, morate Gvojatvo postavi a enue : st req = new TtenbookupRequest()5 eer Sastre Initiate njegoxo Ttenta pale da pata je most tog niza na ISBN kojeg 32 seq stent «oe string]; eg feentafa} = Ass Program bi bio sigur kada bist kori parametrzirane pice. Upic 45g. 0¥0m primera su obi kako bi bio eo jednostavah dan niz znakova i postavite vied: Zatim instanciraite EtenLookup objekt i postavite niezova SOI associaterag i Subscription: root Assocsateag « "iberyast pee useriptionté ~ "Your 10 Here's Incase njegovo Request svostvo da bude poll od jednog objekta i postavite 3) djekt da bude StenLoorupfenuestobekt koje ste napa an}e 1 = now Teenbooaptewest{ 3]; ockup- Request = Tookup.tequestfo) = 26% pPrikazivanje rezultata 1 pucnaprviti emo nove ASPINET Web strane macorbalesRanks a pik infor- ja koje veaga Amazon. Povucite ti Gridvdew objekta na obrazac, ali ih nemojte jovezivatis podacima, UEinitiéemo to ruéno. Primer 16-3 prikazuje Kompletm aspx. etyastocla00t"s svakoj tablici. FEB) primjeite da koto idiom posivanja metoda kae Mo NET Pe inj 16:3, Prikacivanj rezultata a aera seavo dogada je da mi koristimo SOAP za raz: fg, bv oo to cesar eels do age Larguage"H" Compeits"Defat.asp.cs" ClasstonesBefaut_ spe 39 rulkom ,ev0 podaioka oni" Amazon 8201262 PP , DOCTIPE hn. PUBLIC °-/7MBC/YOVD aT. 32/704" vo v bok ty bako bist ural zie Pete. TOL > Fsieaeneeaet a * pozivanjem TtemLookup metode: jee mogu pojavit kod brad. Foéite acta tenb 10K qe ada ne bi eo ii ll. Moete dada kod 24 provi Cen an gover od Armazone (oe osen do oe bjt Koj pedal pole tera Sava. ttensenesa se ojondrzv frac oe kou te 2 tal amlnse"Atp:/ fag /3996/chta” > itlvales tances ab bin cn Yom oa fom Se nthe hes i ec {stored n'a lc dts, The te 5 ted eer 1 cbr > * ae inves. This 462 wnk In propess.
eens sa porretaba kako ‘i kod bio jedno- jekata, Uzet te info = response Tters(0]; tens = smote; ton = itets0}5, Pali 16:Saadaneueion | 385 398 | Propane Ct Primjer 163, Prikaivanj recultata(nastavab) snvepscor > eb Titlese/ty ‘eepsGriiew TDs" guts” Runa’ Onfowostabounde"towdtaoand ‘AataenersteColumas false Hescerstyle- Baltolor-"Papayathp™ SoroerColor="f00099"| AiteznatingtosStyLe-takColore"Lightcrey eaderStyle-Fent-Soldetrue \eethe"s00"> ‘colume> ‘ep Teaplaterield HeaderStyle-width "10 ‘lealerTerplate> itexserieplate> “ltemerplate> “aepiLabel Runat"sever” 1D-*Labelt"> ‘al roakaber %> ‘ritentenplate> yasprTenplateriela> ‘arprTemplaterield> ‘teadectenpiate> Title cpseaserterplater “iteaTenplate> 2 href" anazoncon/exe/Obids/ASIN/ it Eval (“ise Jb/" targets” Dlank"> “/aspcTesplateielés “asp:BouniField HeadevTets"Author” ReoiOnly."true" Datafield=*Author™ /> asp BoundField Header Text="Publisher™ ‘Reaabrlystrue” OntaFlelds"Publisher” /> ‘aspsfoundField HeaderText="Puplish Date” ReadOnlya'true"Datafield-"putDate” /> caspitoundtleld HeaderText="fank™ eadOnlyst true” Dataie dank ‘atarornatstringe"(0:10)" Teenstyle-forizentalAlsgn="right™ /> «columes> aspicridview er fs Cosas Tatlesc/b> Columns» ‘ospTeaplateielé Wesderstyle-hidth "10" 460 | Praia Ce steaderTerplates Position ‘MeaderTerplates ‘teste lates ‘spilabel Funate"server” Be"tabel2 i roaiber foc/asp: Labels “eriteaTemplatey ‘aspsTemplaterieliy Caspr Tenplaterields leader Tenplates Title “lteaderTerplates eamtewylater (@ href"http: as. anazen cone /obisos/ASIN/ ka Eval "isin")o/" target="_blank sth Eval (Ste) Sef onentte Bet" blank» Eval("tte) toefa> lospsTemplateFields ‘GspifoundField HeaderTexte'tuthor Reoddnly="true" DataFielde"author” fs ‘ospounField Heodertont="Pblisher” odo. "troe" Datarielde"Piblishe” /> ‘sp DoudField Veadertent= "Publish Gate” Readoly="trve” DataFelde"putate” “ Colne» ‘sp TenplateField Headerstyle-uath leader Tanplates ‘heatertenplater “TtemTemplste> ‘aspabel Rurate"sever" IDeabel3"s ‘a roarber Toc/asp:tabels Mtestexplste> “Tite ‘MeaderTenplates ‘alae 6: Sasarajew Gann | 401 Prinjer 16-3 Prikazivanereultata (aastavok) itentenate> ta nne?=hp://hu.anazon.conexec/obidos/ASTW Gap Sounield WemderTexte"Asthor” eadoly="tre" DataFielda"author" /> carp annie HeaderText=" Publisher Peodinly="trve™ Oatafielé-"Publisher" /> caspidoundeld HeaderText= Rank” Tecly="tzue" DataField-ank Uataformtsering="(0:00)" ‘enstyle-HorsaantalaLsgne"rght™ /> cposprortavin ‘Geprlabel 10+ IbiLastr Texte" Update” > Amber to show in grid “asprtentGon e"txtShawecords” Runate"server” Uidthe" Alpe” Heights" 29x sutofostBacke"True">/as9:TextBox> div crform cheb cna Kijuén aspekt HTML-a je izrada tri objekta GridView. Sva tri rade jednako pa éemo se ustedorotiei na prvi caspiGridVioe De" get?” Ror (rte atatounde"toatatoune ‘nacenerstecouans=""alse" Headerstyle-BackColore"Papayahip"™ ondercolor=" Woo Alternat ingtorstyle-tackColore'Light rey" HeaderStyle-ront-alétrue velath="400"> Gridview je nazvan gvASP. Neka od svojstava su postavljena, a najvainije od nih je ‘metoda za obradu dogadaja OntowataBound te Boolean. syojstvo AutoGenerateColums koje e postaljeno na vijednost False. To vam omogucava da preuzmeteizravaskon- trolu nad stupeima preko elementa columns: columns) ccolums> Pevi stupac unutarelementa colums je element predloska stupca, On omogacave dt ubacite kontrol ustupac. U pro) instanci dodat cece Headertenplate (koji se keris 2a ioradu zaglaijastupca) sa tekstor Position i asp:label kontrolom, Ta oznaka é¢ a2 | Pogamianece ya0 00) tekst prikazatibroj stupca. Mehanizam za dodjejivanje broja scupca je obra en kasnije w ovom poglavju, asp TenplateField Headerstyle-4idth 20°» ‘lesderrenplate> ‘ctenlemplate> “aspeabel Runate"serer erteentenplate> (t 1, Socata stelt"vct rowunber Ko ‘a bv) strait pogledaje koji Programiranje ASP.NET. Drugi stupac je takoder predlozak polja, ovaj put sa zaglavlem Title stupa. Sam aslo je prikazan zadavanjem vrijednosti naslovnog stupca u tekuéem redu skupa podataka s kojim je GridView objeke povezan ce okruzujui taj naslov s hipervezom prema odgovarajuéojstranici na Amazon.com. To naslov pretvara wu hipervezu koju ‘aspeTenplatefiel endeTenplats> Title ‘peadertenlate> ‘teaTemlate>| e Mefs "http: aaron. com/eec/Obides ASIN HY Eva (“sbw")/" tar pete! paiva val "eitle) bela rene lete paspsTeplate ehd> Pogledajmo ovo odvojeno. Prvi element je poje predlozks: cups tenplaterield> “laspsTeplateFiel> Unutit polja predloska se nalaze dva elementa predlotka: zeglali i stavka, Zaglavlie ini jednoamo, Sade jednostvan kt (ako b mop bi loko HTML | tod) “headertenplate> Title “headerterplate> PredloBak stavke je neSto zahtjevnij [aslo (ostalenizoveznakora) rebate proyjri da vii ispisuj | setpraene, Fogle 16Sstagjeacaian | 03 Promoteti Gemo ga izvana prema unutea. Prva stvar koju treba primjeiti je poserak ormalne hiperveze heehee aman co/ene/obidoe ASIN! Medutim, hipervesi je dodan rezular procjene vsijednosti ISBN-a iz povezanih podacaka ci erase") 8 Oanaka biperveze ina atebur: target" ban (©vajatribur u2rokuje da se hipervezaotvoriu novgjinstanci preglednika. Tilo hiper veze (prikazani tekst hiperveze) je takodet evaluirana veijednost: falCtitle?) ‘Ako posezani podaci sadete naslov Programing Visual Basic.NET, Second Edition {ISBN 0596004389, ova stavka emitrasedeéi HTML: Prvada stupea su slodenj, Prvizato Sto je ptzebpo malo truda da se napeav tomin ber (posledajte jededi kod}, a drugi 2at0 Sto teebamo umotati poveeari vijednost {ISBN i naslov) « hipervesu. Sljededa ger stupea su jednostavnija ato to su samo povezani s podacima Proj povezani stupac u zaglavju ima tekst Author, oznagen je kao readdnly i povesan jesa stupcem 2a autore u redu DataSet table s kojom je ovaj GridView povezan) -2p:BoundColuan HeaderTexte"huthor” esdonye” tue DOataFuelde"author"/> Primietite da je ovo samozatvarajuei element, kao i sljede¢a tri povezana stupca “asp:Boundcolum HeadesToxte"Pbl shen” Readony= DataFielde"publisher"/> «casp:BoueColum HeaderTextRank” eaanty-"true SetaFiehde' Ak” pataFounatsteing(eta}” TtenseylesorizontalALign= "ght" /> Implementiranje tablice Kompletan iavorni kod 2a datotelu s kodom je prikazan u primjera 16-4, nakon &ega slijedi analiza rinjer 16-4, DatotekasRolom 2a SalesDisplay sing ster “ing Spoten-02ta; (Eig Syste OataSqlclient; (Bing Syste. Configuration; ibang Sister heb; 5 ing Systane. Security; sing System. We; bing Systeme UT aeControls; fing System-heb UT webContols nebParts; ring Systenieb. UE OnI Controls; pubic partial class Defaultaspx ‘ protected int shovtecords; frotected int totA5Ps protected Son e¥alGsharys protested drt roohumber = 9; . protected overrise void Oncol EventArgs © ) 11 Unichfaighra bro} 23pisatako aa bwe prikarane 607 if Citstostback ) showteconds = 3 11 No Je pourat inforacija, unin bre} U1 sa paige 22 test hse ( showecords « Convert Talitaa{ twtshowecoss.Tet ? 11 Fovenivane 5 bozo podotaka tring comectionStrite = serverslocalhoet Tasted, Connectionetiue;databasesaazenSssTanks"> 11 ods zapise 2a peéharvanje String camandString Poeleck top." + soakacacds + Fa fron Bookingo where technology = “ASPET” order by rank" Sel0ataldapter dataMpter = ten SalbataAlapter( comandstrlig, comectionstring )s Dataset dataset = re Dataset(); tatancapter.Fill( dataset, "apboskiato™ yy 17 pra abhica cooaString ~ @°Select top “ + sheecopds + "+ “ren BookIno where techoolegy = "SHIRP” order by rank"; atandaptee = ne SelDataAagter( comandString, connect ionstring (atandapter.FAll( dataset, "sBootlnte™ ; // Druga ablica connarétring = e'Select top * + showecors » *fzow Bokinfo where technology ~ "VENET” order by rank"; dotaldopter = now SqlDatadapten( comaniSteing, 44 | Pogminne Pogue 1 Stnnjengetna | 05 Prinjer 16-4, Datotka skodom zaSalesDispay (nastavak) connectSonstring ); éatandapterFll{ aetaset, “vboklnfo" Jj // Trea tain 11 Stara pregled podatata 4 poveruje s tabhicon Dataview aspoataviow © ‘ataSet. Tbles[0)-Oefoultview; ource = acpbataview; i); raunber + 0; Dataview csDstaview ~ dataset Tables[s].Def2ulViexs ucSharp-DataSource = es0ataview; {ecsharpDatabind)s Datation vbostaviw = dataset Tables[2] Defaults this,gwtet OataSource = vhdataView, eet DataBind?); 1 tetsheeconds.Dotabind.)s Tblastipdate, text = "Lact updated: “6 ataSetTables[2].tows[o]["lastipdate”]-TostringQ); Votd Rowatato t ‘hs.romunerse » » Program zapotinje deearicanjem ve¢eg brojalokalnih varjabli, od koji je najvatnis ‘owner koja je iniijalizirana na o: object sender, GridViewouéventargs © ) Varijabla lanes hoxtecords se koristi za vodenje evidencije o tome koliko 2apisa «reba prikazati, 2 kad je stranica prvi put prikazana showRecoxds je postavljena na vi Jediost sedam (sigurna i razumna podrazumijevana vrjednosd. Prilikom uzastopnih slanja stranice postozitelu, ta varijabla je postavijena na veijednost koja se nalazi u pol 2a tekst vate void Page_load(object sender, Systen.eventrgs €) 4 tsPosttack ) ‘ showtecords alse ‘ Showtecords = Convert Totnt32(tatShowBecords Text) F pale mecodi za obradu dogadaja utitavanja stranice, uspostavljena je veza s bazom F podataka i baza podataka je pretrazena po ,tehnology ( jest, ASPNET ili Ci VB.NET) sting connectiostring = ‘terverslocalostT2 | Conrectionstrve;catabase-tnaonSalestaks"; string comardstring = @'aelect top "+ showecords + fron sccktofo where tecvalogy = ‘ASPET’ oréer by rank; slvatahdapter dataAdapter = on Sellatatdopter(camardString, comectionSteing); ataset dataset = new Dataset()s fatatdaper.Fil1(doteet,"a5pbeckINo"); // Prva tablica Isto je uéinjeno za sve ostale upte, Kad su napravijenetablice 2a skup podataka, napra sien je pogled na podatke za prvu tablicu, To je pogled na ASP.NET rezulkate (ataiew apletaiew » dataset. Tables] DefaultView; Sovim pogledom na podatke je povezan objekt GridView svASP.Dstasource = aspoatavion; v8 .0ataind); Kadje to utinjeno, varjablatlanica ros\unber je ponovno postavijena na nul (usko1o emo objasniti kako se ona mijenja) i sjedeéi pogled na podatke je napra zan sa svojim GridView objektom: atavew csataview » dataset. rables[2].0eaultVie ‘vCShayp-batasaurce = estataView ‘estan atabird()s ‘Ovo se ponavlja jo jednom za treéu tabicu: ota = 0; DataVien vbostavieu = dataset. Tables[2].DefaltView: ‘his. qwet.OataSource = wOSt2Vew; vite 0staeind()s Konaéno, natpis IblLastlpdate je postavjen iz pola Lastipdate utablict LbllastipdateText = “Last updated: " + dataset Tables[2] Rowt(02astUpdate*). Tostzina( Obrada RowDataBound dogadaja ‘Vjerojato se seated ste taranjem Grew objekea poveraiRowatadound dogs} smetodom oaatobound.Zaprav,naprailstetozasva ni GridView objekta. Kad god Je element povezanstablicom, abraden ew ovo} metodi, Sve So a metoda radi je da povecava 2a jedan brojatredovarnaber: public void Ten Bud bject sender, ide testerthes¢) renbere 6 | Regaine Fogle Sst nu | 407 Usinak je da svaki pu kad je neki clement povezan sGridVieobjektom, routines ye poveéavaza jedan zatim prikazuje uprvom stupeunaprasjenom po predosku apa reladvan polozaj unurar GridView objekta Pretrazivanje po kategorijama Poxivanje metode Web uslge 2a svaki ISBN koji felt proverii nl izdaleka nj naj, €inkovitiji moguéipristup. Ne samo da to ukljuéuje vite slanjai primanja podatae to -Amazona, ve ei vjetojatno da ce ISBN brojevi koje sravte na pops zastari gon ‘stovremeno kad novi konkurentii2idu na trite, a drugi budu rasprodani, Nasreéu, Amazon mode pretrativat po kategoiama. i sedecem (izadniem) pan ni o¥0g programa, dlobodit dete se XM datoeka ISBN brojevima i umjesta toga jednostavno pitari Amazon za sve knjige w ASP.NET, C#i VB.NET kategoriama Da ova) primjer pojednostavnimo, iz sake kategorie €emo uzeti samo deset kia ‘Amazon Web Services je velo leksibia usluga, ali za ovaj primyer te kristi grog minimum moguénoss. Napravite kopiju projekta SalesRankDBWebServices i nazovite ga AmazonWebServ ceClientSearching, Modificirat ete ga kao Sto je prikazano u primjezu 16-5, Primjer 16-5. SalesRankDBWebServicesO2 gion Using directives using Syste using Systen.collectsons. Generic; ‘using SystenConponetedel; sing Systenoatay sing Spsten.Oraning using System Mingo Fors; ‘endregion ranespace AnatonibserviceClient { partial class AaatomebservicecHient + Form private int téseteratnings fonst int HaitTine = 900} // 15 minuto private string comactnstring private Systen.0ata-SqlCLien.SlComection connection; private systes.0ota SqlcLient.SalCamand comand; Fublic Anazomebserviceclient() t ToitialtzeComponent()s private vold AnaroebserviceClient_Load( abject sender, (eens) F prijer 165. SalesRankDBWebSeroces02(natavak) 11 Niz 22 poverivanje 5 bazonpolataka Sales Rank Os teoveetionstring serverlocaltosts Trusted Conectionetruedetabase-fnazonsalesRinks"; 11 Stuara obfekt veze 4 Inietjalizira @ by sinen 2 pores, Cannection =| no Syston. outa SalCLientSlConnection( cornectiensering. 3 11 stvara SqlComand objekt 4 dodelsuje verw found = row Syston. Data, SqlClientSqlcamand(); ‘eomard.Coneetion » cernection; ‘inekerdining = 4) // Had se pokrene welta infornacife Upentebuttan); ) prbiate vod btnstart Click( object sender, EventArgs © ) 1 euenje mjeroe veenena Uupdptetinertnabled » uploteiner.crableé 2 folse + trues Upastesutton(); ) private void btmin,Click( object sender, Wenthrgs ©} ‘ ) private vod updatebutton() netemining btnStartText = pdateTinertsbied 1 “Aap “Staats ) private void updatetiner Tick( object Sender, EventArgs © } 1 ( updateriner-trabed ) trtClock- Test © { --tinetencining )-esteing() «seconds ease ‘rtClock Text 4 ( tHnetemsining « 4) tinetenaining = WaitTine; // Resetira sat iackeninins GetInfoFronknazon( “ASP.NET, “ASPRET” ); "CSUR" eae eStaagpdeinw | 49 Drinjer 16-5 SalesRankDBWebServicesO? (naskavak) private vid cettnforrontrazon( string keyword, string techealory ) ‘ esproductate productOata = nex ASProdotOata(); renSearch ech = mulls : tterSearchRequest req = new IterSearchRequest() reneyiords = heyord; eassenrchindex = "Books"5 ach «on Hessen) 5 Schaasoctatetag = Hberyassocigh"s cease lanta «7 tour subscription 10s \ Sehchemest = oe Fosearcheqesti8s Srenanoe(al = ey date (syten trenton ) nstates-Text ) tensearchtesponse res900865 i Ant slestank = -35 string isbn = string. forty String avthor = string. €9pty5 String pubdate = steing Empty; Seeing publisher = string Etys Seeing tite = =tzing-E0pty; Seeing StL try. pty eens} esgonseTtens = mulls ey ‘ 11 Weina HtewSearehesponse eepance © produtOatarttensearch( seh )5 11 Ytens via Tens esponseTtens = response Tte8s5 foreach ( Ttens Stone in responsetens ) y I/ Ken svojstva od Ttens je polje Tten cbjekat» teal} aerayofiter = ters. Tten; foreach ( tton iten in arrayOfTten } ‘ an «Fate enti 198 sSlestanksitersolesta | ta eecgereTolosa( Ste. Seestok ot et Han Tents tater] guatate = Fagot 10 | Progaianje Epijer 16-5. SalesRankDBWebServices2 (nastavok) ‘ten. rtenttributes.Pblicationate)s publisher = Pnturtes{ Men-ttewteribvtas. Publisher); Title = Foguotes( ite. onkteributes- Tite); [StTURL = ten Detas Pagel U1 Kearira golje 22 tekst string rests = title +" by * g auttor ¢% "4 Dublisher ¢ "+ paate + *, Rank: * 4 salestonks put Teens Ade results )s ott, SelectedTndex » Ibovtpet-TtersCount 1) aura tans podatala String comndString = "Update fookinfo set Seba = « ‘isbn ¢ "title=" e'eitle +", publisher = * + publisher "5 pabate = "6 pboote +") rank = "+ atest *,"Tink = SerURL +", Laetbpate =" + SjatenDatetine Now 0"; technology =" 6 technology + =") thor 2" thor 4 where abn = "+ iste s "5 cootané.ComondTent = cinnandStrings ny 11 fio nijedan ed nije pronjenjen, ovo Je ravi pis connector. pen()s “nt rastowhtfocted » cuomand.xecitellonQvery()5 iF Cotas = 0) comandString = S"asert into Bookinfo values (°" + Ssbne ye + tie", + publisher + puboate's °*) "4 Fiatuotes( statwt ) 4" 7 Psalertank 47) 7 Syston DateTime ae + re techlogy +", “4 author © comand. CoonandText » conmanéStzings comand. fxecitoontuery(); ) ) cateh ( excptlen o¢ ) t states. Text = oxnessage; owt. iters.Add( “Unable to apdate databace ovtputselectedndex = IhovtputStors.Comt = ) ‘nally { omnaction.Close()5 17 tisth Applicat ion-Dotvents(); 1) Abiira horisniho sutelje Pogue ve Sanprineion (ait Prinjer 16-5. SlesRankDDBWebServices02 fnastavak) ) fateh ( Systen-Bxception 2x) status.Text = extessages ) 1) Ratvara ettafoFrontnazot private string Fiaquotes( steing 5 ) if (se au) return String empty return steplace( """y © ) 31) kaj ase 11 kraj inenstog prestora ‘Uovo) inatici kompletan kod 2a rad s XML datotekama je uklonjen, Metoda Cettafo- F x00}580 je 2amijenjena sa GetJnfoFrosénazon, Umjesto da napravite TtenLookuptequest dobjekt, pravite Keysordequest objet: private vid Getinfofronseazen( string keyword, string techaolegy t ssProductoata productOata = new ssPreductosta)i eenseareh srch = nulls Teensearchtaquest Yeq = re rea.fepwords = Keynerd reqSearchinds = "Books"; tenSearchteqst(); stch = now TheaSearch); StehatssoctateTag = “Iibertyassecia008"; StchSubsersptionté « “Your subscription 10"; Steh Request = now TenSearchtequest[]; sreh-Request[0} = ree; ) Primjetie da je keyword svojstvu dodieljen prslijedeni keyword parametar(ojest,CH, ASPNET ili VB.NET). SvojstwoSearchlndex opraniavapretadivane na knijige (adie nego, na primjet, CD-ove) Kad jenapravfen FtenSearchRequest objekt ugradie ga u tenSearchobjekt koji Assoclatetog i Subscriptiont0 Ono sto dabijete natrag je TtenSearchResponse objet. Svojsvo Stems ovogobjektaje polje 1ten objekara. Svaki Item objekt ima Iten svojstvo koje je, Sto ne inenadue, pole Sten cbiekata. U ovim Tten objektima na ete informacie 0 odgovaajuéin Aejigama 4 | Pog CLRi NET ko DION stur POGLAVLJE 17 Sklopovi i rad s inacicama F osvovna jedinica .NET instaliranja je stlop (engl. assembly). Sklop je kolekcja dato eka koja izgleda kao jedna DLLili iavedna datoteka (EXE). Kao Sto je ranije reéeno, E DLL-ovi su kolekcije klasa i metoda koje su povezane s programom i izvode se samo B jad je porrebno. Sklopovi su .NET jedinice ponovne upotrebe, pracenja inatica, sigirnastl i razvoja F Ovo poglavlie deralino razmatra sklopove, ukucujuéi arhitekeuru isadeiaj sklopova, private sklopove i zajednike sklopove, Osim koda objekata za aplikaciu, sklopovi sadr¥e resusse kao 5:0 su gf datoteke, definicje tipova za svaku klasu koju definicate kao i druge mecapodatke o kodu i ‘podacima. [PE datoteke ‘Sklopovi su na disku Portable Executable (PE) datoteke, PE datoteke nisu novost. & Format NET PE dataceke je ist kao i obignih Windows PE datoteka, PE datoteke se jplementiraju kao DLL-ovi ili EXE datoteke, # Fick’, sklopovise sastoje od jednog ili vise modula (engl. module). Modul su sastayni Hi siiovi sklopova. Sami za sebe, moduli se ne mogu iavoditi. Moraju biti ukljugeni w fklopove da bi bili korsni f lastalirat éete i iznova upotrijbiti sav sidrZaj sklopa kao jedinicu. Sklopovi se weita- ‘aja na zahtjev i neée bit wéitani ako nisu potrebni. Metapodaci {Metapodaci (engl. metadata) su podac\ pohranjeai sklopu koji opisujucipove i Fmetode sklopa i pruzaju druge Korisne informacije o sklopu. Za sklopove se esto ize da sami sebe opisuju jer metapodaci pospuno opisuju sadréaj svakog modula a5 Sigurnosna granica ‘Sklopovi ne sigurnosne granice kao i granice tps. To jest, sklop je doseg 2a tipove koje sadréava,« defnicije tipova ne mogu prelazitiizmedu sklopova, Naravno, moses 4 se porivatina tipoveizvan granica sklopa navodenjem reference trazenogsklopa uae.» ‘ojnom okolibu il naredbenom reduprilikom prevodenja. Ono Sto ne mofetimatig definicia tipa koja vaziu dva sklopa Intern modifikator pristupa ogranigava pristup (metodi, na primjet) na trenutal sklop. cin acy Manifesti Uokvirusvojlh metapodataka svakisklop sadr2i manifest engl. manifest), On opisue to se nalaziusklopu: podaci 2a identificranje (ime, inatica itako dalj),popistipara iresursausklopu, popis modula, plan povezivana avn tipova skodom7 implemen. taciui pops sklopova na koje se poziva ova) sklop. Cak i najjednostavnili program ima manifest. Mogete ga ispitati KoriStenem Tdsn alata koji je dio razvojnog okoliss, Kad tvorite manifest sILDasm alstom, EXE po. fram iz primera 12-3 ingleda kao na shici 37. Elke 172, Manifest prozor Sledeci red sklopa je referenca na sklop iz primjera 12-3. Mozetetakoder vidjeti da § svg sklop sastoj od samo jednog modula. Zasad mozete zancmarti ostatak meta podataka, | _ | eee P wANIFEST | 2 BrenevntCeegts FW cwerrimocegsessroetin Sklopovi s vise modula tenement pos nog salt dengan So 2051 ge tei te [heer dam misono 700 pa datoteka, Taj modul sedrai sve tipove i implementacije 2a apikaci. Manifest sklopa ie ugraden unutar ovog modula, $B sccaosees soe | SE ccenmesogresecsctetiee Svaki modul ima svoj manifest kaj je odvojen od manifesta sklopa. Manifest modula sadriava popis sklopova koje taj modul referencira. Osim toga, ako modul deklatira ‘eke tipove, oni su upisani u manifest zajedno s kodom za implementiranje moduli ‘Modul takoder moze sadrZavati tesurse koji su mu potrebri i. } Stlopsvige modula sastojise od vite datoteka(nijednaili vite EXE datoteka injedna livige DLL datoteka, iako morate imati barem jednu EXE ili DLL datotek), Mani, fest sklopa seu ovom shutaju moze nalazitiuzasebnoj datotec ili mote biti ugraden jsdnom od modula. Kad je sklop referenciran, prilikom izvodenja se udtava datoteka koja Sadi manifest zahtijevani moduli po potteb ‘Slika 17-1 ILDasmprikaxprijera 123 ‘Manifest se nalaiu drugom redu, Ako ga dvaput pitsnet orvara se Manifest prox, ona slick 172 Ova datoteka sluti kao plan sadriajasklopa. U prvom redu motete vidjtireferenct prema sklopu nscorlib na koji se poriva ova alii svaka druga NET aplikacia scor- 118 je sklop jezgrenebibloteke 2a INET i dostupan jena svakoj NET platform 6 | Pagamianecr Fegloje7:Siipeicadsinons | 47 Izrada sklopa s vide modula a bismo prkazali ypottebu sklopova s vie modi, w sledeéem primjru je nape ven par silo jednostavnsh modula koje mozetesmjesti jedan Sklop. Pri mod Jerraction Kaca, Ona Ce am omogueit da radites razlomecima, To je priazano primjera 17-1 ringer 17-1 Klasa Fraction seegion Using directives using Sy Ueing Spsten Collections. Ceneric; Using Syeten Tet, serdcepson ronespace Progts public class Fraction private int muserators private int denoninator; public Fraction( Sint sunerator, int doneninator ) ‘ this.nonerator = unerator; this-denoninator = cenoninator; , public evetion tal Fraction rhs ) of ( ahs.denoninator {= Yhis.deneminater ) i return e Fraction( hs. doroninotor * nuwerator + {hs.runerater * denominator, Getomiratoe * ths. denoninatr); ? ee ttedeeniaten , public, override string Teste ing() c mee ) Eprimjetiteda je Fraction klasa u ProgCS imenskom prostoru. Puno lame klase je Pr0gCS. fraction Klasa Fraction uzima dvije vejednosti u svoj Kanstruktor: nuserator i denaninator. “Takoder postojiAdd() metoda koja uzima drugirazlomak \-vaéa zbro), pretpostavlja- ju da razlomei imaju zajednitki nazivnile. Ova klasa je namjerno naprasjena jedi. F samo, li ée prikazati funkcionalnost porrebnu za ovaj primer. Druga klasa je HyCale za robustan kalkulator. To je prikazano u primjeru 17-2 rimjer 17-2, Kalkulator region Using dizectives sing Systems Using Systen.Collections. Generic; teing Syston Texts, tenregion rnespace Props pubic class nycale i public int adi( Sot vals, int val? ) t rebum vali + vals ) puolic int ult( int val, sot vel2 ) return walt * val2; , ? ) {0S jednom, nycalc je dosta ogaljna klasa kako bi pojednostavnili primer. Primjetite ‘dase imyCalc tokoder nalazi u ProgCS imenskom prostoru. ‘To je dovoljno 2a izradu sklopa. Upotrijebice Assemblylnfocs datoteku za dodavanie ‘metapodataka u sklop. Uporreba merapodataka je obradena u poglaviju 18, : $8 sotetenapisailastityAsmblynfc datotka, al najednostani ¥ ., PoP eda prepastie Visual seudadavautint 2a vas, Visual Studio izraduje samo sklopove s ednim modulom, Mozete napraviti resurs s vite modula koristenjem Faddtodules opcije u naredbenom red. NajlakSi natin da prevedete i izradite sklop s vige modula je upotrebom make- file dacoteke koju modete napraviti u Notepadu ili bilo kojem drugom programu 23 uredivanje eksta Pada :Stepoviadsimtioma | 419 ‘Ao nist apoznati s makefile datotekama, ne bint, Ov je sao Prinjerloj Ror makefile dctee to smo dos sbidureutng Seranieny Visual Sead A je ptetno,mofetekorstt make Hoven lyceyFile(",\AkE/e.snk")) iw Atribute sklopa morate smjestiti nakon svih using deklaracija te prije [eed, nt nog atributi se koriste 2a medudjdlovanjes CONCom, oem Gemo detainije govo- ritiu poglaviu 22. Vee ste vijeli primjenu jednog atributa ([WebMethod]) a poglavtn 16, Vidjet ete i upotrebu deugih atributa, kao Sto je [Serializable] iz poglavja 19. ‘system. Reflect on imenski prostorstavjana raspolaganje veéibrojatribut, uleugujuci tribute za sklopove (kao Sto je éssenblyKeyFileattribute) konbguriranje re atribute za inatice, Jedan od atributa s kojim éere se najéesée sustetati w svakodnevnom C# progeamiranju (osim ako ne radite s COM modelom) je [Serializable]. Keo Stocete viet u poglaviju 19, sve Sto trebate napraviti keko biste osigurali da klasa moze biti ®cesiplizrana na disk ili na Internet je dodavanje atrbuta [Serializable] klasi: (serializable) lass MySeril cabelas Oznakaatributase stavj uuglatezagrade odmah pie ci ateibuta, au ovo shuéaj toje deklaracij klase b Kijutna Zinjenica o asibutima je da znate kad su vam potrebni, Zadatak koji rebate obavitidiktirat €eajihovu upotrebu. * Prilagodeni atributi © Motete napravic\ attibute koji su prilagodeni vasim potrebama teh koristt prilikom izvodenja kako vam odgovara, Pretpostaviae, na primer, da va odjl Zli voditi evi- ddencijuo ispravjenim pogreskama. Vee imate bizu podataka o svim pogreskatta, ali bisve heli povezatisvaki izvjstajo pogresci s adredenim ispravkom u kodu, Magli biste dodati komentare u kod: 11 Pogretka 324. Tspravio Jest erty 1/2/2005 To biste lako oti u izvornom kodu, ali ne postojl veza prema pogresci 322 4 bazi podataka. Prilagodeni atribut bi mogao biti upravo ono So tratite. Zamijenili biste komentar 5 nedim kao Sto je ovo Pogo 1: Abuse | 3 Inugtinattribute(523,“Jesse Liber Camment"Dedna eanje")} Onda bste mogli mapisai program da éta metapodatke, nade ova zabilieSke oipry jen} pogresei te da adurira bez podataka. Atribut bi imao ulogu komentar sami napisali va je modda nepiodan primer jeri ate bil prevedent u alt 43, kod iporuda, 45g, Kod a Deklariranje atributa Accibuti, kao i veéina drugih sevati u C# jezik, se ckljuceni u klase. Da biste napa ili peilagodent atributizvedice novu prilagodenu klasu atributa iz Systen.Atteibute pubic class Bugfinattritute + System Attribute ‘Trebate uputii prevoditela skojim elementima ova atribut mo%e biti upotriebljen trebare zadaticiljarributa). To zadaje (s dim drugim nego) atriburom: (anerstutcusage(attributeTargets cass ‘etributeTorgets.Constctor | ateributerargets-Fiele Ietritutetargete Rethed | ActrituterargetsProperty, Atiewaltiple = te)) Aneibteane je aribr kj se prj na arbe- metab On rs sho | vam je tako drago, meta-metapodatke, ro jest, podatke o metapodacima. Konstruk oru atributa attrsbuteusage prosledujete dva argumenta, Prvi argument je kup zsta vica koje ukaauju na cilj, u ovom sluéaju klasu i njen konstruktor, pola, merode i svojstva, Drug argument je zastavica koja ukazuje da linavedeni element moze primiti vise od jednog cakvog atribura. U ovom primnjeru, ALlowul tiple je postavijen na true, pokazujuéi da se clanovima klase mote docijeliti vie atribuca BugF ixAttribute, Imenovanje atributa ‘Novi prifagodeni arribue u ovom primjeru je nazvan BugfExAttribute. Ucbitajeno je dlodati sje? atteibure imenu atributa, Prevoditel; to podrEava tako Sto dozvoliava da nazovete atribut skraéenim imenom. Prema tome, modete napisati Iugtix(123, “esse Liberty", "01/01/05", Coments"Jedna wanje")] Prevoditelée prvo potratiti atributBugFix te, ako ga ne pronade, potadicebugin- actribute Konstruranje atributa Atcibuti uzimajy dva sips paramerara: pozicijske | imenske, U BugFx primjeru, Pro ‘gramerovo ime, identifikacor pogreske i datum su pozicijski parametti, a komenrat 4 | Pogrmianie a4 bi takoder omoguéavao da programski pribavite podatke s pomotu alata koje bag Fc imenski parameta. Poricijski parametri se prosieduju kroz konstrukror po redost fed deklaricanom u konstrukrorn: pblic Suprinateribute( int bugID, sting progr String cote) ‘this.bupD = bugID; this programmer = progranmer; thiswate » dates pblic string Coment C et t return coment canment = valve; 1 ‘Uobigajeno je2a poriciske parametse napraviti svojstva samo za dtanje poi Ant BugiD t et c etutn bugs ) ) Upotreba atributa Kad ste definirali atribur modete ga poteti Koristiti tako Sco éete ga staviti odmah ispredcilja, Kako bite testirali ge iuattribute iz prethodnog primera, sledeti pro gram stvara jednostavmu klasu ath i dodelfuje joj dvije metode, Dodijelive Bug xAt- cribwtes atribuc klasi za biljeBenje povijesti odrzavanja koda (Wvgrisattribute(aa, "Jesse Liberty", °01/03/05") [bprinatteiture(a7, “Jesse Lite Cannante"Fied oF by on walle elaee nytath vi atribut se pohranjuju s metapodacima, Primjer 18-1 prikazuje kompleran progeatn. Primjer 18-1. Rad prilagodenin atibutima region Using aivectives Fusing Syston: ‘sing Syston oltections.Generies sing Systen.Texts Foglaie 1: Atibuiveelsfa | 35 Primer 1-1. Rad s prilagodenim atitutima (nastar) ringer 18-1 Rad's prilagodenim atributima (nastavak) 11 Peistpetc endtegion ravespace Custoustributes ¢ 11 Stvata prilagodentatribut fojt ge DILL dodjeljen Hanu t135e {avtriovtebeage attrituteTorgets-class | averibotelarges.Corstraetor | aetrituterorpets Field ateributerongete Reto | aetniboteranpets eiperty, Allowmltuple = t200)) public class augrnattribute : Systen-Attribute q 11 Podacs.privatnin élanova peavate int BaD; private string cnwents private string dates, private string programer; 1 istpnik bic string Prograneer at i etuen programe; Js sesso goyjeljivanje atrapte hdass MPO 17 Koastroktor atrstuta 22 17 posi ke paranetze pubic sugrbateripate ‘Cint bog, String progranner, sting date ) [tvgFiantteibute( 221, “sesse Liberty", °01/03/05")] (auyetadeeribete, at) “ecce Liberty”) “01/0/08”, Conaent = "aed off by one errors? )] puolic class myth this.buglO = bug; thie pregeannee = aragramecs this.date = ote; ) 11 Feistugnle public int 9u¢10 oblic double DoFunca{ double paraes ) return parant + DoFunr( patana ); ? public cove Dofunca| dae param ) ( return param 3; « , rear ba vos cnet Z public static void Main() 2 pace gcc peta, f public string coment Iyath an = nex maths , Coleen ling Dt) Rests (0 _ ventas) t } , iets came os ' te U oes Kao Sto motete vidjti,atributi nemaju nikakvog utjecajo na izlaz programa. Zapravo, ' woven imate smo moj ret da arb wpe poste re pogied na ) ietapoathekoritejem IDasm alta otkeva da 5u stb pak va svom mest 86 | ProganianjeG ole Acasa | 7 (lika 18-1), U sljedegem dij vidjetéete kako doprijeti do metapodataka i kako i uupotrijebiti w prograrnu, 2 TY Boat ita ‘regen ace) We crtcc nan ara dt 5 Siete ommend s Soc Porton weno ste Sika 18-1, Metapodac w stlopu Refleksija Da bi ateibuti w metapodacima bili korisni trebate nagin da im pristupite, a idealno bi bilo da im pristupate prlikom igvodenia. Klase u imenskom prostotu Reflection zajedno sa Systen Type klasom osiguravaju podrSku za ispitivanje metapodataka irad sajima Refleksia se opéenito koristi 2a shedeéa Eetiri zadatka, 8 | Pesanmaniec ‘Mogu ga koristti lat! i pomoéni programi koji dele prikazati metapodatke, Otkrivanjetipova ‘Omoguéava da ispitate tipove u sklopu te da snjima tadite il da i instancirate ‘To mote biti korisno prilikom izrade prilagodenih skripsi, Na primer, mogh bist ‘omogutiti korisnicima da medudjelujus programom korigtenjem skriptnogjeziks a0 Sto je JavaScript ili neki novi jezik koji ste sami smislil Kasno povezivanje s metodama i svojtvima Omogueéava progameru da pozove svojstva i metode na objektima koji su dina: migki instancirani uz upotrebu otkrivanja ipova, Ove se naziva i dinamigko pozi vanje (engl. dynamical invocation) ‘Swwaranjetipova priikom ievodenja [Najekstremnija upotteba refieksije je izrada novih tipova tijekom ievodenja inj hova upotreba 2a izvodenje zadataka. To biste mogli koristti kada se prilagodena klasa napravijena za veijeme izvoderja izvodi bre nego opéenitij kod napravijen prilikom prevodenja Pregled metapodataka U ovom dijelu upotrijebit ete C# podrSku 2a refleksju da bistewtitali metapodake ‘nyath klase Zapotnite uzimanje objekta tipa MesberInfo. Taj objekt iz System. Reflection imenskog prostora postoji radi otkrivanja atributa élanova te za pristupanje metapodacima: systen Reflection Mebertato inf = typeof (eth; E Pozovite typeof operator na tip Hykath koji €e vratiti objekt tipa Type koji izvodi is neerinfo, [TE] Klass type je ste klasa refleksie. type ueahuraje reprerentacy tips cbjcka alas primar natin-2apistopanjemetspodacima. ype inves tenerife ueahurjetofermaceodlanovna Klse fete. dam, svojtvina, palma, dogdajia ako dal). Sledeti korak je da pozovete GetCustosattributes na objekt Henbernfo proshedujuci tip atribuca kojeg Zelite nati, Natrag dobijate pole objekata tipa ugFixattribute: ebject} attributes; inf.GetCustonat tributes typeoF(Bgh nat tribute) false); Sad modete iterirati kroz pole {ispisat svojstva BughixAttribute objekta, Primjer 18-2 2amjenjuje Tester klacu iz primera 18-1, ole Aiud | 8 Pringer 18-2, Upotreba refcksije bic static wold Maing) t yath am + nex mth) mache wriveLine(“2UlSng Suline(). Ress {o .GoFunes(7))5, 11 Uaina Snfornacse © €lanovina | koristh 11 ih ta seine prilagodenih ateibute SystenteFlection.Weaber info int = typeot( tytn); object) attributes; attributes = snf.GetCustomttribates( ‘typeof (augFixAttribte), false); 11 Teecsea ron atribute 11 axing sojstva foreach(Object attribute in attributes) eaghinetessbute ba = (lugPuatgetnute) attributes Console-neiteline(*\nbugTD: {0}", bf2-8ug50); ConsolesriteLite(*Programer: 0)", Wa: Pregramer); Console uriteLine(“Date: 0)", b2.0ate); Corsole write ne(*Goments (0), 6a. Conment}; ? ) Kad scavite ovaj ramjenski kod u primjer 18-1 1 pokrenete program vidiet éeteispis merapodstaka Otkrivanje tipova Reflekiju mozete koristiti za istradivane sadr2aja sklopa. Mozete pronacitipove pr druzene modus; metode, pola, svjstva, dopadsjeprideuene tipu kao i potpse vib ‘etoda tips, sueelja koja tip podréava i osnovm klast tipa Da bistepoéeli, dinamizki utiajtesklop koritenjem Asseably. Load) statitke metode Klasa astembly 2a potrebe telleksie faharuje sara sklap. Jedan od porpisa Load etode je public static Asenbly- Load Asseblyane) Usljedeéem primjeru prosijeditejezarenu biblioteku metodi Load). Datorcka Mscor Lil sade jeagrene klsse NET kostur: Astonbly a « Asenly.Lond(Rscorib"); Kad je sklopuitan motete pozvati GetTypes() da vratite poe Type objekata, Objekt type je Kljucni dio reflksie, Type predstavlja deklaracije ipa (klase, sutej, poi, vejednosti i eoumeracie) Tyee] types = a.cetypee(); 40 | Poge a [2 ane ‘Sklop vraéa pole tipova koje mozere prikazati foreach peti, kao Sto je prikazaro primers 18:3. Kako ova) primjer korist klasu Type, tiebatéere dodan dircktiva using taimenski prostor Syster.Reflection rinjer 8-3. Refdsia slop & pregion Using aisectives sing Sys thing Stew. Collects. ener, thing Syston. Reflection; sing Systen. Test sevaregion ranespace Reflectingassenbly poblic class Tester tube static vold Mant) 17 50 je w slope ssenbly 2 assembly Losi “hscorb* }; Type] types = ascethyests seen Che es) onsoe.nstetine( “ype is (0), ts {onsleriteLin( (0h types fund", pes. teeth : ) Izlaz ovog programa bi popunio mnogo stranica pa ga nesu cijelog navodit, Evo krat 10g adlomka ‘ype 55 Systen. abject Type $s Thiskesewbly ‘ype 5 Aecebiyeed Type 1 Systen, Clonee Type Js systen. Collections. tfrunersble ‘ype £5 Systen Collections. Tol lectfon Type 8 System Cobectsere Sst Type 15 systen-trray 231 pes fund ‘Ova primjerje dao pole stipavima iz jezgrene biblicieke tispisao th jedan po jedan Pol jeu mom ratunalu sadrZavalo 2373 unosa, \V inatic 1 sam u svom stanly natag 1426 unora, Deke fx Micra _ sfta subi vriednt Pola 1: Aue | 481 Refleksija tipa Mote eflekiati sao jedan tip izNscolibsklopa. Da biste 1 utiniiidhojte tpg sklopa s pomocu typed i metode CetType(), kao Sto je prikazano u primjery 8% Primjer 18-4. Refokeiatpa repicn Using divectives sing stem; hing Systen.Collectons. Generics ing system feflection; sing Syston. Text feadrogion sanespace ReflectingdatType ‘ public class Tester ublic static void main) ‘ 1 spStivanje tipo Type thetype = Type cetType( System Ref lction.Assenbly” J; Conse iste inet "\aSingle Type is {o)\w ype Ys Otkrivanje svi zanovatipa Modete od tipa Assenbly zatraditi sve njegove Elanove koriStenjem metode GetMen- bers() klase Type koja daje popis syih metoda, svojstava i polja, kao to je prikazano uprimjeru 18.5, Primje 185. Refleksiia lana tipa repion ceing dsnectives using System Using syste. Collections.Generics Using Syston Reflection; sing Systen. Text; sencregion parce Refectory public class tester ‘ puolie static void Main) 40 | Pogaianieg anjer 185, Reflekei lonows tps (rastavak) 1 pitivanje abjeeta ype theType = ‘ype-cettype Syston Reflection Asenbly" ); Console tritetire( ‘nSingle Type is fo}, theype J: 11 sina sve Elanove Yesbertnfo] sbrinfotreay = ther ypeCetebers(); foreach ( Nonberinfo wbrinfo in sbrTnfotesay ) Console rite ined *(0) 38.2 (2), brinfo, sbroto.Resberiype }; F Jas jednom, iaaz je priligno dug, alu ialaau éete vidjet pola, metode, konstrukvore isvojstva kao u ovom odlomku: systen.Type CetType(Systen.Steing, Boolean, Boolean) is 2 Method system Typel] Geteapartediypes() is Method System tf ction.tedule Getfadse( System.String) is a Retho ‘Syston String get Fullne() 15 2 Rethod Pronalazenje metodatipa { Motite se usredsrediti samo na metode, iskljuéyjui polja, svojsva i ostale elanove. a biste to uéinil, uklonite poziv metode CetMerbers) enbertnfol} nbriatokrray = hetype.cetmenbers()t i dodijte poaiv metode Gethethods(): strinfohray = theTypeettetheds(); Inbar sada sadrai samo metode: Boolean Equals( System.Object) 35 a Method system String ToSteing() 35 a Nethod ‘Syston String Created Fiedane( System string, Systems 4 Method Boolean get, ClobalissenblyCache() is 2 Rethod Pronalagenje samo odredenihélanovatipa, Konaéno, da biste jos vise suzil pretragu motete upotrijebiti FindMenbers metodu da nadete samo odredene élanove tipa. Na primjer, modetesuziti pretraguna metode tije ime potinje sa Get. Da bistesuzil pretragu upotrijebite FindHerbers metodu koja uzima Getti parametca: Peale Arbadivtea | 4) enberTypes Mexbertypes objet koji zadaje tip lana kojeg trate, Tu spadaju Al, Constructor, Custom, Event, Field, Method, Nestedype, Property i Typeinfo. NenberTypes.Methag ete koristici da nadete mero, BindingFlags Enumeracija koja nadzire na koji natin refleksija ivodi pretragu, Postoji mu Binding lags vrjednosti, ukljuéujuci TgnoreCase, Instance, Public, Static id NenberFilter : } Delegat (pogledajte poglavije 12) koji fitrira popis élanova u Menberlofo poly objekata. Koristce filtar Type.Filtertane koji Je poje klase Type koje filtrira po Object Vrijednost znakovnog niza koja fitar koristi. U ovom stutaju prosljedujere Gets da biste nadli samo one metode koje potinju sa Ger. Kompletan popis dobiven filtriranjem ovih maoda je prikazan u primjexu 18-6, Prinjer 18-6. Taxenjeodredenihclanova fropion Using directives using System Using Syn. Collections. Generic; Using Systen. Reflection; Using Syston Texts sonespace Mnding?articulantenbers ( public class Tester public statse void Main() ‘ 11 Tspituje jedan objekt ‘ype theType = Tpe.GetTypel “system neflectin.Assenbly" 1 Sana Elana haji aetode on Get aero} wbefostyy = thetypeFindebers( MeberTypessteto!, BnginglagsPtlic | nanos. Static | nang lags Ahab | indngFags rst | indngFlogs.OelareeOy, Typestiltenane, “cet” Js foreach { hberinfo Sinton srintokt2y ) ¢ | Popo pmitt 18-6 Taken odredenihélanova(nastavak) Conse titeLine( “(4s a (2)*, brInfo, mbrinfo.Mebeztype ); Kasno povezivanje Kad pronadete metodu mogu¢e ju je pozvati koristenjem refleksije. Na primer, mo#da ‘budetehtjeli pozvati Cos() metodu iz klase Syste. Math koja vraéa kosinus kurta || Motte naruyno,poesatices() iu maemalnom taku bode, alirellkja ‘Yam omoguéava povezianes tom metodom tekon evra Po M$ ce cove kasnopoveivani engl late bind) mui edsbion, ods bir objeto ca poveivanieijekom evden gow pograskog potivana. To maf bil keris kod tad plagocene lente hopa te ‘eogaopolaent Korink if ad rade kta toy etd noe destipn prim prevodi. Na prc ho enim kasnog pov sh Rogan notemedurins pagan poe prop zara kta je Mol Word OEP "a biste pozvaliCos() prvo uamiteinformacieo tipu ir System Math klse: Type thetutnType ~ Type. cetType("systen.Math); £ Stom informacijom o tipu mozete dinamitki ucitati instancu klase koriste statigku /F metodu Klase Activator, Potto je Cost) statidka metoda ne trebate praviti instancit Systen.Math klase (a ine modete jer Systen.Fath nema javni konstruktor Activator klasa sadrdi Cetiri metode (ave su statitke) Koje mozete koristti da napra- vite objekte (lokelno ili udaljeno) ili da uemete reference postojecih objekata. Te cetiti % metode su } createcontnstanceFron Stvara instace COM objekta. Greatetnstanceftom Stvara referencu na objekt iz odredenog sklopa itipa imena. Cetdbject Koristi se kod rasporedivanja objekata. Rasporedivanje (engl. marshaling) je {etaljno obradenovs poglavha 19, createlnstance Stvara lokalne il udalene instance objekta. Na primer: Object thebj = Activator, Createlnstance(someType); ole Aue | 45 ‘Veatimo se natrag na primjer metode Cos() gdje sad imate jedan objekt: Type oj eke iimenu theiathType koji sce napravii pozivanjem GetType metode. ee Prije nego sto mozere pozvati metodu nad objektom moratezeti metod kojueebae cod objekta thetathtype. Da biste to utinili pozvat ete GetMethod() prosiedivs, potpis Cos metode a Porpis metode, siti éetes, je ime metode (Cos) njeni parametttipa. Cos()imasamo jedan parametar: realan broj (double). Meducim, Type.GetMethod wzima dva parame. tra, Prv je ime metode koju cratic, a drugi su patametri. Ime se prosjeduje kag nig znakova, a parametri kao pole fipova: ethodtnfo cosines thotthtype. Getter hos("Cos" paranypes); Pri poziva GetNethod() morate pripremit pole tipova: Type} parantypes = nen Types] pant ypes{ole Type Cette syten Double") (Ova) kod delclarira pole Type objekata i zatim popunjava prvi clement (paraatypes[o}) stipom koji predstavlarealan bro} (double). Uzmite tip koji predstavja double poriva njem scatieke metode Type.CetType(} i prosliedivanjem niza Systen.Doubie. Sad imate HethodInfo objekt na kojem miozete pozvati metodu. Da biste to uinl tmorateprosijeitiobjekt nad kojim se metoda pozivai stvarne vrijednose parametar, pet u palju Pato je meroda stati, peosjedite objekt thekathype (da je Cos() bla metoda instance, mogli biste upotijebiti theObj umjesto thetathType) ject} paraneters « new Object); poraneters[0] = 45 * (ath PL/80); 1/45 stepnjeve u radtjanina eect return = Cosinetno. noie( heat pe parneters), "Napravii ste dvapolja. vo, parantypes, sade parametetipa. Dr patanetere, sadristvarnu vjednost. Ako bi metoda waels dva arg (ad, Tons el te Sr poe sn Se ede * ako metoda nije uzela njedeu veijednost, oper motetenapraviti poll, imu velitnu postavte na ula! ‘pel parantypes = oem Typo}; Isprayno je ako ingles uno, Primer 18-7 prikazuje dinamicko pozivanje Cos() metode. Primjer 18-7. Dnamicko pocivanje metode region Using ditectives using Systems Using Syston. collections Gener Using System Refleetson; sing Syste. Texts 46 | Pogamiane ce Primer 18-7. Dinamicko pozivanj metode(nastavat) aren H wcespace Oyranicallylnvoxirg¥ethod public class Tester bic static void tain() t ‘Type thetathlype = Type.cetType "Systenatath" ); 11 ako Spste.tath tena java korstnutor 11 stbacit e danioh ‘10 ject edb = 17 ‘Activator. Createlastarce( tetathtype); 11 Folje sedi elanon Type] paraatypes = rem typelt]; porantypes(o] = Type-Getiype( “Syston. Ouble™ ); 1 nina infornactje 0 netoti Cos() Methodtnfo cosineinfo ~ thetathnype. cethethed Cos + paratypes); 1 topnsor poe sa svorin paraetrina Goject() poraneters = sow heck, petonetersfo) = &5* (ROFL JED); 17 45 sugars w rt Object returnval ‘ ) = Hees Cosine rake thowthpe, porters Consele.briteLine( ‘ oe : “ihe cosine of 5 epee ange (0), return); uno psa dab se povala edna meta, Mot ovoga pristp jeu ome da moter oot} reflksju kako bie nal slop na kosnkovors tcl ose oe odestupnim metodama i dinamithi pov nek oh needa joule Wi Autres | 7 POGLAVIENS Rasporedivanje i rad na daljinu Dani integriranih programa koji rade v sklopu jednog procesa na jednom ratunsly su, ako ne mrtvi, onda barem ozblino ranjeni. Danafnyi program se sastoe od slags, nih komponenata koje se izvode u vie proces, Esto preko mreée. Web je omogucie distcibuirane aplikacje na nai koji je bio nezamisliv€ak i prije nekoliko godina,« trend je prema distribucij odgovornosti. Drugi trend je prema centralizaciji poslovne logike na veikim posluZiteljims, ako se vi trendoviéine kontradiktorni, zapravo su sinergistik: posiovni cbjekti se central. 2iraju dok korisnitko sutelje i dio sredajeg sloja postaju distribuirani Krajni uéinak je taj da objekti trebaju moci komunicirati medusobno na dabjnu, Objekt koji se izvode na posluditelju i koji upravijaju Web korisnigkim sugeljem te baju moti medudjetovatis poslovnim objektima koji su smjeSteni na centralizicanim posluditeljima u korporacifskim sjedistima, Proces pomicanja objekta preko granice zove se rasporedivanje po vrijednost (engl. ‘marshal by value). Granice postoje na razligitim razinama apstrakcife u program ‘Najotinija granica je izmedu bjekata koji se zvode na talittimy raunalima Proces pripremanja objekta za dalinski pristup se nazivarasporedivanj (engl. marsh ling). Na jednom ratunalu, objekti ée se moda trebati rasporedivati preko konteksta, ciskih domena ili granica procesa Proces jeu bit aplikacia koja se izvodi. Ako objekt programa za obradu testa el ‘medudjelovatisobjektom u proraéunsko tablic, oni moraja kemunictai preko ga. nica process. Procesi su podijejeni w aplikacjcke domene, Aplikaiiske domene (engl pplication domains) su daje poijelene urazne kontekste (engl. contexts). Aplikac} Ske domene djeluju kao jenostavni proces,» komekaistvarajagramice wnsta kojh senalaze objektsaslgnim pravilima. Objektiée povremeno biti rasporedivan preko sanica konteksta i aplikacjskih domena kao peeko granica process i aunala, Kad se objektrasporeduje po vrijednosti to izgleda kao da ga se Salje kroz 2icu od je ‘nog raéunala prema drugom, kao 310 se kapetan Ki teleportita na powsins planeta rekolike stotina kilometara ispod orbitirajuéeg, USS Enterprisea, “BOY Ae SON LU Zujezdanim stazama, Kirke zaista premjedten na planet, ali u NET to jeiluaj, ‘sko stojite na povrSini planeta, mol iste mislti da vidiee pravog Kirke trazgovarate sim, ali uopée ne razgovarate sKiskom vet s posrediikkom, molda helogramom, 8. je posco da prenese vaSu poruku do Enterprisea, pravom Kirk, amedu vas i Kirka postoji vedi broj ,odvoda". Odved fen. sin) je objekt i je posao ds provodi pravila. Na primjer, ako vam Kirk pokusa ret neSto so bi moglo uljecati 1 ra2v0) vake cvillzacije, odvod primanne direktive bi moga0 aabranii prjenoe, Kad pravi Kirk odgovori, on Sale odgovor kroz razne odvode dok poruka ne dade do posrednika i postednik vam ne prenese poruku. Vama se Zini kao da je Kirk zapravo famo, ali on se 2apravo prikrada iza vas da osujetivaé podli plan, Nazalost, ispada da je gospodin Sulu cielo vrijeme kontrolirao hologram, Vie sree sede} epizod, Stvarni prijenos vase poruke obavia kanal (engl. channel), Posao kanala je da 2n2 kako prenijett poruku od Enterprisea do planeta. Kanal radi s formaterom (engl: for- matter). Formater osigurava da je poruka u odgovarajuéem formatu. Mozda govorite samo vulkansk, a jadni Kapetan ne, Fotmater mote prevesti poruk na standardal {ederaciski jezik i prevestiKirkov odgovor sa standardnog federacijskog jecika natrag, © pawalkansk, Cini se daraagovarate jedan sdrugin al formate (Poznat kao uve © galni prevoditej w Zvjezdanim stazama) neprimjetno omoguéava komunikacij Ovo poglaije opisuje kako se objelat mogy prenosith preko saznih granica i kako posrednictizamjenski element mogu stvoriihuijuda je va8 objet prenesen kroe mee ni kabel do raéunala na drugom kraju ureda ili svijta. Pored toga, ovo poplaviie opi- suje uloge formatera, kanala i odvoda te primjenu ovih Koncepstau programiran ; Aplikacijske domene Proces je u biti apikacija koja se isvodi. Svaka NET aplikacia se iavodi unutarvla ‘sitog, procesa. Ako imate atvorene programe Word, Excel i Visual Studio, imate tri procesa koji se iavode. Ako otvorite Outlook, pokreée se novi proces, Svaki proces F je podiejen na jedmnu ill vibe aplikaciskih domena. Aplikacijska domena djeluje kao proces, ali koristi manje resursa, Aplikaciske domene mogu se neovisno pokretati i zaustavljati. One su sigurne, je nostavne i svestrane. Aplikacijska domena moe pruiti otpornost na pogreske. Ako pokrenete objekt v drugoj aplikacijskoj doment i onda se i2vodenje prekine, to ce sru- Siti aplikacijsku domenu, ali ne lejeli program. Mozete zamisiti Web postuite) koji < koristi aplikacisku domenu za izvodenje korisnikovog koda. Ako u kodu ima neki problem, Web poslutitelj moze nastaviti adit | Aplikacjsku domenu uéahurava instance kase Appleman, koe pra vetibrojmetods isvojstava, U tabici 19-1 je skraéeni popis. Pole B:tasporeianeladnadaion | 49 Tablica 19-1 Metode svojstva AppDomain klase eta st eta ‘cursentdorain Jao sat sesh vaa placa domeuza esta Gets cexateoanain() Prepon modest nov slider ‘etCurrentThreadIO() Iva salametoaljo wat enntatrtsutn deve untesd() sna sata meta bare aan alla dens Friend yane Joao lj ata prptelsoinez apa dena Defnebyranichssenty() Pepe jos sia metodo defn dani, pls dome swocutetssenbly() savas ieo aap cetoata() en eth ana viet sper trent ape en) ama metodo tsp tema agtaitdomens SettgpOonainPalicy() aa meade star sgn pravaca tensa eens setoata() Jama netodekp sta pete uzadow ssa apace daene Aplikacijske domene takoder podrZavaju mnostvo dogadaja (ukljuéujutiAssenblyLoad, AssenblyResolve, ProcessExit i Resourcetesolve) koji se javljju kad su sklopov' prona. deni, uCicani, izvedent | ispraznjeni. Svaki proces ima incijalnu aplikacjsku domenu a moze imati i dodatne aplikaciske ddomene ako ih napravite. Svaka aplikaciska domena postjiu toénojednom proces Sviprogrami u ovo knjiz su imal jednuaplikacisku domenu ~ podrazumijevanu,Svaki ‘proces ima svoju podrazumijevanu aplikacjsku domenu. U mnogim, mo&da u vetini ‘programa koje pete, podrazumijevana aplikacjska domena ée biti sve Sto vam treba ‘Medutim, postoje slutajevi kad jedna domena nije dovolina. Mogli biste napraviti dlrugu aplikacijsku domenu ako trebate pokrenuti biblioteku koju je napisao drugi programer. Mozda ne vjerujete biblioteci i Zelite ju izolirati u njenoj domeni tako da, ako metoda u to) biblioteci prouzrodi blokiranje programa, onda ée samo ili rana domena biti zahvacena. Da ste autor softvera Internet Information Server (115), Microsoftovog posluzitelja 2a Web stranice, mogli biste pokrenuti novu aplikacjsl ddomenu 2a svaki dodatak ili svaku virtualnu mapu koju udomljavate. To bi osiguralo ‘otpomnost na pogreske tako da, ako bisejedna Web aplikacija blokirala, tone bi tie alo na cijeli Web poslusitl “Takoder je moguée da drugs biblioteka zabtijeva drukéi sigurnosni okois. Sevare- nje druge aplikacjske domene omoguéava da istovremeno postoje dva sigurnosna okoliga Svaka apliaciska domena ima svoj siguenosni sustav, pa aplikacjska domena mole ‘haiti kao sigurnosna granica. Aplikaciske domene nisu dretve (engl. threads i reba bi ib razlikovati od ih \Win32 detva u jednom trenuku posto u samo jedno) aplikaciskoj domeni te moze doznat i izvijestt)u kojojaplikaciskoj domeni se i2vodi. Aplikacjske domene se 450 | Pogamianjech kkoriste da izoliraj aplkacie. Unuraraplikacijke domene u nekomn trenutku mode biti vide dretvi koje se izvode (pogledajte poglavle 22) Da iste vidjeli kako rade aplikaciske domene, postavimo sljededi primer. Pretposta- vimo da Zelite da program instancira klasu Shape, ali u drugo) aplikacijskoj domeni “S| Nema pravog raaloga 2a smjeStan klase Shape u drugu aplikacjsk public votd showprerteft() Conse dastetine( “[(OH] Upper left: (3), (2), Syster-Appbanain.Curzeatbomin.Friendyaate, ppereftsx, uppertet.¥);, ) public class Tester public static oid #oin() i (ongoleirtetioe( “[(0)] (2), Systen.Aptonatn.Currentonsin.Frendyne, Entered tain"), 17 Stara now aplikacsfsky donens Appbonain 962 = ‘ypoonain.createdonain( “Shoe Donan"); 11 hssenbly a» Assenby.LoadFran(“Progesharp.exe"); 1 Object thestape » a.Cestelnstance Shap 11 Instaneiranje Shape cbjekts, Objecttandle on = adp,Createlntince( "rarshaig Warshaing. hope", false, Systen,Reflection-BindingFlage.createlnstance, nil, new object ull, ally nell); G5}, Shape st = (Shape) ob.Unarap()s s.showpperteft(); // Tahtijeva of objets da prikate 11 Bobs ste Iokalny kopu? Posted? Point localPoint = 2.Getippesteft(); 11 bodjedjaje nove vrijednosti {56 | Progamianje ce Peale 9:aspretane ada dali 457 ecaoint oca}POLaLY = 6 1 Prikaauje vrijednost okalngg Point objekta ConselesrsteLine( “[(o}) localPoint ‘Syston Appin. Currenthonain FriendlyAae, ecalPeint.X, localPoint.”); ss Shouperieft(); —1/ rllazuje vrsjednost jot jednon , Proudite kod, ii jo8 bole, seavite ga u program 2a pronalazenje pogreSaka i prodite kroz njega.Ielaz otkriva da se Shape i Point konstruktoriizvode u domeni Shape, bas kao i pristup vrjednostima Point objekata u Shape, Svojstvo je postavljeno u originalnoj aplikacijskoj domeni a lokalna kopija Point ‘objekta je pastavlena na vrijednosti 500 i 600. Kako se Point objekt rasporeduie po veijednost, zapravo postavjate kopiju Point objekta. Kada od shape zatrafite da pr kaze svoju varijablu lanicu upperLeft vidjetcete da je nepromijenjena, Da biste zavrSili eksperiment, komentirajte atribut na vehu deklaracije Point objektai iavueite i komentara osnownu klasw: 1 (serializable) public class Point + RaxshalbyefOnject Sad ponovno pokrenite program. I2laz se dosta razlikuje: (Morshaling.vshest.oxe] Entered Wain [snope Donsie] Shape constructor [Shope Donsin) Peint constructor [ape Danain] Point x.get [snape Dansin] Point y-get [snope Oanaie] upper Left: 3,5 [nape Danaie] Point x-set [Snape Danain] Point y-set [nape Danain] Point Xet [Snape Donain) Point y.get Inarstaling.vshast-exe} laalPoint: 500, 600 {sage onsin) Point x-get [snape Donain] Point y-eet [Shope Danain) Upper eft: 500,600 (Ova) put dabifate posrednika 2s Point objet i svojtva se postavjaju preko posredniles na originalny Point varijablu élanicu. Prema tome, promjene se odrazavaju unutar samog Shope Kontekst Aplikacjske domene su podijeljene na kontekste. Kontekst (engl. context) se mot shvatti kao podruéje unutar kojeg objekti diele pravila kori8tenja Ta pravilauklju- {uju sinkronizaciske transakcije (pogledajte poglavlje 20), i rako dale. 455 | Poganiane ce 2), 2", Kontekstno vezani i okretni objekti ‘Objekti mogu biti vezani za kontekst (engl. context-bound) ili okretni (engl. agile. Ako su kontekstnio vezani oni postoje u nekom konteksti ida bi se snjima kormuni- © dralo, poruka mora biti rasporedena. Ako su okretni, objekti djeluju umutar kontek sta objekta Koji ih je pozvao: njhove metode se izvode w kontekstu objekta koji ih je poevao pa rasporedivanje nie potrebno, Pretpostavite da imate objekt A koji medudjeluje s bazom podataka pa je ornagen da podrZava transakcije. To Gini kontekst. Sv pozivi metoda na objekes A se dogadaju > unutar konteksta zastte koji pruga transakcija. Objekt A mote odlutiti da poni8ti transakelju, a sve akcije poduzete nakon zadnjeg odobrenja su ponistene. Pretpostavite da imate drug objekt, B, kj je okretan. Sad prespostavte da abjeket pro- sljeduje referencu baze podataka objektu B izatim poziva metodu na B, Moda su Ai B ‘apovratno} vezi u kojojée objet B obaviti neki posio i zatim vratitirezutate objektu A, Kako je Bokretan objekt, njegove metode djeluju uw kontekstu objekta koji ih je pozvaa. __ Prema tome, bit ce mu dodieljenazatcita koju pruda objekt A. Promjene koje B napravi uubazi podataka bit Ce ponieene ako A ponisti transakciju jer se mevode objektaB izvode unutar konteksta objekta koji ih je poevao, Do sada sve funkcionira kako treba. Da li bi objekt B trebao biti kontekstno vezan ili okretan? U razmottenom sluaju B je dobro funkcionirao kao kontekstno vezan, Pretpostavite da postoijo8 jedna klasa, klasa C. Ona ne posjedujetransakcijei poziva metodu na objekeu B koja mijenja baz podataka. Sad objekt A pokusava ponistiti rransakciju, ali na nesreé, posao koji je Bobavio 2a C se odvio u kontekstu klase C i zato nie imao podrsku 2a transakcije = Hu, tj posao ne mote biti ponisten. Da je B bio kontekstno vezan objekt kad ga je A napravio, onda bi B nasliedio kon: tekst objekta A. U tom sluéaju, kada je C poavala metodu na objektu B, ona bi cebale biti rasporedena preko granice konteksta, ali kad bi B izveo metodu, onda bi to bilo t © ontekstu transakcije objekta A. Ovo je veé puno boli. £ To bi funkcioniralo ako bi B bio komeekstno vezan, ali bez atributa, B bi naravnc ‘mogao imatt atribute iz vastitog konteksta, a tibi atributi mogli nametnuti objektu E dade u radlititom kontekstu od objekta A. Na prime, objektB bi mogao imati tran: | sakcijski atribut Requirestie. U tom sluéaju, objet B bi u trenutku stvaranja dobie ‘novi Kontekst izato ne bi mogao biti ukontekstu objekta A. Prema rome, kad bi objekt |. A ponitio transakeiju, posao koji je obavio objekt B ne bi mogao biti ponisten, Mogli biste oznacii objektB svrijedoseu enumeracije RequizesNewerje objekt Bkontrolna & meroda. Kad objekt A poduzme akciju nad bazom podataka, on obavjeStava objekt B © koji azurira kontrolu unosa. Ne Zelite da posao koji je obavio objekt B bude ponisten kad objekt A ponisti svoju transakciju. Zelite da objekt B bude u vlasticom transakei © skom: kontekstu, ponistavajui samo vlastie pogreske, ane i one od objet A. | Objekt prema tome ima tri izbora, Pri iaborje da bude oetan. Takviobjekt djeluju ‘ukoncekstu pozivatelja, Drugiizbor je da bude vezan 2a kontekst (Sto se poste izvo enjem iz Contextéoundob ject, ali bez vasttihacributa kako bi djlovao u konteksta Fogle 9:Raporthaneiadna daju | 48 bjekta koji ga je stvorio). Treéii2bor je da bude vezan za kontekst ali $2 atributing ‘kowekesta tako da djeluje samo u kontekseu koji odgovara atributima, S510 éete odabrati ovisi o tome kako ée se objekt korstti. Ako je objekt jednostavan kalkulator koji moda zahtieva sinkronizaciju ili tansakeje ih podedka 2a kontekse onda bi ga trebali napraviti da bude okretan, Ako bi va8 objet trebao koristitt kom tekst objelta koji ga stvara, treba biste ga napravititako da bude vezan za konteket pozivatelja al bez atributa. Konatno, ako va8objekt ima svoje zabtjeve U vez s kon teestom, tebaibiste mu dodijliti odgovarajuée atribue. Rasporedivanje preko granica konteksta Posrednik nie potrehan kad pristupae okretnim objektima unucarjedne aplikaciske domene. Kad objekt u jednom kenteksta pristupa kontekstno vessnom objet drugom kontekst, onda ogni preko posrednikaiprovode se diva pravila Kone 'U tom sista Konteket stata graniu, a pravilo se provodl na granicltzmedu dia kontekst. Na prinjer kad konteksno vezanobjekt ornate atibutom Syston. nterpriseSest- ces.Synchtonization elite da sustav upraviasnkroniacjom tog objckta, Sv objet izvan tog konteksta mora piel granicu konteksta kako bi e povezalis neki od cbjekata, a tada Ge se primenit pravlo sinkronizacje. fnranta dC ne tov nom Kone Sra arb ina pane 4 Ease o corn eli sctan w ensmom Konteksr plikom akavacte [osu dvs objet omatenat sinkroniac, a jedan prosran, ‘onda ée bit smjeSentu rnaitiveKontekste. e 1h ‘Strogo govoret, oxnatavanje dvijuklasaSynehnonization atriburom ne L Objekt! se, ovisno o tome kako su stroxent, drugatije rasporeduju preko granica kon- tekst + Tipiéni objekti se uopée ne rasporeduju. Okretni su unutar aplikacijskih domena ‘+ Objet oznageni atributom Serializable rasporedujuse po vrijednost preko api: kacijskih domena i okcerni su + Objekt koji izvode iz MarshalByRef0b ject rasporedu se po referenci preko apli- kacijskih domena i okretni su + Objekti koji izvode iz Contextooundab ject rasporeduju se po referenci preko apli- kacjskih domena i preko granica konteksta Rad na daljinu (Osim So se mogu rasporedivati preko granica konteksta i aplikacijskih domens, objekti se mogu rasporedivatii preko granica procesa pa Zak ipreko granica racunala. Kad je objekt rasporeden, bilo po vrijedaost il po postedniku, preko granice izmedt procesa il raéunala, onda se kate da se snjim radi na daljinu Razumijevanje tipova posluditeljskih objekata NET kosturu postojedva tip postsitelskihobjekaas koja se move radii na 2 daljinu: dobro poznati i kkijentski aktivirani. Komunikacja sa dobto poznatim objek tima (engl. well known objects) se uspostavlja svaki put kad klient posalje poruk, Za razliku od kiijentski aktiviranih objekata, ne postoji stalna veza sa dobro poznatimt © ebjekcima, Dobro poznat objekti dolazeu dvije varjante: kao unikatni (engl singleton i sjed nun potivom (engl. single cal), Kod dobro poznaih unikatih objekata sve poruke 24 bjela, od svi klijenata,oxpremaiu se jedrom belt koji se izvedi na poslutiteju (nse svara kad se int prvi put poku8aspojts nim i posta da bi prudio uslugu bilo Kojem kljenta koji mu mode prstupt. Dobro poznat objekti morajuimati Kon struktor be parametaa ‘Ako se koristi dobro poznati objekts jednim pozivom, svaku novu poruku od kli- jenta obtaduje novi objekt. To je vlo korisno kod ski uit i oh jet. To je cupina posluzitelja, gdje se nizovi poruka od kljenta mogu naizmjence vbsadivati na razlgitim posluitejima ovisno 0 S opterecenju Klijentski aktivirane objekte najéesée koriste programeri koji stvaraju specializicane poslutielje koji pruzaju usluge specijaliziranimm klijentima koje takoder pisu, U ovom © scenariju klijent i poslutitel sevaraju i odr2avaju vezu sve dok se potrebe klijenta ne sadovelje? }, Zadavanje poslutitelja sa sugeljem Najbolji nazin da shvatite rad na daljinu je da prodete ktoz primer. Napravit éemo jednostavnu klasu Calculator s éetiri metode, poput one koju smo koristiliu ranijoj raspravi.a Web uslugama (pogledajte poglavije 15) i koja implementira suéele prka 2ano u primjeru 19-2 Primer 19.2, Sule kalulatora fregion Using alzectives sing Systens sig System, celLectins. Generic; sing Syston Text endregion * Kien svc objke mogy it manj robusta. Ako poi kjk akvranog objets news, rojektant mora pretpesavt ae chic gubo na penta ga ponorne srt lal :Rayrethane ada dou | st rimjer 19-2, Sugai alkulatora(nastavak) raneepace Gleslstor public interface Tele sowie hal dhe vy deble ys Gouble Sib souste 3, dab 9 i Gouble mal%( doable doable y Js deable Die dole, subley 9; ) ) Spremite ovo u datoteku [calc prevedite u datoteku Calculatordll. Da bistenapra villi prevel ivorms datoteku u Visual Studia napravte novi projekt tipa C# Clas Library. unesite defincju sugelja u prozoru Editi zatim odaberite Build iz Visual Stu- dio eborika. Altemativno, ako ste une izvorni kod u Notepad il neki drug} edtara teksta, mozete prevesti datoteku iz odzivnika, unoSenjem shjedece naredbe: se Rultbrary Teale.cs Postoje ogromne prednosti u implementitanju posluditeja s pomogu suelja, Ako implementirate kalkulator kao klasu, Klijent se mota povezati s tom klasom da bi dklarirao instance na klijencu, To uvelike umanjuje prednost rada na daljinu posto ppromjene na posluditelju zahtijevaj da se adurira definicija klase na klijentu. Drugim jedima, kljent i posluzitel; bi bili tjesno povezani. Suéelja pomatu razdvajanjy dia bjekta. Zapravo, kasnije moZete aZurirati implementaciju na poslutitelju, a sve dok posluditeispunjava dogovor koji namece suéelje, klijent se uopée ne mora mijenjai, lzgradnja postuzitelja Da bse napeavii poshuitl koje koritenu prinjeru 193, napraviteCaleuarorSer teres unovom C# Console Application projekt (obavezno uklutitereferencu prema Calewatordl) i prevedite ga odabirom opele Build szbornika CalculatorServer klasa implementra Cale. Ona i2vodl iz MarshalByReFobject page dlstaviti posredaa kalkulatora Kljentsko)aplikaci: class Calclatrserver + Marsbaltyfefthject, Glelator tale Implementacija je malo sloZenija od jednog konstruktora ijednostavnih metoda koje implementa Ceti metode U primjeru 19-3 logiku za posluitelastavit ete wtbin() metodu CalaulatorServers ‘a8 prvi zadatakje da napravite kanal, Koristte HITTP kao wransportni mehanizam. Motetekoristit TTPChanre tip kojg pruta NET: rchanne chan = ne HTFCaEnel (6500); Primjetite da registrirate kanal na TCP/IP ulazu 65100 (pogledajte raspravu o broje- vvima ulaza w poglavlju 21). Eso IS radi na portu 80. Poo ste registirali HTTP kanal, a nist oi ati reistiajte kanal s pomocu Cranpelservice CLR-a koritenjem satitke metode pegisterChanne!: Channel Services.fegisterchmnel (cha); ‘Ova korakinformira NET cla ete prufati HTTP usluge na port 65100, sino kao ali formate, jpozivi metoda €e Koristiti SOAP formater kao podrazumijevani Sad ste spremni od klase RenotingConfguration zahijevati da registra vae dobro poznate objekte. Morate prosljedit tip objektakojeg lite registrrati,zajedno 58 {avtSnot fockom (eng. endpoint). ZavrSnatockaje ime koje ee Renotingcongurstion povezatisvatim tipom. Ona kompletra adresu. Ako IP adresaidentficearatunalo, dla dentificira kanal, onde earina vodka pokazuje ton uslagu, Dabiste wzcl tip ‘bjekta, modeteKoristiti typeof koji vraéa Type obekt.Peosijedite pun ime objekta fi tip elite Type calctype = typeof “Caleulatorservers.calculatorserver" ); Takoder, proslijedite enumerirani tip koji pokazuje registrirate li Singlecall ili © Singleton: Aen ingConfiguration steve KnowserviceType (Cealetyge, “thetndPotat sell trawdeectNode. Singleton; Poriv Regis terbellknownServiceType stvara posluditeljsk niz odvoda, Sad ste spremni 2zaigru. Primjer 19-3 sadrai ciel i2vorni kod postutitela Prinjer 19-3 Poslutitlkeltulatora region Using directives using Syston: sing Systen-Coections. Generic; sng Systen-Runtine tenting Using Systen Runt ine-Reotirg.Charels; sing Systen-Runtine Renting. Charnes MED; sing Syston. Tents fendegion raespace Calculatorserverts class Clestorsere Marlette. ae ‘ public Calculatorserver() ‘ Console.kriteLine( “Calculatorserver constructor” Ie peta cairo pene coie na nae sae y ‘ Gonsole.Mriteline( "Add (0) + {2)") x ¥ 5 42 | Regaine ole 9: Raperethaneiedna dain | 46 Primjer 19-3, Posutielj kaleulotora(nastavak) return x + y5 y public dowle Sub( dave xy duibie y ) ‘ Console-hritetine( “Sap {0} - (2)", 4, 9s retuin = ¥3 pubic doble Mult( double x, double y ) ‘ Consolesritetine( "mult {0} * (2)", te 9s rey: public double Div( double x, dole y ) t Consote-triteLine( “05v 0 7 4 return © ys ) Pes ) pibiic clase ServerTest ‘ public static void Maint) { 1 Styara anal registrira gx HetpOrannel chan » new HEtpthansel( 65100 ); ‘hannelServices.ReplsterChannel{ cha 3 Type calcType = Type-CetType( "Calculatorservens.caleulatorserwer” ); 1/ Registrixa tip dobro parnatog objekts 4 gowr! poslubitelju 11a pavete tip 28 2215no totkon “thetriPoint™ emo ngconfsguratichRegietetheltnanservicelype Ccaletyper “tnetnchaint”, \ellkrowndbjectRode Singleton ); 11, "They also serve who only stand and wait” (hilton) ConsolesuriteLine( "Pree enter] fo exit...” Jj Conese. Read ire); Kad pokrenete program, on ispisuje poruku: Press Tenter] to exit..- i eka klijenta da zatrazi ushugu, 4A) Progrmicnle {bin iekljudena, poshutel) mo: [ty blok lagradnja Kijenta Dok e CLR unaprijedceitrirai-TCP i HTTP kanal vite ea est kanal za Kent ako Zl primat porranepozive li ko kvistiteneandardn kan vom primera, modet kristi kaval 0 rVPchawal chap = new HTTPCHne} (0s (Chamelservies.Registerchamel(cian}; Klint se sada samo treba spojiti na daljinu prosljedujuéi objelet Type koji predstalja tip objekta kojeg treba (u naSem su¢aju 1Calc suéelie) i Uniform Resource Identifier (URI) usluge. (spent (erogranaing CShoxp-ICale), *nttp://tocalbost;65300/theenPosnt FU ovom slugaju pretpostavljeno je da se poslusieljizvodi na lokalnom ratunalu, pa {© je URL http://iocatnest, nakon koje slijediulaz poslutitlja (65100) izaveéna totka Jou ste deklariraliu poslnzitelju (theEndPoint) ‘Usluga bi tebala vrattiobjekt koji je sucele koje ste trail, Onda ga mozete pretvoriti usuelje i poteti ga koristiti, Posto rad na daljinu ne moze biti zajaméen (mreza moze c bid nedostupan, it), erebal biste upotrebu staviti wy ( Programing ¢Shoyp. Cale eale = ‘ob 25 Programing CSharp IC; ouble sum = eae.Ada3y4)s Sad imate postecnik za kalkulator koji se izvodi na postutitelju, ali koji se mote koris Uti ia khijentu, preko granica procesaili, ako vam se vie svida, preko granica izmedu ‘abunala, Primer 19-4 prikazuje kompletan klijent (da biste ga mogliprevesti morate F ukljuétireferencu na Calculator. ill kao Sto ste to wtinilis CaleServer.cs Primjer 19-4, Kijent kalkuatora trogion Using cinectives sing Systems Using systen Callections.ceneri sing Systen, Rntine Aerating sng Syste. untine-Retoting. Canes; sing Systen, untine Renting. Charset; 1 ain Staten Text, tendregion ronespace CalevlatorClient ‘ Poole 1: Rapretane laden dane | 45 Prine 19-4. Ket allo ran) Upotreba SingleCall Da iste vidjlirazliu igredu Singlecal! | singleton objekata promijenite jedan red ‘yposlutitelskojMain() metodi. Evo postojeceg koda: cats Calechient ‘ femotingcont guration tegsterielknnaServicelype (calelype, necro, UelitrouobjectnodeSireetsn Ys public state void noin() ‘ Ant] myfocaray + ne int(3] onsalecriteLine(Watson, come here 1 need yOd..") 14 Stara Wttp kanal § registries HB senotingContiguratin 17 kori ae 8 Cah ‘etpchonel chan = new Htphanne (0) hesneosnt, (ChamnelServices RegisterChsael (chan); i. Melted ecto. Singles); Inlaz govori da je 2a obs svakog zahtjeva napravljen novi objekt eat ingServices.Comect eof (Calevlater-1eale), Pesos: eco Sess fer on meee Ee Ghatietr cnntnctr 11 nearest ele feats Gutsatorstade toc bf a8 Gteator tle; Be Bekids cotmetr Peas 1 acs sel pone eet Shela entetr Gobi hn = xtcaaioye5 emer double autéerence = cale.S0b(2,425 double product = cBle-MAL(3,¢); ddovole quntient = cale.D8(3,8); |? Razumijevanje metode RegisterWellKnownServicelype Sco se zapravo dogodilo kad ste na posluaitelju pozvali metodu Registerbel KnonSer- vicerype()? Sjette se da ste pribavili objekt Type za klasu Calculator: Type. cettype(“CaelatorServers.Calealetorserver"); 17 Tapteuje rerttate feeline( "348 = fo}, sams steLine("3-4 = 0)", difference); yriteline("3¥a » (0}", Product) Consoleswrintion( "3/4 © {0)", qt Seen Zatim ste pozvali Registertel Xnownservicetype() prosledujuti Type abieke zajedno ss z8¥e5nom to¢kom i Singleton enumeracjom. To govori CLR da instancira Cal- faten( systensexcetion x) f culator i povede ga sa zavrSnom tockom. © case viiteLine( “Exception caught: "Ds Da biste to sami udinili tebali iste modificirati primer 19-3 tako da Main() insta Console AFSL e(ex.tessige)s ) 1 > ? [akon pokretanjs posluitelZeka da korisnik pritisne Ente i tako mu javi da moée prestats tadom. Kijentse pokrecei prikazuje poruku na konzol Klien zatie Roza Sraku od Zetiri operacie. Vidite da posluzitelispisuje poruke nakon poziva metoda, 4 zatim se rezultatispisuju na klijentu To je tako jednostavno. Sad imate kod koji se ivodi na posluzitelju i prude uslige keijenta, {66 | Pogamicanie Ce r EE cira Calculator i onda ju proslijed Marshal() metodi iz ematingServices sa zavrSnom ® sockom kojoj Zelite pridrudei tu instaneu Calculator. Modificitana metoda Hain() je prikazana u primjeru 19-5 i, kao Sto mozete vidjeri, ilaz je Wlentitan onome if primera 19-3, Primjer 19-5, Rug instacranespridrudivanje lase Calculator carina) tock pnb static vold Mang) Wetpchanel chen = now Hethannel( 65200 Ji hamnelservices.fegisterchanel( chan Caleulatorserverts.caleulaterserver calculator © Pode taspredvaneradea daien | 457 Primjer 19-8. Rugnoinstanciranje pridrutivaje Kase Calculator 2avrSnoj tot fastevak) sey calcalatorserver(; enotingierviens.asha}( calculator, “thetndPoint™ ); slau fone toph ste 1 eta (ten tinuleiseine "res (ener] fo ete") Cercle teat; ) Ukupni tinak je dase instancirali calculator objektipidrud na dain zadanojzavtioj 2K. posrednika 2a rad Mogete prebaciti tu datoteku na klijenta i ponovno ju uspostaviti na Klijenskom ragunalu. Da biste to uéinili ponovno napravite kanal i regisritajte ga. Ova) put rmedutims, otvorite Filestzeans dacotekam koju ste upravo kopiralis poslitiela, Fibesteean fiesta « ‘nw FlleStzean ("calcuatorSoap.<9¢", Filetoge.Open); Zatimn instancirajte Soapforaatter | pozovite Deserialize() metodu a fotmaters prosljedujuci ime datoteke i primajuéi natrag Tale Seapforntter soapFornatter = ne Sapeonmatter ()5 wy i Heate caler (cate) sapFornatter.ceserialize (Filestrean); Sad mofete pozvati metode na postuzitelju koristeéi 1Calc koje djeluje kao postednile 2a objekt Calculator koji se izvodi na posluditelju i kojeg ste opisali w ealeulatorSoap, ‘xtdatoteci. Kompletna zamjena za klijentsku Main() metodu je prikazana u primera 19-6. Ovom primjeru crebate dodati dvije using deklaracje. Primjer 19-6. Zamjena za Main) metodu ig primjera 19-4 (kent) sing system; ‘sing S)sten-Runt ne Seriaistion.facnatters 50995 We public statfc void ain’) t Sint} mytataray « new Sota); Console-triteLine("atson, cane here I need you 1 Stara tp kana 1 registrira ge 17 oristé lat 0. FeepOnarne) chan = tt pChannel (0); (hamelservices Reg isterchamel (chat); FideSteean FileStream = 465 | ProgaminjeG Prinjer 19-6, Zamjena za Main) metod ic primera 19-4 lien) (ustavak) row FileStreae (Yealculatorsoap.tat", Filde.tpen); Soapfornatter soaprorntter = ree SaopFornater (); ty ale alee (Ocale) soapromnatter.oesersatize (estreae); 17 Koristt swlelje 22 ponivanje netods double sue = cate. sdd(3.0,4.0)5 dauble dstference » ale, 5u6(3,4); dove protact = cale-mlt(3,¢); feuble quotient » eale.Div(3,4); 11 Aspisuje renultate Console iriteLina("3 = (0)", sam); CopsolesriteLine("S-4 « {0}", aieterene); Console MeiteLine(*3"¢ = {0}", product); ConsoleswriteLine(3/4 = (0%, quotient); caten( Systen.Cxeption ex ) Console iteLina( "Exception caught: “)s Console criteL inex. Nessage); Kad se klljent pokrene, datoteka se usicava sa diska i posrednik se opctiva. Ovo je inverzia operacija rasporedivanja i serijaliziranja objekta na posluzitelu. Kad ste to cobavili, mozete pozivati metode na abjektu Calculator koji se izvodi na posluditeljy, Razumijevanje zavrSnih totaka S10 se dogada kad registtirate zavrSni tocku u priejeru 19-5 (poslufitel)? jasno, poslotel pridruzuje avr totku pt, Kad se gent spoj, raven otha se koto feo indeksutablc ako da posse ote put posredika ravom objke a vem slau kalkulaoru) ‘Ako ne prusite zavrStu totku s kojom bi Wijem komnicirao, mozete umesto toga upisati sve podatke o objektu Calculator u datoteku i fzitki dati tu dacoteku klijenns Na primjer, mogli biste poslat tu daroteku vaSem prijateju i on bi ju mogao utitati svoje ratunalo, Klijent moze deserijalizirati objekt i ponovno uspostaviti postednik kojeg mode koristiti za pristup kalkulatoru na poslutiteju(shededt primjer mi je predlozio Mike ‘Woodring koji je nekada radio u tverci DevelopMentor, koji sliéan primjer koristi da okake kako jezavrSna togka jednostavno pogodnost za udaljeni pristup rasporedenim fe objekcima). Pogle 1 Raspreane lade dou | 4 Da biste vidjeli kako mozete porvati objekt bez poznate zavr8ne totke promijenite ain() metodu iz primjera 19-3 jo8 jednom. Ova} put, umjesto poziva metode tay shal1() sa zaveSnom rotkom samo proslijedite objekt: ObjteF objteF = RenotingServices.tarshal(caleslator) Harshol() vraéa ObjRef objekt. On pohranjuje sve informacije potrebne 2a aktiviranje tudaljenog objekta i Komnuniciranjes njmn. Kad dobijece zavesnu todku poslusitel tablicu koja pridrufuje Objet objekt zavrsnojtozki take da poslazitely moze napravin, posredaik kad klijent ro zatradi. Objekt ObjReF sadrai sve informacie potrebnu ki jentu da napravi posrednik i 0bjReF mode biti serjaliziran COtwvarite tok podacaka 2a stvatanje nove dacoreke i napravite novi SOAP formater MoieteserjaliziatibjRef u tu datoteku pozivanjem metode Serialize() na formatery prosljedujuei cok podataka i dbReF koje vrata Farshal metoda. Br20! Sve informacie koje trebate 2a stvaranje posrednika 2a vaS objekt imate zapisane u datareku na disk Kompletna zamjena za Hain() metodu iz primera 19-5 je prikazana u primjeru 197, Takoder Gete trebati dodati tri using deklaracije u CatServer.cs, kao St je prikazano, Primjer 19-7. Rasporedivanje objekta bee dobro pornate eavrine tocke using system sing Systen10; Ueing Syston SuntineSerLalization.FormattersSeap blic static vod Matn() ‘ 1 Stara Kanal { repisteisa ge Metpchannel chan » new httpchernel (6510); ChanpelServices.Rep\sterchane! (ch); 17 Mapravite vlastitu instanea { Saran pozovite Marshal netody Catevatar calculator = now Calculator); Ojfefsbjtef = Renotingservices.Marshl(calculator); FileSerean fllestrean = new Filestrean("calculatorsoap.txt™Fietode Create); Saaproreater soipFormatter = row SoaFornatter(): Seapforeatter.Serialine(filestrean,obef); filestrean.Cloee(); 1. “Postubuju i one kof stoje 4 eetaju." (H2ton) Consolesitetine( Exported to CalculatorSoap.txt. ress EMTER to ext Console Realine()s Kad ga pokrenete, poslusitelj dodaje datoteku calculatorSoap.txt u sustav datoteka Posluziteljzatim Zeka klijenta da se spoji. Mogao i dugo Zekati (nakon desetak minut se sam gas). 410 | ProgramizanjeC® POGLAVLJE 20 Dretve i sinkronizacija Dretve (engl. threads) su odgovorne 2a mulicasking unutarjedne aplikacie. Imensli prostor Systen. Threading pruda mnostvo klasa i suéelja za upravjanje viSedretvenim programitanjem. Veéina programera moda nikad nece trebati koristiti dretve eks- plicitno, ali to je zato sto CLR odvaja vetinu podtke 2a dretve u klase koje pojedno- stavljuju veéinu zadataka. Na primyer, w poglavlju 21, vidjt éete kako napravitl vibe dretveno Zitanje i pisanje tokova podataka bee preuzimanja nadzora na dretvama Prvi dio ovog poglavlja pokazuje kako pravit i prekidati dretve te kako radtisnjima. ak i ako ne pravite dreive eksplicitno hrjet Cee osigurati da va8 kod mote obradivati vide dretvi ako se izvodi u vigedretvenom okoli8u. Ovo je posebno vaino ako stva- rate komponente koje bi mogli koristti drugi programert u programy koji podrBava vi8edretveni rad. To je posebno vaano projektantima koji razvijju rad na daljinu i ‘Web usluge, Iako Web usluge (obradene u pecnaestom poglavjv) imaju mnoge att bute samostalnih aplikacija,one se izvode na posluttelju, opéenito ins nedostaje kor snigko suéelje i prisiljavaju projekcante da razmiiau 0 poslusiteliskim pleanjima kao sto su ueinkovitost i vigedretvenost. Drugi dio ovog poglala se vise fokusira na sinkronizaciju. Kad imate ograniene resurse (kao Sto je veea prema bazi podataka), motda éetetebati ogranitt pristup tom resursu od strane nekedretveudanom trenutku. Olina analogijajesszahodom usavionu, Zelite dozvolt pristup zahodu samo jedno}osobi w nekom trenutku. To se izvodi postavianjem brave na vrata. Kad putnic fle korstit zahod, preo probaj drsku na veatmia, Akoje zakdjuéano, oil odu radi neu drugilistplvoéekajuu redu s drugima koj ele pristupic esursu. Kad resurs postaneslobodan, jena osoba iz eda dobiva resus koj se onda ponovro zakljuzava Povremeno, razne drerve bi mo%da hijele pristupitiresursu u programu, kao St je datoteka, Moglo bi biti vazno da osigurate da samo jedna dretva u nekom trenutku ima pristup resursu pa ete zakljuéatiresurs, dozvoit to} dretvi pristup i onda otklju ati resus. Programske brave mogu biti prilitno sofisicirane, osiguravajuéi poStenu raspodjelu resursa m Dretve Dretve se tpiéno svaraju kad Zelte da program radi dvijeswvariodjednom. Ne pi imier, pretpostavimo da Zeliteizratunat pi (3141592653589... na miljarditu dec tal, Pocesor ce veselo pokes sazunati ali nista Se neceispisivaina zaslonu, Posto eto ra€unanje potrajati nekoliko tedana, moida bist heel da procesor prs infor, tmacije o napretku dok radi. U dodstku, mozds bi jel osigurati guinb Stop take da \erisnik moée zaustavitiraéunanje u bilo kojem trenutku. Da bi dozvolit program da obraduje prcisak na gum Stop tebat cece drugu dretwu i2vodenja Jo8 edna situacia ked éee esto korstii dretwe je kad morateéekati neki dogadaj kao 410 je korisnik ulaz, cane iz datoteke ili primanje podacaka preko mede. Doz vanje procesors da obra pozomnost na drugizadatak dok éekate (ks0 0 je ra€unanje {98 10000 vrjednostibroja pi) je dobra idea i omoguéava progeny da radi jos be Unekim sitvacijama dretve mogu usporti program. Pretposcavite da osim irragunava- sa beoja pi telite odreditiFibonaccijev niz (1,1,2,3,5,8,13,21..). Ako imate vigeproce- sors Sustay radunanije ée se izvoditi brie ake svaki procesor raguna u posebnoj dretv ‘Ako imate jednoprocesorski sustay, (kaa Sto vetina korisntka ima), eaSunanje ovih vt. jednost u vie dretv ée se izvoditi sporje nego taéunanje jedne pa onda drugew ist) rec jer se procesor mora prebacivatl izmedu dretvi, To dodarno opeerecuje sustay. Pokretanje dretvi ‘Najjednostavnilji agin da napravite dretvu je da napravite novu instancu klase Thread. Thread konstruktor uzima jedan argument: delegate instancu. CLR pruza klasu dele- gata Threadstart posebno 2a avu svrhu. Ona upuéuje na metodu koju zadate. To omo- guéava da se napravi dretva i da joj se kaze: ,Kad se pokreneS, igvedi ove metod Deklaracija ThreadStart delegata je: public delegate vosd ThreadStart(); Kao Sto modete vidjeti, metoda koju pridrugite ovom delegatu ne smije uzimatiparame- te i mora vraéati void. Prema come, modete napraviti navu dretvu na sliededi natin Thread syThread = new Thead( neu Threatsnae (nyu) 5 [Na primer, mo¥ete nepraviti dvje radne dretve,jednu koja broji od mule: Public void tncrenenter() or (iat & 205510005564) ConsolesMriteLine("Increnenter: (0), 4); ’ {jednu kofa broji prema od 1000 prema nuli public void Decrenenter() for (Int £ = 10;8938--) TD | Pegrmicajece ConsoleshriteLine("Becrenenter: {0}", 1) ) ) Da biste ove metode i2vodili u dretvama napravite nove dretve | iniijaliziaje sh s ThreadStart delegatom, One €e iti iniializirane odgovarajucim metodama: ‘aese th = not Thread new Theeadstart(sncrenente) )s ‘aead 12 © new Thread( new Treacstar\(Oeremente) Instanciranje dretvi ih ne pokreée, Da biste pokrenuli dretve morate pozvati Start ‘metodu na Thread objekcu: Start()s Estart( & 58 ako nepodanee dalle kosher sezattava kad metada ati | 4B, Videteetekako rasta deta pjenego So metoda Wat sn 4 ovom posi. Primjer 20-1 prikazuje cijeli program i njegov ilar. Trebat éee dodati using deklara cou za System. Threading da prevodine} uzme u obzir klasu Thread. Obrative paiju na ialas gdje mozete vidjri kako se procesor prebacujeizmedu ts i t2., Primjer 20-1, Upatreba dretv region Using disectives sing Syston (ing Ssten Collections Cenertc; ‘ng System. Texts sng Syston. Threading: senaregion ronespace Usngthreade lass Tester ‘ static vosd Main) 1/ beavk instancy Klae6 Tester t = now Tester(); onealeseteline( “Mello” } 11 Tweed 52 Sivan statigke Min ‘eotest(); pubic veld tatest(} ‘ 11 Seyara éretwy 22 Inereventer Pose Oreeonacs | 473 Primjer 20-1, Upotrca dec (rastavak) 11 proshjeduje TreadStart delegata U1 5 sdreson Incronenters fheexd th = nen Teal ew TareadStart( Increnenter ) ): 1) Stara dnetvy 22 Decreenter 1 proskjeduje delegsta Thresastart 1 © soreson Decrenenter Thread 12 = en Thread ‘a ThzeadStart( ecrenenter ) Ji 11 Pokcete dretve ‘a.start()s starts ) 17 kana netoda, bro}h do ak piblic void Tncroneter() C for ( int $+ 0; £ ¢ 30005 Jor) ‘ ) ? systen.conste risen Increneater: 0)" 4.) 17 tokoane wetoda, Y70}i uratrag od 2k public void Secrarenter() for ( int £ = 200; 19> 9; > ) y ) -) systen.consoeertLine( “Decreneter® {0)", 1 Js nia (oslo) Incresenter Increnenter: Sncrementer ncrementet Tncrenent= Dscrementer: Deerenenter Decrenenter: Decrewenter: 12 us 36 o oo 7 Procesor dozvoljava prvoj dretvi da se izvadi sve dok ne dode do 106, Onda se ubacuje druga dretva,brojeei neko vejeme unatrag od 1000, Zatim jeopet prvojdretvidozvoljeno dda se iavodi. Kad era primer pokrenem za veée brojeve, pritnjegeujem da je svakoj dretvi ozvoljeno da odbroyi 100 broeva prije nego Sto se izvedba prebaci na drugu deta. Kolko vemenabitidodicheno sks dretoskedyjeprogramazaaigo redivanje dev (engl head schedee\cvisi mnogo ibn kao 0 su bein procera za prema proceso od di programa wd Spajanje dretvi Kad ka2ete dretvi da prestane siavodenjem i prigeka dok druga dretva ne zavrSi posao tada ste spoil pov dreev sdrugom, To je kaoda ste porczl th prvedretve na ep dirugedeetve,dakle spot abi povezali dretvu I (ta) s dretvom 2 (t2), napisite: s2.20in05, Ako se ova deklaracija iavede metodi u dretvi ts, onda ée tt stati i Gekati dok se t2 ‘ne zavri. Na primjer, moglibiste od drevew kojoj se zvodi Maint) zacrait da sateka sve ostale dretve da se zavtse prije nego Sto ispife svoj zakljuénu poruku. U sedecers ‘odlomku koda prespostavt éemo da ste napravili kolekeiu drew nyThreads. Prodite kroz kolekciju spajaju trenutn dretvu sa sedeéom dretvom iz kolekcje: veh (Oheednytnread in ayuesds) ytivead.205n(95 Consoe.driteLine(ADl wy Utes ate done") orukaAll my threads are done neéc bit ispisana dok sve dretve ne gave, Ustvarno} situacij moglibiste pokrenuti niz deetvi za obavljanje zadataka (na primer, za isis, aburiranje prikazaite,) ine nastavljaiglavnu dretwu dok sve radne drevve ne 2avtSe Odgadanje dretvi s pomocu metode Sleep Povremeno éete jet odgoditdretyu na neko vrjeme. Na pre, owl bist eet sata 2aystavit na sekund izmedu provjere sstemskog viemena. To omogucava riksz novog ‘veemena oxpiik edom u sekundi bez troenja sina miljunataktova procesor ‘Thread klasa pra javnu satitku metodu Sleep pascbno za ovusvthu, Metoda je pre- ‘opteceéena: jedna inatica wzima int a druga tineSpan obelt. Svaki argument e bro} milisekundi na koje Zeit odgodit i2vodenje deetve izazen i kao int vejednost (na primer, 2000=2000 milisekundi ili dvje sekunde) i kao timespan, Jako tinespan objekti mogu merit trenutke (100 nanoseeandi, zrmatost Sleep) metode je milisekundama (1000000 nanosekund). | Pasamianie Vesanje70-Drebeisinkeniachs | 05 Dabi odo dreten na jedi sckundu modete pozvat statu metodu Tread. Sleep Ieoja odgada drecvu u kojoje pozvana Thread Slesp(s00)5 Povremeno éete kao period odgadanj dretvenavest nul. To program za rasporediva je dretvi govor da biste hye da drewu paepust deugpjdretvi da se izvodi, Ek sky bi program 2a rasporedivanje dreti prvoj dretvi dao jo$ malo vemtena 2a 2voderje ‘Ako promijenite primes 20-1 dodavanjem thxead.Seep(s)iskaza nakon svake Write Line() lax de se anstno promi for (int 3 =0;s000;14) i onoterite in eaarentet” (OF, 1; tireatssew() ) ‘Ove mala promjena je dovolina da svako| dretvi da priliku da se ivi dok druga dretva spisuje vijednos. Lela odraZava ovU promjen: Increenter: 0 Decrorenter: 100 Cecreenters 599 Decremeter: 398 Decrereners 391 Tncrenetet: 3 ecenenter: 336 Tncrerenter: 6 Decrometer: 95 Prekidanje dretvi Dretve se obigno prekdaju nakon Sto cbave posao. Medutim, motetenaredit det dase pickine. Napoli natin ato je da postavite KeepAlive Boolean zatavic koju dreevumote poyremeno prove. Kad astavicapromienstanfe (a primjt,sa rte ta false) dretva se moze sama zaustavih ) Vidite kako se prva dretva pokreée i smanjuje viljednost 100 na 99. Druga dretva se pokreéei sada se dvije dretve preplicu dok se ne pokrenu trea iZetvrta dretva. Nakon inekog vremena, Thread? javi da je zaustavjena ionda javla da ilazi. Malo poslie toga, Threads javlja da je prekinuta. Posto prekid Geka da deetva bude u stanju éekanja, ona ‘ne mora biti prekiuta istog trena kao kad se poziva thort metoda, Dvije preostale } deja je da simulirate posao Koji bi mogao biti obavljan s kontrolixanien resursima BaS kao Sto biste mogli otvoriti datozeku, obraditinjen sadrZa i onda ju zatvort, ove uticavatevrjednost variable counter & privremenu varijblu, poveéavate ju 2a jedan, Cekatejednu milisekundu da simulirate rad i onda dodijelite poveéaru vrijed nost narag vstijabli counter Problem eto prvadrerva ite vriednost variable counter (0) dodijeljuje ju privremenc} ‘arjabli. Onda za jedan poveéavaprivremenu vaijablu. Dok obav svoj posao, druga ‘dretva tava Vejednost variable counter (8 uiek 0): dedieljuje ja privtemenoj va jabli. Prva deetvazavrSis posiom i nda dodieluje privremena vriednost (1) natrag vat- jbli counter prikazaje ju, Druga dreta gin isto. Ono tose ops je tJ, Usededem prolazu dogada se isto, Umjesto da imate dvije deve koje btoje 1,2, 3,4, vidjet ete 1, 2.3.3, 4,4, Primjer 20-3 prikazuje kompletan izvorn kod iilaz va ovaj primis. Primer 20.3, Simulacijadiienog resurse region Using directives sing system; Using System. collections. Ceneric; using ssten. Text sing Syston Threading; endregion ranespace Sharedtesource class Tester ‘ private int comter state void nain() 11 Stara instance ove Kase ‘ester t= ne Testen(); 17 Teves 8 Savan statizke Nain t.oorest(); ible void oorest() ‘ Thread tr = oon Thread( new Tneadstart( Incranenter {aeTstackground « true ‘a kone = "Treadone"s ester; onsale sriteLine( "Started thread (0)", tone) ‘Thread £2 = new Thread now ThreaéStart( Increnenter ) ‘2.1sbackgraand « trues aihone = "Thread"; f2start();, Consohenkrielioe( "Started thread (0 tahoe ta.toing t2.30in()5 17 Kad su aye deetve gotove Aspe poruky Console saitetine( “All ny threads 1@ done”; > 17 obusna metoda, bros do 1K public vote Incremeate() wy 480 | Prograiewie ce ale Oreelsakenicacia | «Bh Prin 20-3, Simulacja deienogresursa(nastavak) ‘ tte ¢ counter «1000 ) nt exp ~ counter; teopiey /F Povetavange 1) Simaira obavtjanfe posta ‘Thread. Sleep 1); 11 brideutuje poveéano vesjednost U1 § peicase reultat founter = temp; Console rite ine( "thread (0). Therenenter: (3}*, Thread.currentTneod Wane, ceunter } } ‘atch ( Threadinteruptedtaception ) { Conse tritetine( "thread (0) interrupted! Cleaning wp...", Thread.currentTivess.tone ); finally Console sieline( “thread {0} Exiting. *, TheesdsCurreneThead. Nine) > , , , sn: Startee theod Theeadone started thread TheeadIno Thxeod Thresotne. Increnenter: Thread Threodne. Increnenter: Threod Threadtne, Inceenenter: ‘hreae Theadivo. Inceenener: ‘Thzeas Tneadtuo. Increnenter ‘Thread TareadOw.Increnenter: Thread Threactwo, Inerenenter= Thread Thread. Increment: Thread Threano, Inerenenter Thread ThreadOe Tncrementer Upotreba klase Interlocked CLR pruza veti broj mehanizama za sinkronizaciju. Medu njima su opéi sinkronizacij- ski alati kao 3to su krititni dijelovi (u .NET-u se nazivaju lokoti) i Monitor klasa. Oba alata su obradena kasnije u ovom poglaviju. Povecavanje i stanjivanje vrijednosti za jedan je take uobigajen progeamerski model esto treba sinkronizacisku zasttu. Zbog toga CLR pruza posebnu klasu interlocked samo za ovu svrhu, InterLocked ima dvije metode Increnent i Decrement koji ne samo da poveéavaju i umanjuju vrijednost, veé to rade uz kontroliranu sinkronizaciju Promijenite Increrenter metodu iz primera 20-3 na sliedeti natin: public vod Tnerenenter() ‘ ty ite (counter < 1000) { int tenp » Interlock. Increvent(ref counter); 1 Sinahira obavljonje posta Teas. sleep(0); 1 Prikazuje uveéans vr jednost Console sritetine( “theead (0). Increnenter: 2)", ‘ThresdCurrent Thread te, te) ? } Blokovi catch ifnally ce ostatak programa ostaju nepromijenjeni w odnosu na pret bhodni prime. Interlocked.Incresent() ofekuje samo jedan parametar:referencu na int vijednost Posto se int vrijednosti prosiieduju po veijednosti upotrijebite kjuénu rije€ ref kao Sto je opisano u poglavhu 4 Ee Inceesent() metoda je preoptereéena imate waimat eeferencu na vt AS 4, iednose Long umjesto na int Kad je ova promjena utinjena pristup counter varjabi je sinkroniziran | izlaz je kao Sto ofekuyjete, az (odtonae): Started thread Threaomee Starteé tmead Threads ‘Thnend ThreadOe. Increments: Thresd Thveastin, Lncrenentes Thvead TheeadOne Tcrenerter Trend Threaelwa, increenter Thread Theadine. Incrennter Thread Theadtvo, Increneter: Thread Threadne. Increneter: Thread Theadtio” Increnenter: Thread Thresdne, Increneter 42 | hroganiane Pole 20: ve neicaia | 83 ‘Thread ThreadTao, Irerenenter: Thread Theaddve. Herenenter ‘heead Thread. Ceerenerter Thtead ThreadOne, Inevnenter ‘heead ThreadTno. Cerenenter Thread Tareasve, Ssevenenter Thread TareadTwo. Tnrenenter Threod Tareas. Inrenenter Thyeod ThreasTn. Increnenter Thread ThreadOne. Increnenter Thread Threading. Tterenenter Upotreba lokota Tako jeobjeke InterLocked prikladan kad Zelice poveCat ili smanjiivrijednos, postjat { situacie kad éetehrjti kontroliat pristup i drugim objektima. Dakle potteban je ‘opéi mehanizam za sinkronizacju. U C# to pruga znaéajka lock Lock ozna¢ava kritiéan dio koda pruzajui sinkronizaciu zadanom objektu dok lokot djeluje. Sintaksa znatajke Yock je dase 2a objektw zatcai loka zatim izvedeiskaz il blok iskaza. Lokot se uklanja na kraju bloka iskaza. (C# pruta izravnu podriku za lokote s pomocu klutne rijett leek. Prosiedite ref rencu na abjekt inakon kljuéne rijeti dodaje blok iskaza lock( izes) lok tskara [Na primer, snoZete ponovno promjeni nadin: ‘ncramerter da korist Lock iskae na sjededi Public void Enerenenter() ty vile (eaumter « 2700) ‘ int temp; Jock (this) c temp = courters tem +45 ‘est. Slees(t); counter » temps , 17 Peideutufe wvetanu vesjednost A/S prikaauje rezattat onze. teLine( “Tpccad {0}. Tnereenter: (2)*, ‘Threod.CorrentThead. ane, tem); ‘atch feally blokovi ostatak kode su nepromijenjen u adnosu na prethodni primer. Jelaz ovog koda je idenitan onom koje natao koistenjen interlocked klae Upotreba monitora Objekti koje smo do sada koristili bit ée dovoljni za veéinu purreba, Medutinn, 72 naj- softiianje upravjanje resrsima, mo¥da Cte het kant onion Moor vn prepusta da odie kad poet: prestatia sinkronzaiom i omoguciys da Cate ok drugi do koda ne postaneslobodan. Kad poielte poéeti sa sinkronizacom, pozovte Enter() metody_ monitors, prosieévjuc objet ho fle races ena. tter( ns) ‘Ako monitor nije dostupan, pretpostavkaje dase objekt koji je zafticen monitorom kkorsti. Motete radi neSto drugo dok Zekate da monitor postane dostupan i onda pro- baci ponovne. Takoder moteteeksplicitno odabratiWait() metodu i odgoditi dretvu ‘dok monitor ne postane dostupan i projektant ne pozove Pulse (uskoro ée biti objas- njene). Mait() pomage da upravljate poretkom dretvi, [Na primer, pretpostavite da ucitavate | ispisujuete clanak s Weba. Radi utinkovito- ci, Zeit ispisivati pozadinsko} dretvi ali Zelice osigurati da je barem deset stranica _uicano prije nego pognete. ‘Dretvaza spisivanje ce Cekati dak dretva za pribaujanje detoteke ne javi da je dovoan dio datoteke uéitan. Ne Zelie povezati Join iskazom dretvu za uzimanje podataka jer bi datoteka mogla imatistotine stranica. Ne lite éckati da se uitavanje zai do raja, ali elite osigurati da je barem deset stranica uitano prije nego potne dretva za ispisivanje Wait() metoda je samo ulaznica Da biste ovo simulirali ponovno napisite Tester i dodajte metodu za umanjivanje. Metoda 2a uvecavanje broji prema gore do deset. Metoda 2a umanjivanje broji dale do nue. Ispadia da ne elite poseti umanjivat osim ako je vrijednost varijable counter barem pes. U decrenenter metodi, pozovite Enter na monitor. Onda provjesite vijednost varia ble counter i ako je manja od pet, pozovite Wait na monitoru, iF (counter « 5) . t Monitor koit(this); Poziv vait() metode oslobada monitor, ali javiia CLR-u da Zelite monitor natrag sie deci put kad bude slobodan. Drerve koje éekaju su obavijestene o prilici da nastave s radom ako aktivna drewva pozove Pulse) Monitor. Pulse(ehés); | Pogenianje@ PajanjeDi:Drcesaodads |S

You might also like