programiranje c# 2.0 4th liberty knjiga hr

614
  PRIJEVOD ČETVRTOG IZDANJA Programiranje C#   Jes se Liberty   A Ać Gć I T E x p e rt  0 ’REILLY®  

Upload: mirko-mirkovic

Post on 03-Nov-2015

146 views

Category:

Documents


8 download

DESCRIPTION

C# 2.0 Programiranje Liberty Knjiga na hrvatskom

TRANSCRIPT

  • PRIJEVOD ETVRTOG IZDANJA

    Programiranje C#

    Jesse Liberty

    Prijevod:

    Ana Anti

    Marko Grgi

    I T E x p e rt

    0 REILLY

  • Programiranje C#, prijevod etvrtog izdanja Jesse Liberty

    Nakladnik: Dobar Plan, Zagreb Za nakladnika: Tomislav Komik

    Urednik: Aleksandar Dragosavljevi Prilagodba omota: Maja Halapija

    Tisak: Denona, Zagreb

    Copyright 2005 Dobar Plan, Zagreb. Autorizirani prijevod engleskog izdanja knjige Progratntning C# , Fourth Edition 0 Reilly Media, Ine. Ovaj prijevod je objavljen i prodaje se s dozvolom 0 Reilly Media, Ine. koja je vlasnik svih prava za objavljivanje i prodaju.

    Iako je tijekom prijevoda i pripreme ove knjige za tisak uloen veliki trud kako bi se izbjegle pogreke, autor i izdava ne preuzimaju odgovornost za pogreke ili propuste niti za tetu koja bi mogla nastati upotrebom informacija iz ove knjige.

    CIP - Katalogizacija u

    publikaciji Nacionalna i

    sveuilina knjinica -

    Zagreb

    UDK 004.43 C#(035)

    LIBERTY, Jesse

    Programiranje C#

    / Jesse liberty ; prijevod Ana Anti, Marko Grgi. - Zagreb : Dobar Plan, 2005.

    Prijevod djela: Programming

    C#, 4th ed. - Kazalo.

    I5BN 953-95207-1-1

    I. C# programski jezik --

    Prirunik 451124026

    L J

    ISBN 953-95207-1-1 3 2 1

  • Sadraj

    Predgovor ........................................................................ ix

    Dio I JezikC#

    1. ProgramskijezikC#i.NETkostur .......................................... 3

    Platforma .NET 3 .NET kostur 4

    Prevoenje i MSIL 6 Jezik C# 6

    2. Poetak:HelloVVorld" ............................................................. 9

    Klase, objekti i tipovi 9 Razvoj programa Hello World 16 Koritenje programa za ispravljanje pogreaka 20

    3. Osnove programskog jezika C # ............................................... 23

    Tipovi 23

    Varijable i konstante 28 Izrazi 35 Bijeli prostor 36 Iskazi 37 Operatori 52 Naredbe za pretprocesor 60

    4. Klase i objekti ............................................................... 64

    Definiranje klasa 65 Stvaranje objekata 70 Koritenje statikih lanova 77

  • Unitavanje objekata 81 Prosljeivanje parametara 84 Preoptereivanje metoda i konstruktora 90 Uahurivanje podataka sa svojstvima 93 Polja readonly 97

    5. Nasljeivanje i polimorfizam ............................................. 99

    Specijalizacija i generalizacija 99 Nasljeivanje 102 Apstraktne klase 109 Korijen svih klasa: Object 113 Pakiranje i raspakiravanje tipova 115 Ugnjeivanje klasa 117

    6. Preoptereivanje operatora ................................................120

    Koritenje kljune rijei operator 120 Podrka ostalim .NET jezicima 121 Stvaranje korisnih operatora 121

    Logiki parovi 122 Operator jednakosti 122 Operatori pretvaranja 123

    7. Strukture ............................................................................129

    Definiranje struktura 129 Stvaranje struktura 132

    8. Suelja ........................................................................ 136

    Definiranje i implementiranje suelja 137 Pristupanje metodama suelja 145 Premoivanje implementacija suelja 153 Eksplicitna implementacija suelja 156

    9. Polja, indekseri i kolekcije .................................................... 166

    Polja 166 Iskaz foreach 171 Inicijaliz'iranje elemenata polja 172 Indekseri 184 Suelja kolekcija 193 Ogranienja 196

    vi | Sadraj

  • List 201 Redovi 212 Stogovi 214 Rjenici 217

    10. Nizovi i regularni izrazi ........................................................ 220

    Nizovi 221

    Regularni izrazi 235

    11. Obrada izn im k i ........................................................................ 245

    Izbacivanje i hvatanje iznimki 246 Objekti Exception 255 Prilagoene iznimke 258 Ponovno izbacivanje iznimki 261

    12. Delegati i dogaaji ........................................................ 266

    Delegati 267 Dogaaji 281 Koritenje anonimnih metoda 294 Dohvat vrijednosti iz vieodredinih delegata 295

    Dio II Programiranje na jeziku C#

    13. Programiranje Windows aplikacija ................................ 305

    Izrada jednostavnog Windows Forms obrasca 306 Izrada Windows Forms aplikacija 310 XML komentari za dokumentaciju 334

    14. PristuppodacimakrozADO.NET ....................................... 337

    Relacijske baze podataka i SQL 337 Objektni model ADO.NET-a 341 Poetak rada s ADO.NET-om 343 Koritenje OLE DB upravljanih izvora podataka 346 Rad s kontrolama za podatke 349

    15. Programiranje ASP.NET aplikacija i Web usluga 356

    Razumijevanje Web Forms obrazaca 357

    Izrada Web Forms obrasca 361 Dodavanje kontrola 365

    Sadraj | vii

  • Povezivanje podataka 367

    Web usluge 377 SOAP, WSDL i otkrivanje 377 Izrada Web usluge 378 Stvaranje posrednika 383

    16. Sastavljanje u cjelinu .......................................................... 389

    Ukupni dizajn 389 Izrada klijenta Web usluge 389 Prikazivanje rezultata 399 Pretraivanje po kategorijama 408

    Dio III. CLRi.NET kostur

    17. Sklopovi i rad s inaicama .................................................415

    PE datoteke 415 Metapodaci 415 Sigurnosna granica 416

    Manifesti 416 Sklopovi s vie modula 417 Privatni sklopovi 425 Dijeljeni sklopovi 425 Global Assembly Cache 428

    Izrada dijeljenog sklopa 428

    18. Atributi i refleksija ........................................................... 431

    Atributi 431 Refleksija 438

    19. Rasporeivanje i rad na daljinu ...................................... 448

    Aplikacijske domene 449 Kontekst 458 Rad na daljinu 460

    20. Dretve i sinkronizacija .................................................. 471

    Dretve 472 Sinkronizacija 480 Stanja natjecanja i zastoji 489

    viii | Sadraj

  • 21. Tokovi p o d a ta k a ............................................... 491

    Datoteke i mape 492

    itanje i upisivanje podataka 502 Asinkroni ulaz i izlaz 510 Ulaz i izlaz podataka preko mree 514

    Web tokovi 533 Serijalizacija 536 Izolirano spremite 544

    22. .NET i COM programiranje .............................. 548

    Uvoenje ActiveX kontrola 548 Uvoenje COM komponenata 556 Izvoenje .NET komponenata 564 P/Invoke 567

    Pokazivai 570

    Dodatak: C# kljune rijei .......................................................... 575

    Kazalo ....................................................................................... 581

    Sadraj | ix

  • Predgovor

    Otprilike svakih deset godina pojavi se nova tehnologija koja promijeni na stav prema razvoju aplikacija. Poetkom 1980-ih pojavio se operacioni sustav Unix koji se mogao pokrenuti na stolnom raunalu, a tvrtka AT&T razvila je moan novi programski jezik C. Poetkom 1990-ih pojavio se operativni sustav Windows i jezik C++. Svaka nova teh- nologija predstavljala je veliku promjenu u pristupu programiranju. 2000. godine uslije- dio je novi val koji je donio .NET i C# , a do kraja 2005. godine donjet e i .NET 2.0.

    Microsoft se kladio 1 na .NET. Kada tako velika i utjecajna tvrtka potroi milijarde dolara i promijeni cjelokupnu strukturu poduzea kako bi podravala novu platformu, to ne ostaje nezapaeno meu programerima. .NET e ustvari promijeniti va stav prema programiranju. Ukratko, radi se o novoj razvojnoj platformi ija je svrha olakati objektno orijentiran razvoj za Internet. Programski jezik koji je izabran za ovu plat- formu je C# , smiljen na temelju ranijeg iskustva sa jezicima C (odline performanse), C++ (objektno orijentirana struktura), Java (sakupljanje otpada, visoka razina sigur- nosti) i Visual Basic (brz razvoj), s namjerom stvaranja novog jezika koji e u potpuno- sti odgovarati vieslojnim Web aplikacijama temeljenim na komponentama.

    C# 2.0, jezik odabran za .NET 2005, sadri aurirane alate i novi snani razvojni oko- li. On predstavlja najvee dostignue Microsoftovog ulaganja u istraivanje i razvoj. Jednostavno je sjajan.

    0 knjizi Ova knjiga je prirunik za C# i pisanje .NET aplikacija s pomou jezika C# .

    Ako ste programer koji se dobro slui jezikom C# 1.1 i samo elite saznati koje su nove znaajke jezika C# 2 .2 , odloite ovu knjigu i kupite Visual C# 2005: A Developers Notebook (u izdanju 0 Reilly Media, Ine.).

    Ako, s druge strane, elite poboljati svoje vjetine programiranja ili se dobro sluite drugim programskim jezicima kakvi su C++ ili Java, ak i ako se nikad niste upoznali s drugim programskim jezikom, ovo je prava knjiga za vas.

    xi

  • to vam treba za koritenje ove knjige Od beta izdanja programa Visual Studio Whidbey (2005) pristup radovima tvrtke Microsoft mnogo je jednostavniji. Dostupno vam je nekoliko mogunosti: ba kao to Visual Studio ima mnogo inaica, tako su i demo inaice .NET-a 2 .0 i Visual Studija 2005 dostupne u razliitim oblicima:

    Preuzimanje SDK Beta SDK, zajedno s prevoditeljima za pokretanje u naredbenom redu, dokumen- tacijom i drugim alatima, moe se besplatno preuzeti na adresi http://msdn.micm- soft.com/netframework/downloads/updates/default.aspx. Datoteka za preuzimanje nije velika, ali bit e vam potreban vlastiti program za ureivanje koda (moete koristiti bilo koji, od Notepada do SharpDevelopera).

    Express izdanja Microsoft je izdao i ogoljene inaice platforme Visual Studio koje su male pa ih lako moete preuzeti s Internetra i pokrenuti. Express inaice moete preuzeti na adresi http://lab.msdn.microsoft.com/vs2005. Za veinu primjera iz ove knjige koristite Visual C # Express. Za neke primjere bit e vam potreban Visual Web Developer Express, a za neke ADO.NET primjere morat ete instalirati SQL Ser- ver Express ili MSDE (Microsoft Data Engine).

    Beta i Community Tech Preview Pune inaice platforme Visual Studio 2005 dostupne su za preuzimanje u dva for- mata: Community Technology Preview (CTP) koji djeluje pomalo nedovreno te potpuno beta izdanje. U vrijeme pisanja ove knjige, CTP formati bili su dostupni MSDN pretplatnicima na Visual Studio Professional, Standard i Team Systems. Beta 1 inaica Visual Studija Professional takoer je dostupna MSDN pretplat- nicima, a ostali plaaju samo trokove potarine. Vie informacija potraite na http://lab.msdn.microsoft.com/vs2005lgetldefault.aspx.

    Mono Projekt Mono je razvojna platforma otvorenog izvornog koda koja se temelji na .NET-u. Sponzorira ju tvrtka Novell, a moe se koristiti na operativnim sustavima Linux, Mac OS X i drugima. Iako je trenutna inaica namijenjena za .NET 1.1, moete ju instalirati s podrkom za neke .NET 2 .0 znaajke. Vie informacija potraite na http://www.mono-project.com/about/index.html.

    etvrto izdanje Programiranja C# moete koristiti za sve navedene okolie. Slike zaslona mogu se, meutim, razlikovati jer je svaki od ovih okolia u drugoj inaici.

    Kako je knjiga organizirana Prvi dio knjige bavi se pojedinostima jezika, u drugom dijelu moete nauiti kako se piu .NET programi, a u treem je dijelu opisan nain koritenja C# .NET Common Language Runtimea i Framevvork Class Libraryja.

    xii | Predgovor

  • Dio I, Jezik C# Poglavlje 1, Programski jezik C# i.NET kostur predstavlja uvod ujezik C# i platformu .NET.

    Poglavlje 2, Poetak: Hello World opisuje jednostavan program kao uvod u sljedea poglavlja te vam predstavlja Visual Studio IDE i razne koncepte jezika C# .

    U Poglavlju 3, Osnove programskog jezika C# , opisane su osnove jezika, od ugraenih tipova podataka do kljunih rijei.

    Klase definiraju nove tipove i programeru omoguuju proirivanje jezika kako bi bolje mogao oblikovati problem koji pokuava rijeiti. U Poglavlju 4, Klase i objekti, opisane su komponente koje ine bit jezika C# .

    Klase mogu biti kompleksna predoenja i apstrakcije pojava iz stvarnog svijeta. Pogla- vlje 5, Nasljeivanje i polimorfizam, bavi se odnosima izmeu klasa.

    U Poglavlju 6, Preoptereivanje operatora, moete nauiti kako svojim korisniki defi- niranim tipovima moete dodati operatore.

    Poglavlja 7 i 8 su uvod u Strukture i Suelja, kategorije srodne klasama. Strukture su jednostavni objekti koji su neto ogranieniji od klasa, a manje su zahtjevni za opera- tivni sustav i memoriju. Suelja su poput ugovora - opisuju kako e klasa funkcionirati tako da drugi programeri mogu koristiti vae objekte na dobro definiran nain.

    Objektno orijentirani programi mogu stvoriti veliki broj razliitih objekata. esto ih je prikladno grupirati i s njima zajedniki raditi, a C# prua opsenu podrku za kolek- cije. U Poglavlju 9, Polja, indekseri i kolekcije, opisane su klase kolekcija koje prua Framevvork Class Library, nove generike kolekcije i nain na koji programeri mogu stvarati vlastite tipove kolekcija s pomou generika.

    Poglavlje 10, Nizovi i regularni izrazi, opisuje nain upotrebe jezika C# za rad s tekstu- alnim nizovima i regularnim izrazima. Veina Windows i Web programa komunicira s korisnikom, a nizovi imaju kljunu ulogu u korisnikom suelju.

    U Poglavlju 11, Obrada iznimki, objanjeni su postupci obrade iznimki koji pruaju objektno orijentiran mehanizam za rjeavanje moguih hitnih sluajeva".

    I Windows i Web aplikacije reagiraju na dogaaje. U jeziku C# dogaaji su vani lanovi jezika. Poglavlje 12, Delegati i dogaaji posveeno je nainu obrade dogaaja i koritenju delegata (objektno orijentiranih mehanizama povratnih poziva koji su sigurni za tip) kao podrke za obradu dogaaja.

    Dio II, Programiranje na jeziku C# Drugi se dio bavi pisanjem .NET programa: samostalnih aplikacija s

    Windows Forms i Web aplikacija s Web Forms. Uz to, u drugom je dijelu opisan rad s bazama podataka i nain stvaranja Web usluga.

    Predgovor | xiii

  • Na vrhu .NET infrastrukture nalazi se apstrakcija operativnog sustava ija je svrha da olaka razvoj objektno orijentiranog softvera. U ovaj gornji sloj pripadaju i ASP. NET i Windows Forms. ASP.NET ukljuuje Web Forms za brzi razvoj Web aplikacija i Web usluge za izradu Web objekata bez korisnikog suelja. Web usluga je distribui- rana aplikacija koja prua funkcionalnost preko standardnih Web protokola, najee XML-a i HTTP-a.

    C# prua model brzog razvoja aplikacija koji je dosad postojao samo u jeziku Visual Basic. Poglavlje 13, Programiranje Windows aplikacija, opisuje nain koritenja RAD modela za stvaranje Windows programa profesionalne kvalitete s pomou razvojnog okolia Windows Forms.

    Bez obzira jesu li namijenjene za Web ili klasini operacioni sustav, veina aplikacija se temelji na obradi velike koliine podataka. Poglavlje 14, Pristup podacima kroz ADO. NET, objanjava ADO.NET sloj u .NET kosturu i nain interakcije s Microsoft SQL posluiteljem i ostalim izvorima podataka.

    Predmet poglavlja 15, Programiranje ASP.NET aplikacija i Web usluga, su dva dijela ASP.NET tehnologije: Web Forms i Web Services.

    U Poglavlju 16, Sastavljanje u cjelinu, kombinira se velik broj vjetina obraenih u dru- gom dijelu kako biste nauili razvijati skup integriranih aplikacija.

    Dio III,CLRi.NETkostur Izvedbeni okoli je sredina u kojoj se izvode programi. Common Language Runtime (CLR) je sr platforme .NET. On sadri sustav tipizacije podataka koji se primjenjuje na cijeloj platformi i koji je zajedniki svim jezicima koje.NET podrava. CLR je odgo- voran za postupke poput upravljanja memorijom i brojanja referenci objekata.

    Druga kljuna znaajka .NET CLR-a je sakupljanje otpada. Za razliku od tradicional- nog C/C++ programiranja, u jeziku C# programer nije odgovoran za unitavanje obje- kata. Beskrajni sati provedeni u traenju objekata koji se vie ne koriste sada su stvar prolosti. Kada se objekti vie ne koriste, CLR e za vama obaviti ienje. Metoda sakupljanja otpada u CLR-u provjerava ima li u gomili objekata bez referenci i oslo- baa memoriju koju ti objekti zauzimaju.

    Platforma .NET i biblioteka klasa proiruju se prema viim razinama sve do platforme srednje razine na kojoj se nalazi infrastruktura klasa za podrku, zajedno s tipovima za komunikciju izmeu procesa, XM L, rad s dretvama, ulaz i izlaz podataka, zatitu, dijagnostiku itd. Srednji sloj sadri i komponente za pristup podacima koje se skupno nazivaju ADO.NET.

    U treem dijelu ove knjige obraen je odnos izmeu jezika C# , CLR-a i biblioteke klasa kostura.

    xiv | Predgovor

  • U Poglavlju 17, Sklopovi i rad s inaicama, opisane su razlike izmeu privatnih i javnih sklopova te nain stvaranja i rada sa sklopovima. Na platformi .NET sklop je skup datoteka koji korisniku izgleda kao jedinstvena DLL ili izvedbena datoteka. Sklop je osnovna jedinica za ponovnu upotrebu, rad s inaicama, zatitu i primjenu.

    .NET sklopovi sadre iscrpne metapodatke o klasama, metodama, svojstvima, doga- ajima i ostalim elementima. Oni se prevode u program i automatski dohvaaju kroz refleksiju. U Poglavlju 18, Atributi i refleksija, objanjeno je dodavanje metapodataka u kod, stvaranje prilagoenih atributa i pristup metapodacima s pomou refleksije. U ovom poglavlju moete pronai i informacije o dinamikom pozivanju pri kojem se metode pozivaju sa kasnim povezivanjem.

    .NET kostur projektiran je kako bi pruio podrku distribuiranim aplikacijama i apli- kacijama temeljenim na Webu. Komponente napisane na jeziku C# mogu se nalaziti unutar drugih procesa na istom stroju ili na drugim umreenim strojevima ili na Inter- netu. Rasporeivanje je tehnika interakcije s objektima koji su u biti negdje drugdje, a rad na daljinu predstavlja tehniku komunikacije s takvim objektima. Te tehnike objanjene su u Poglavlju 19, Rasporeivanje i rad na daljinu.

    FCL prua opsenu podrku za asinkroni ulaz i izlaz podataka i druge klase koje eks- plicitnu manipulaciju dretvama ine nepotrebnom. C# , meutim, prua podrku za dretve i sinkronizaciju, o emu govori poglavlje 20.

    U poglavlju 21 objanjeni su Tokovi podataka, mehanizam koji ne slui samo za inter- akciju s korisnikom, ve i za uzimanje podataka s Interneta. Ovo poglavlje sadri i potpuni pregled C# podrke za serijalizaciju - mogunost zapisivanja objekata na disk i njihovog ponovnog itanja.

    Poglavlje 22, .NET i COM programiranje, bavi se interoperabilnou, mogunou interakcije sa COM komponentama koje su stvorene izvan upravljanog okolia .NET kostura. Mogue je pozivanje komponenata iz C# aplikacija u COM i pozivanje COM komponenata u C# . Ti su postupci objanjeni u poglavlju 22.

    Na kraju knjige nalazi se dodatak A s kljunim rijeima jezika C# .

    Kome je knjiga namijenjena etvrto izdanje knjige Programiranje C# napisano je za programere koji ele razvijati aplikacije za platformu .NET. Mnogi od vas vjerojatno ve imaju iskustva u programi- ranju s jezicima C++, Java ili Visual Basic (VB). Drugi itatelji moda imaju iskustva s drugim programerskim jezicima, dok neki moda uope nemaju programerskog isku- stva, ali su radili s HTML-om i ostalim Web tehnologijama. Ova knjiga namijenjena je svima vama, no moda e vam biti neto tea za razumijevanje ako nemate nikakvog iskustva u programiranju.

    Predgovor | xv

  • Ako ste prethodno radili s jezicima C, C++, VB 6 ili Java, u sljedeim odjeljcima moete pronai usporedbu osnovnih svojstava tih jezika s jezikom C# . U cijeloj knjizi postoje napomene posebno napisane za vas.

    C# 2.0 u usporedbi sa C# 1.1 U jeziku C# , razvojnom okoliu i .NET kosturu mnogo toga se promijenilo od inaice 1.1. Sve su uinjene kako bi se smanjila koliina koda koji morate napisati te kako biste se laki fokusirali na izradu robusnih aplikacija.

    Ova knjiga obuhvaa i te promjene, no ona nije napisana kao vodi za programera koji se bavi jezikom C# 1.1 i samo eli saznati vie o promjenama koje su uvedene u inaici 2.0. Usprkos tome. takve promjene nastojat u posebno istaknuti u daljnjem tekstu.

    C# u usporedbi s Visual Baskom .NET Osnovna premisa .NET kostura je da su svi jezici jednaki. No, sukladno rijeima Geor- gea Orvvella, neki jezici sujednakiji od drugih. C# je izvrstan jezik za .NET razvoj. Pri- mijetit ete kako je rije o svestranom, robusnom i dobro projektiranom jeziku. C# je i jezik koji se trenutno najvie koristi u lancima i vodiima za .NET programiranje.

    Mogue je da e velik broj VB 6 programera radije izabrati svladavanje jezika C# nego nadogradnju svog znanja naVB.N ET. Prijelaz s VB 6 na VB.NET je vjerojatno jednako teak kao i prijelaz s VB6 na C# , a treba uzeti u obzir i injenicu da programeri koji rade u jeziku C# , koliko god to bilo nepravedno, imaju vee mogunosti zarade od VB programera. VB programeri nikad zapravo nisu dobili panju i naknadu koju zaslu- uju, a C# im prua jedinstvenu mogunost za potencijalno unosan prijelaz.

    U svakom sluaju, ako imate iskustva s VB jezikom, odabrali ste pravu knjigu jer ovdje moete pronai upute koje e vam olakati prijelaz s jednog jezika na drugi.

    C# u usporedbi s Javom Java programeri e na C# vjerojatno gledati s mjeavinom osjeaja strepnje, veselja i ogorenosti. Postoji miljenje da je C# kopija" jezika Java. Ne bih htio komentirati vjerski rat izmeu Microsofta i onih koji mu nisu naklonjeni. Jedino u napomenuti kako je jezik C# mnogo toga nauio od jezika Java, ali je i Java mnogo toga nauila od C++, koji je svoju sintaksu preuzeo od jezika C, a C je izgraen po uzoru na starije programske jezike. Svi mi stojimo na ramenima divova.

    C# Java programerima nudi jednostavan prijelaz: sintaksa je vrlo slina, a semantika je poznata i jednostavna. Java programeri e se za uinkovito koritenje jezika C# vjerojatno morati usredotoiti na razlike izmeu ta dva jezika. U knjizi sam te razlike pokuao dodatno istaknuti (pogledajte napomene za Java programere u poglavljima).

    xvi | Predgovor

  • C# u usporedbi sjezikom C ++ Programiranje na jezicima C i C++ za platformu .NET je mogue, no nije jednostavno niti prirodno. Iskreno, deset sam godina radio kao C++ programer, napisao sam dese- tak knjiga o njemu i radije bih otiao zubaru nego radio s upravljanim C++. Moda se radi samo o tome da je C# mnogo jednostavniji. U svakom sluaju, nakon to sam poeo koristiti C# , vie se nisam osvrtao.

    Meutim, budite paljivi: postoji mnogo malih zamki koje sam nastojao vidljivo oznaiti.

    Pravila oznaavanja koritena u ovoj knjizi

    U knjizi se koriste sljedee tipografske konvencije:

    Kurziv se koristi za:

    Putanje te nazive datoteka i programa

    Internet adrese, kao to su nazivi domena i URL adrese

    Nove termine na mjestima na kojima su definirani

    Pismo iste irine se koristi za:

    Redove naredbi i opcije koje treba unijeti doslovno

    Nazive i kljune rijei u primjerima programa, ukljuujui nazive metoda, varija- bli i klasa

    Pismo is t e irine u kurzivu se koristi za:

    Zamjenjive elemente, poput varijabli ili neobaveznih elemenata, unutar redova sintakse ili koda

    Podebljano pismo iste irine se koristi za:

    Isticanje unutar programskog koda

    Posebnu panju obratite na napomene koje su od teksta odvojene ovim sliicama:

    Ovo je savjet. On sadri korisne dodatne informacije o odreenoj temi.

    Ovo je upozorenje. Ono vam pomae u rjeavanju i izbjegavanju

    problema.

    Predgovor | xvii

  • Podrka Kao autor, prua m stalnu podrku za svoje knjige na Web stranici ija je adresa: http://www.LibertyAssociates.com Na toj stranici moete preuzeti i izvorni kod za sve primjere iz knjige Programiranje C#. Tamo ete moi pristupiti forumu o knjizi s posebnim dijelom za pitanja u vezi s jezikom C#. Prije postavlja nja pitanja proitajte FAQ i datoteke s ispravka ma. Ako i na kon to proitate te dokumente jo uvijek imate pitanje, postavite ga na forumu. Najuinkovitiji nain za dobiva nje pomoi je postavlja nje vrlo preciznog pitanja ili ak pisa nje kratkog progra ma koji ilustrira podruje koje vas zanima ili zabrinjava. Korisno je iprovjeriti razliite diskusijske grupe i forume na Internetu. Microsof t nudi irok raspon diskusijskih grupa, a DevelopMentor (http://discuss.develo p.com) odrava iznimno korisan e-mail foru m.

    Zahvale Prije nego to nastavim, moram se posebno zahvaliti lanu Griffithsu koji je temeljito recenzirao tekst i dao strune savjete. Ubraja se u skupinu ugodnijih i pametnijih ljudi s kojima suraujem. Ovo je etvrto izdanje knjige i previe mi je prijatelja i itatelja pomoglo unaprijediti ju da bi ih mogao sve nabrojati. Ali, posebno mora m spomenuti sljedee osobe: Donald Xie, Dan Hurwitz, Seth Weiss, Sue Lynch, Cliff Gerald, Tom Petr, Jim Culbert, Mike Woodring, Eric Gu nnerson, Rob Howard, Piet Obermeyer, Jonathan Hawkins, Peter Drayton, Braci Merrill, Ben Albaha ri, Susan Warren, Bram Bischof i Kent Quirk. John Osborn omoguio mi je suradnju s izdavakom kuom O'Reilly, za to u mu uvijek biti zahvalan. Valerie Quercia, Claire Cloutier i Tatiana Diaz napravile su velik posao na prethodnim inaica ma, a nadogradnju na C# 2.0 predvodio je Brian Jepson. Rob Romano je izradio brojne nove ilustracije i poboljao stare. Tim O'Reilly je pruio podrku i resurse i za to sam mu zahvalan.

    Javili su mi se m nogi itatelji i obavijestili nas o pravopisnim i manjim pogrekama u prva tri izda nja. Vrlo smo im zahvalni, a posebno bi htio spomenuti sljedee itate- lje: Peter Adams, Sol Bick, Brian Cassel, Steve Charbonneau, Ronal Chu, John Cor- ner, Duane Corpe, Kevin Coupland, Randy Eastwood, Glen Fischer, Larry Fix, Andy Gaskall, Dave Fowler, Vojimir Golem, David Kindred, Steve Kirk, Bob Kilne, Theron LaBounty, Arnn Landy, Jeremy Lin, Chris Linton, Mark Melhado, Harry Martyros- sian, Jason Mauss, Stephen Nelson, Harold Norris, Tim Noll, Mark Phillips, Marcus Rahilly, Paul Reed, Christian Rodriguez, David Solum, Paul Schwartzburg, Erwing Steininger, Fred Talmadge, Steve Thompson, Greg Torrance, Ted Volk, John Watson, Walt White i Seen Sai Yang.

    xviii I Programiranje .NET komponenata

  • Naporno smo radili kako bi u etvrtom izdanju ispravili sve takve pogreke. Pomno smo pregledali knjigu kako bi se uvjerili da se nisu pojavile nove pogreke i da se sav kod prevodi i ispravno pokree u Visual Studiju 2005. Ako pronaete kakvu pogreku, provjerite datoteke s popisanim pogrekama na Web stranici (http://www.LibertyAs- sociates.com) i ako ste otkrili novu pogreku slobodno poaljite poruku na adresu jliberty@ libertyassociates.com.

    Predgovor | xix

  • POGLAVLJE 1

    Programski jezik C# i .NET kostur

    C# 2 .0 ima ulogu jezika za .NET razvoj koji e biti jednostavan, siguran, moderan, objektno orijentiran, usmjeren na Internet i visokih performansi. C# sada je potpun jezik i na njega su primijenjena iskustva iz tri protekla desetljea. Kao to u djeci moete vidjeti osobine njihovih roditelja, baka i djedova, u jeziku C# lako moete zapaziti utjecaj jezika Java, C++, Visual Basic (VB) i drugih ali i lekcije nauene od prve pojave jezika C# .

    Glavni predmet ove knjige je jezik C# i njegova upotreba kao alata za programiranje na platformi .NET, posebno u razvojnom okoliu Visual Studio.NET 2005 (potpuna ili Express Edition inaica).

    Mnogi programi u ovoj knjizi pisani su kao konzolne aplikacije (a ne kao Windows ili Web aplikacije) kako bi se lake usredotoili na zna- ajke jezika bez nepotrebnih pojedinosti o korisnikom suelju.

    Ako koristite Mono ili neku drugu inaicu jezika C # koju nije pro- izvela tvrtka Microsoft, vjerojatno ete uvidjeti kako svi programi iz ove knjige ispravno funkcioniraju, iako su testirani samo na odobrenoj Microsoft inaici.

    Ovo je poglavlje uvod u jezik C# i platformu .NET, ukljuujui .NET kostur.

    Platforma .NET

    Kada je u srpnju 2000 . Microsoft najavio C# , njegova premijera bila je dio mnogo veeg dogaaja: najave platforme .NET. C# 2.0 predstavlja zrelu fazu jezika i podu- dara se s izdanjem nove generacije alata za .NET.

    Platforma .NET je razvojni kostur koji daje novi API za usluge i API-je starijih inaica operativnog sustava Windows, a istovremeno kombinira brojne razliite tehnologije koje je Microsoft razvio tijekom kasnih 1990-ih. To ukljuuje komponentne usluge

    3

  • COM+, posveenost XML-u i objektno orijentiranom dizajnu, podrku za nove pro- tokole Web usluga kao to su SOAP, WSDL i UDDI te fokusiranje na Internet, a sve to integrirano unutar arhitekture Distributed interNet Applications (DNA).

    Microsoft je ogromne resurse posvetio razvoju platforme .NET i njoj srodnih tehno- logija. Dosadanji rezultati tog rada uistinu su impresivni. Ako nita drugo, .NET je ogromnog raspona. Platforma se sastoji od tri grupe proizvoda:

    Skupa jezika, koji ukljuuje C# i VB, skupa razvojnih alata u kojem se nalazi i Visual Studio .NET, iscrpna biblioteka klasa za izradu Web usluga te Web i Win- dows aplikacija, kao i Common Language Runtime (CLR) za izvoenje objekata izraenih unutar ovog kostura.

    Dvije generacije posluitelja .NET Enterprise: ve objavljenih posluitelja i onih koji trebaju biti objavljeni u sljedee dvije ili tri godine

    Novih ureaja koji nisu kuna raunala, a podravaju .NET

    .NET kostur Microsoft .NET podrava ne samo neovisnost jezika, ve i integraciju jezika. To znai da moete nasljeivati iz klasa, hvatati iznimke i iskoristiti prednosti polimorfizma u razliitim jezicima. .NET kostur vam to omoguava kroz specifikaciju Common Type System (CTS) koju sve .NET komponente moraju potivati. Na primjer, u .NET-u je sve objekt odreene klase koja izvodi iz korijenske klase System.Object. CTS podrava opi koncept klasa, suelja i delegata (koji podravaju povratne pozive).

    Uz to, .NET sadri i Common Language Specification koja prua niz osnovnih pravila potrebnih za integraciju jezika. CLS postavlja minimalne zahtjeve koje jezik mora ispu- njavati da bi bio.NET jezik. Prevoditelji koji su u skladu s CLS-om stvaraju objekte koji mogu meusobno djelovati. Frameivork Class Library (FCL) moe u potpunosti koristiti bilo koji jezik koji je u skladu s CLS-om.

    .NET kostur se nalazi iznad operativnog sustava, a to moe biti bilo koja inaica Win- dowsa i sastoji se od razliitih komponenata koje trenutno ukljuuju:

    Pet slubenih jezika: C# , VB, Visual C++, Visual J# i JScript.N ET

    CLR, objektno orijentiranu platformu za Windows i Web razvoj zajedniku svim navedenim jezicima

    Razliite povezane biblioteke klasa koje se zajedniki nazivaju Framework Class

    Library

    Na slici 1-1 prikazane su komponente .NET kostura.

    Zbog arhitekture CLR-a, operacioni sustav moe biti bilo koja inaica operacionog sustava Unix ili neki skroz drugi operacioni sustav.

    4 | Programiranje C#

  • .NET kostur

    WebServices Web Forms l^ f^indovi^ o^nns

    Podatkovne i XML klase (AD0.NET, SQl, XSLJ, XPnth,XML, itd .)

    Osnovne klase kostura (Ulaz/izlaz, nizovi, mree, sigurnost, dretve, tekst, refleksija, kolekcije, itd.)

    Common Language Runtime (pronalaenje pogreaka, iznimke, provjera tipova, JITprevoditelji)

    Windows

    Slika 1-1. Arhitektura .NET kostura

    Najvanija komponenta u .NET kosturu je CLR koja prua okruenje za izvoenje pro- grama. CLR sadri virtualni stroj koji je u mnogo emu slian Java virtualnom stroju. Na vioj razini CLR aktivira objekte, na njima izvodi sigurnosne provjere, pohranjuje ih u memoriju, izvodi ih i odlae u otpad (Common Type System takoer je dio CLR-a).

    Na slici 1-1 sloj iznad CLR-a je skup klasa kostura, iza kojeg slijedi dodatni sloj podat- kovnih i XM L klasa, zatim jo jedan sloj klasa namijenjenih Web uslugama te Web i Windows obrascima. Ove klase zajedniki ine FCL, jednu od najveih biblioteka klasa u povijesti koja prua objektno orijentiran API za sve funkcionalnosti uahurene u platformi .NET. Sa preko 4000 klasa, FCL omoguava brzi razvoj stolnih aplikacija, klijent/posluitelj aplikacija te drugih Web usluga i apliakcija.

    Skup osnovnih klasa, odnosno najnia razina FCL-a, slian je skupu klasa u jeziku Java. Te klase podravaju ulaz i izlaz, rad s nizovima, upravljanje sustavom zatite, mrenu komunikaciju, upravljanje dretvama, rad s tekstom, refleksiju, kolekcije itd.

    Iznad te razine nalazi se sloj klasa koje proiruju osnovne klase tako da podravaju rad s podacima i XML-om. Podatkovne klase podravaju rad s podacima koji se uvaju u bazama podataka. Te klase ukljuuju Structured Query Language (SQL) klase koje omoguavaju rad s podacima kroz standardno SQL suelje. .NET kostur podrava i brojne druge klase koje omoguavaju rad s XM L podacima te njihovo pretraivanja i prevoenje.

    Kao proirenje osnovnih klasa kostura te podatkovnih i XML klasa, postoji i sloj klasa koje su namijenjene izradi aplikacija s pomou tri razliite tehnologije: Web Services, Web Forms i Windows Forms. Web Services ukljuuju velik broj klasa koje podra- vaju razvoj jednostavnih distribuiranih komponenata koje e raditi ak i uz upotrebu vatrozida i NAT posluitelja. Budui da Web Services kao temeljne komunikacijske

    Poglavlje 1: Programski jezikC# i.NET kostur | 5

  • protokole koriste HTTP i SOAP, ove komponente u kiberprostoru podravaju metodu

    Plug and Play.

    Web Forms i Windows Forms omoguavaju primjenu tehnika za brzi razvoj aplikacija za izradu Web i Windows aplikacija. Jednostavno povucite i ispustite kontrole na obra- zac, dvaput pritisnite kontrolu i upiite kod koji e odgovoriti na dogaaj.

    Iscrpniji opis .NET kostura potraite u knjizi .NET Erameu/ork Essentials u izdanju 0 Reilly Media.

    Prevoenje i MSI L Na platformi .NET programi se ne prevode u izvedbene datoteke, oni se prevode u sklopove koji sadre Microsoft Intermediate Language (MSIL) upute koje CLR zatim pretvara u strojni kod i izvodi. MSIL (esto se koristi samo kratica IL) datoteke koje proizvodi C# gotovo su identine IL datotekama koje proizvode ostali jezici podrani u .NET platformi. Kljuna osobina CLR-a je da je on zajedniki: isti izvedbeni okoli podrava razvoj na jezicima C# i VB.NET.

    C# kod se prevodi u IL prilikom izrade projekta. IL se sprema u datoteku na disku. Kada pokrenete program, IL se ponovno prevodi s prevoditeljem Just In Time (JIT). Rezultat je strojni kod koji procesor moe izvesti.

    Standardni se JIT prevoditelj pokree na zahtjev. Kada se metoda pozove, JIT prevodi- telj analizira IL i proizvodi iznimno uinkovit strojni kod koji se vrlo brzo izvodi. Dok se program izvodi prevoenje se provodi samo po potrebi, a jednom preveden kod se sprema u privremenu memoriju da bi se mogao ponovno upotrijebiti. .NET aplikacije sa svakim novim pokretanjem postaju sve bre jer se koristi ve prevedeni kod.

    CLS znai da svi .NET jezici proizvode slian IL kod. To omoguava da se objektima stvorenim u jednom jeziku moe pristupiti i iz drugog jezika. Stoga je mogue osnovnu klasu stvoriti u jeziku VB.NET, a iz nje izvoditi u C# .

    Jezik C# Jezik C# je iznenaujue jednostavan. Sadri oko 80 kljunih rijei i desetak ugrae- nih tipova, ali je vrlo izraajan kada je rije o implementaciji modernih programerskih koncepata. C # prua svu podrku potrebnu za strukturirano, objektno orijentirano programiranje temeljeno na komponentama kakvo biste i oekivali od modernog jezika sagraenog na temeljima jezika C++ i Java. U inaici 2 .0 dodani su mu i mnogi vani elementi koji su ranije nedostajali, poput generika i anonimnih metoda.

    C++ programeri obratite panju: generici u C # su ekvivalent predlo- cima. Iako su C # generici neto jednostavniji i uinkovitiji od C++ predloaka. Oni smanjuju koliinu koda ponovnom upotrebom zajed- nikog koda tijekom izvoenja, ali je njihova fleksibilnost neto manja od fleksibilnosti C++ predloaka.

    6 | Programiranje C#

  • Jezik C# razvio je mali tim koji predvode dva istaknuta Microsoftova inenjera, Anders Hejlsberg i Scott Wiltamuth. Hejlsberg je poznat i kao autor jezika Turbo Pascal koji je bio popularan na kunim raunalima te kao voa tima koji je razvio Borland Delphi, jedan od prvih uspjenih integriranih razvojnih okolia za klijent/ posluitelj programiranje.

    U sreditu svakog objektno orijentiranog jezika je njegova podrka za definiranje klasa i rad s klasama. Klase definiraju nove tipove, to omoguava proirivanje jezika kako biste bolje modelirali problem koji pokuavate rijeiti. C# sadri kljune rijei za dekla- riranje novih klasa, njihovih metoda i svojstava te za implementaciju uahurivanja, nasljeivanja i polimorfizma - tri stupa objektno orijentiranog programiranja.

    U C# , sve to je potrebno za deklariranje klase nalazi se u samoj deklaraciji. Defini- cije C# klasa ne zahtijevaju posebne datoteke zaglavlja niti IDL (Interface definition Language) datoteke. tovie, C # podrava novi XML stil dokumentiranja koji pojed- nostavljuje izradu dokumentacije.

    C# podrava i suelja, koja su poput ugovora s klasom o pruanju usluga koje suelje zahtijeva. U C# klasa moe nasljeivati samo iz jedne roditeljske klase, ali moe imple- mentirati vie suelja. Kada implementira suelje, C# klasa ustvari obeava pruiti funkcionalnosti koje suelje zahtijeva.

    C# prua i podrku za strukture (engl. structs), koncept ije se znaenje znaajno promijenilo u odnosu na C++. U C# struktura je ogranien, jednostavan tip koji pri- likom instanciranja manje optereuje operacioni sustav i memoriju od obine klase. Struktura ne moe nasljeivati iz klase niti se iz nje moe nasljeivati, ali struktura moe implementirati suelje.

    C# prua potpunu podrku za delegate (engl. delegate) kako bi se omoguilo neiz- ravno pozivanje metoda. U drugim jezicima, poput C++, moete pronai slinu funk- cionalnost (npr. u pokazivaima na metode lanice), ali delegati su referentni tipovi koji uahuravaju metode s posebnim potpisima i povratnim tipovima.

    C# nudi komponentno orijentirane znaajke, poput svojstava, dogaaja i deklara- tivnih konstrukcija (kao to su atributi). Komponentno orijentirano programiranje podrava spremite metapodataka u kojem se nalazi kod za klasu. Metapodaci opi- suju klasu, zajedno s njenim metodama i svojstvima, kao i njene sigurnosne potrebe i druge atribute, poput mogunosti serijalizacije. Prevedena klasa je, dakle, samostojna jedinica. Stoga, okruenju koje zna proitati metapodatke i kod klase nisu potrebne druge informacije za koritenje klase. Ako se koristi C# i CLR, klasi se mogu dodati prilagoeni metapodaci stvaranjem prilagoenih atributa. Isto tako, metapodaci klase se mogu proitati s pomou CLR tipova koji podravaju refleksiju.

    Prevoenjem koda zapravo stvarate sklop (engl. assembly). Sklop je kolekcija datoteka koju programer vidi kao jednu dinamiki povezanu biblioteka (DLL) ili izvrnu dato- teku (EXE). Na .NET platformi sklop je osnovna jedinica za ponovnu upotrebu, pra- enje inaica, zatitu i razmjetaj.

    Poglavlje 1: Programski jezike# i.NET kostur | 7

  • Naposljetku treba napomenuti kako C# daje podrku i za:

    Izravan pristup memoriji s pomou pokazivaa u stilu jezika C++

    Kljune rijei za odvajanje takvih operacija kao opasnih

    Upozoravanje CLR sakupljaa otpada da ne sakuplja objekte na koje pokazuju

    pokazivai dok se ne oslobode

    8 | Programiranje C#

  • POGLAVLJE 2

    Poetak: Hello World"

    Knjige o programiranju se tradicionalno zapoinju programom Hello WorId. U ovom poglavlju napisat emo, prevesti i pokrenuti jednostavan program Hello World napisan u jeziku C# . Analiza ovog kratkog programa pokazat e najvanije znaajke jezika C# .

    U primjeru 2-1 pokazani su osnovni elementi vrlo jednostavnog C# programa.

    Primjer 2-1. Jednostavan program Hello World ujeziku C#

    class Hello

    { static void Main()

    { // Koristi objekt konzole sustava

    System.Console.WriteLine("Hello World");

    } }

    Prevoenjem i pokretanjem ovog koda u konzoli e se ispisati rijei Hello World. Prije hego to ga prevedemo i pokrenemo, pogledajmo paljivije ovaj jednostavan program.

    Klase, objekti i tipovi Bit objektno orijentiranog programiranje je stvaranje novih tipova. Tip (engl. type) predstavlja neku stvar. Ponekad je ta stvar apstraktna, poput tablice podataka ili dretve, a ponekad je neto opipljivija, poput gumba u prozoru. Tip definira opa svo- jstva i ponaanje stvari.

    Ako program u prozoru koristi tri instance tipa gumba - na primjer, gumbe OK, Cancel i Help - svaki gumb moe imati svoju veliinu. Slino tome, svi gumbi e se jednako ponaati, iako se nain na koji oni implementiraju ta ponaanja moe razliko- vati. Dakle, pojedini gumbi se mogu razlikovati iako svi pripadaju istom tipu.

    9

  • Kao to je to sluaj u veini objektno orijentiranih programskih jezika, tip je u C# definiran klasom, a pojedinane instance te klase nazivaju se objektima. U kasnijim poglavljima objanjeno je da u jeziku C# postoje i drugi tipovi koji nisu klase, na primjer enumeratori (engl. enums), strukture (engl. structs) i delegati (engl. delegates), ali zasad emo se usredotoiti na klase.

    Program Hello World deklarira jedan tip: klasu Hello. Ako u C # elite definirati tip, deklarirate ga kao klasu koristei kljunu rije class, date mu naziv - u ovom sluaju ,,Hello - i zatim definirate njegova svojstva i ponaanja. Definicije svojstava i ponaanja klase u C # moraju se nalaziti u vitiastim zagradama ({}).

    C++ programeri obratite panju: iza zatvorene zagrade ne stoji toka

    Metode Klasa ima svojstva i ponaanja. Ponaanja su definirana s metodama lanicama, a

    svojstva su opisana u poglavlju 3.

    Metoda )t funkcija u vlasnitvu klase. Zapravo, metode se ponekad i nazivaju funkcijama lanicama. Metode lanice definiraju to klasa moe uiniti ili kako se ponaa. Meto- dama se obino daju nazivi akcija koje izvode, na primjer WriteLine() ili AddNumbers(). Meutim, u ovdje navedenom primjeru metoda klase ima poseban naziv, Main(), koji ne opisuje akciju, ali CLR-u govori kako je ovo glavna, odnosno prva metoda za klasu.

    C++ programeri obratite panju: Main() se u C # pie velikim poetnim slovom i mora biti lanica klase, a ne globalna lanica. Main() moe vratiti int ili void.

    CLR prilikom pokretanja programa poziva Main(). Main() je ulazna toka programa i

    svaki C# program je mora imati.'

    Deklaracije metoda su zapravo ugovori izmeu autora i korisnika metode. Autor i korisnik metode e vjerojatno biti isti programer, ali to ne mora uvijek biti sluaj. Moe se dogoditi da jedan lan razvojnog tima napie metodu, a da je drugi koristi.

    a * Napomena za java programere: Main() je ulazna toka svakog C # pro- grama, to je u odreenoj mjeri slino metodi run() u Java apletu ili metodi Main() u Java programu.

    Tehniki je u C# mogue imati nekoliko Main() metoda. U tom sluaju morate upotrijebiti preklopnik /main u odzivniku da biste zadali klasu u kojoj se nalazi Main() metoda koja e sluiti kao ulazna toka za program.

    10 | Programiranje C#

  • Za deklariranje metode trebate zadati tip povratne vrijednosti i iza njega navesti ime. U deklaracijama metoda obavezne su i zagrade, bez obzira na to prihvaa li metoda parametre ili ne. Na primjer:

    int myMethod(int sie)

    deklarira metodu myMethod() koja ima jedan parametar - cjelobrojnu vrijednost koja e se unutar metode koristit kao sie. Ova metoda vraa cjelobrojnu vrijednost. Tip povratne vrijednosti korisniku metode govori koju e vrstu podataka metoda vratiti kad zavri.

    Neke metode uope ne vraaju vrijednosti. Za takve se metode kae da vraaju void, to se posebno definira kljunom rijeju void. Na primjer:

    void myVoidMethod();

    deklarira metodu koja vraa void i nema parametara. U C# morate uvijek deklarirati tip povratne vrijednosti ili void.

    Komentari C# program moe sadrati i komentare. Pogledajte prvi red iza otvorene vitiaste zagrade ranije navedene glavne metode:

    // Koristi objekt konzole sustava

    Tekst poinje s dvije kose crte (//). One oznaavaju komentar. Komentar je napomena za programera koja ne utjee na izvoenje programa. C# podrava tri vrste komentara.

    Prva upravo prikazana vrsta govori da se sav tekst s desne strane oznake za komentar treba smatrati komentarom, sve do zavretka tog reda. Ta se vrsta naziva komentarom u C++ stilu.

    Druga vrsta komentara naziva se komentar u C stilu i poinje otvorenom oznakom za komentar (/*) a zavrava zatvorenom oznakom za komentar (*/). Na taj se nain komentari mogu prostirati u vie redova i nije potrebno umetati znakove // na poetku svakog reda, kao to je pokazano u primjeru 2-2.

    Primjer 2-2. Komentari u vie redova

    namespace Helloklorld

    { class Helloklorld

    { static void Main()

    { /* Koristi objekt konzole sustava

    kao to je objanjeno u tekstu */

    System.Console.IVriteLine("Hello klorid");

    } }

    }

    Poglavlje 2: Poetalc:Hello World" | 11

  • Komentari u C++ stilu mogu se ugnijezditi unutar komentara u C stilu. Iz tog se razloga komentari u C++ stilu koriste kad god je to mogue, a komentari u C stilu samo za privremeno izdvajanje dijelova koda iz projekta.

    Trea, i posljednja, vrsta komentara koju C# podrava koristi se kako bi se kodu pridruila vanjska XML dokumentacija. Ta vrsta komentara objanjena je u poglavlju 13.

    Konzolne aplikacije Hello World je primjer konzolne aplikacije (engl. console applicatiori). Konzolna aplikacija obino nema grafikog korisnikog suelja - ne postoje izbornici, gumbi, prozori i slino. Tekst se unosi i prikazuje u standardnoj konzoli (najee je to DOS prozor pod Windowsima). Na poetku knjige bavit emo se samo konzolnim aplikaci- jama kako bi se lake usredotoili na sam jezik. Kasnija poglavlja obrauju i Windows i Web aplikacije te emo se tamo usredotoiti na alate za izradu grafikog korisnikog suelja koje nudi Visual Studio .NET.

    Metoda Main() iz naeg primjera jednostavno ispisuje tekst Hello World" na stan- dardni izlaz (DOS prozor). Standardnim izlazom upravlja objekt Console. On ima metodu WriteLine() koja uzima niz (skup znakova) i ispisuje ga na standardni izlaz. Kada pokrenete ovaj program, u DOS prozoru na monitoru raunala pojavit e se rijei Hello World.

    Metoda se poziva operatorom toka (.). Stoga, kako biste pozvali metodu WriteLine() objekta Console, napiite Console.W riteLine(...) i u zagrade upiite niz koji elite ispisati.

    Imenski prostori Console je samo jedan od brojnih tipova koji su dio .NET FCL-a. Svaka klasa ima svoj naziv, stoga FCL sadri na tisue naziva, kao to su ArrayList, Hashtable, FileDialog, DataException, EventArgs itd. Postoje stotine, tisue, ak i desetine tisua naziva.

    To predstavlja problem. Nijedan razvojni inenjer ne moe upamtiti sve nazive koji se koriste na platformi .NET te ete prije ili kasnije stvoriti objekt i dati mu naziv koji se ve koristi. to e se dogoditi ako klasu Hashtable nabavite od drugog dobavljaa i zatim otkrijete da je ona u sukobu s klasom Hashtable koju prua platforma .NET? Upamtite, u C# svaka klasa mora imati jedinstven naziv a nazive gotovih klasa koje ste kupili obino ne moete promijeniti.

    Rjeenje ovog problema lei u upotrebi imenskih prostora. Imenski prostor (engl. namespace) ograniava doseg naziva, ograniavajui njegovu smislenost samo na definirani imenski prostor.*

    * ' Napomena za C++ programere: imenski prostori u C++ odvajaju su ope- ratorom za odvajanje dosega ( :: ), dok se u C # koristi operator toka (.).

    --------- Napomena za Java programere: imenski prostori pruaju brojne pogod- nosti paketa.

    12 | Programiranje C#

  • Recimo da je Jim inenjer. Rije inenjer11 moe znaiti mnogo toga i biti prilino zbunjujua. Projektira li on zgrade? Pie programe? Izrauje vlakove?

    Izraz moemo pojasniti tako da kaemo on je znanstvenik" ili on je strojarski inenjer". C# programer moe objasniti kako je Jim Science.engineer, a ne train. engineer. Imenski prostor (u ovom sluaju Science i train) ograniava doseg sljedee rijei. On stvara prostor" unutar kojeg rije ima znaenje.

    Nadalje, Jim moda nije bilo kakav science.engineer. Moda je Jim diplomirao na sveuilitu M IT i ima titulu softverskog inenjera, a ne inenjera graevinarstva. To znai da se objekt 3im moe odreenije definirati kao Science. software.engineer. Ova klasifikacija ukazuje kako je imenski prostor software smislen unutar imenskog pros- tora science, a engineer je u ovom kontekstu smislen unutar imenskog prostora soft- ware. Ako kasnije saznate kako je Charlotte transportation.train.engineer, odmah e vam biti jasno kojoj ona vrsti inenjera pripada. Istovremeno mogu postojati dva objekta engineer, svaki unutar svog imenskog prostora.

    Slino tome, ako se ustanovi kako na platformi .NET postoji klasa Hashtafale unutar imenskog prostora System.Collections, a vi ste unutar imenskog prostora Prog.Csharp. DataStructures takoer stvorili klasu Hashtable, nee doi do sukoba jer svaka klasa postoji unutar svog imenskog prostora.

    U primjeru 2-1 naznaeno je da se klasa Console nalazi unutar imenskog prostora System s pomou sljedeeg koda:

    Systera. Console. Write Line();

    Operator toka (.) U primjeru 2-1 operator toka (.) koristi se za pristup metodi (i podacima) unutar klase (u ovom sluaju metodi WriteLine()) te za ogranienje naziva klase na odreen imenski prostor (u ovom sluaju Console se nalazi unutar imenskog prostora System). To funkcionira jer u oba sluaja kopamo" kako bismo pronali tono ono to traimo. Najvia razina je imenski prostor System (u kojem se nalaze svi objekti System koje prua FCL). Tip Console postoji unutar tog imenskog prostora, a metoda WriteLine() je metoda lanica tipa Console.

    U veini sluajeva imenski se prostori dijele na potprostore. Na primjer, imenski pros- tor System sadri vie podreenih imenskih prostora kao to su Data, Configuration, Collections i tako dalje, dok je sam imenski prostor Collections podijeljen na mnogo podreenih imenskih prostora.

    Imenski prostori mogu pomoi u organizaciji i razvrstavanju tipova. Kada piete kom- pleksni C# program, korisno je stvoriti vlastitu hijerarhiju imenskih prostora, koja moe biti vrlo duboka. Svrha imenskih prostora je da vam pomognu da metodom podijeli i vladaj" lake koristite sloenu hijerarhiju objekata.

    Poglavlje 2: Pofetak:Hello World" | 13

  • Kljuna rije using Umjesto da rije System napiete ispred rijei Console, moete navesti da ete koristiti tipove iz imenskog prostora System tako da direktivu:

    using System;

    napiete na poetku popisa, kako je prikazano u primjeru 2-3.

    Primjer 2-3. Koritenje kljune rijei using

    using System;

    class Hello

    { static void Main()

    { //Console iz imenskog prostora System

    Console.WriteLine("Hello Horld");

    } }

    Moda ste primijetili da je direktiva using System napisana ispred definicije klase Hello. Visual Studio . N E T 2005 u svaku konzolnu aplikaciju ukljuuje tri iskaza using (System, System.Collections.Generic i System.Text).

    Iako moete izjaviti da koristite imenski prostor System, za razliku od nekih drugih jezika, ne moete izjaviti da koristite objekt System.Console. Primjer 2-4 se nee pre- vesti.

    Primjer 2-4. Kod koji se ne moe prevesti (nije doputen u C# )

    using System.Console;

    class Hello

    { static void Main()

    { //Console iz imenskog prostora System

    WriteLine("Hello Horld");

    } }

    Generira se pogreka u prevoenju:

    error CS0138: A using namespace directive can only be applied

    to namespaces; 'System.Console' is a type not a namespace

    Ako koristite Visual Studio, uvidjet ete da ste napravili pogreku, jer kad unesete using System i iza toga stavite toku, Visual Studio .NET 2005 e navesti popis valjanih imenskih prostora na kojem se ne nalazi Console.

    Koritenje kljune rijei using moe smanjiti koliinu koda koji trebate napisati, ali moe i ponititi prednosti imenskih prostora jer zagauje doseg brojnim nazivima koji

    14 | Programiranje C#

  • se preklapaju. Najee rjeenje je koritenje kljune rijei using uz ugraene imenske prostore i one koje ste sami stvorili, ali ne i uz komponente koje ste nabavili od neke tree strane.

    Neki programeri uvijek ispisuju cijelu putanju kroz imenske prostore do objekta (npr. System.Console.WriteLine(), a ne samo Consoie.Urite- Line()) i to koriste kao dodatak dokumentaciji. To je neupotrebljiv pris- tup ako se koriste sloene hijerarhije imenskih prostora.

    Razlikovanje velikih i malih slova U C# razlikovanje velikih i malih slova je obavezno, to znai da writeLine nije isto to i WriteLine, a oba su razliita od WRITELINE. Naalost, za razliku od VB-a, C# raz- vojni okoli nee ispraviti pogreno unesena velika i mala slova. Ako istu rije jednom unesete malim, a drugi put velikim slovima, unijet ete pogreku u program koju ete kasnije teko pronai.

    Koristan trik je oznaiti naziv u kojem su pogreno napisana jedino mala i velika slova i zatim pritisnuti Ctrl-Space. Znaajka Intellisense e umjesto vas ispraviti pogreno napisana slova.

    Kako biste sprijeili ovakve pogreke na kojima se nepotrebno gube vrijeme i ener- gija, trebate sastaviti pravilnik za imenovanje varijabli, metoda, konstanti itd. U ovoj se knjizi varijable imenuju ,,deva zapisom (engl. camel notation) (npr. imeNekeVari- jable), a metode, konstante i svojstva Pascalovim zapisom (npr. NekaMetoda).

    Pascalov zapis se od ,,deva zapisa razlikuje samo po tome to u njemu nazivi poinju velikim slovom.

    Microsoft je razvio smjernice za pisanje koda koje je korisno pogledati (one su esto sve to vam je zapravo potrebno). Moete ih preuzeti sa adrese:

    http://msdn.microsoft.com/library/default.aspturfc/library/en-us/ cpgenref/html/cpconNETFrameworkDesignGuidelines.asp

    Kljuna rije static Metoda Main() prikazana u primjeru 2-1 ima jo jedno odreenje. Odmah ispred deklaracije povratnog tipa void (koji, sjeate se, oznaava da metoda ne vraa nikakvu vrijednost) moete pronai kljunu rije static:

    static void Main()

    Kljuna rije static govori kako Main() moete pozvati bez prethodnog stvaranja objekta tipa Hello. Ova pomalo kompleksna tema bit e detaljnije obraena u kasnijim poglavljima. Jedan od problema koji se javljaju prilikom uenja novog programskog jezika je potreba za koritenjem sloenijih znaajki prije njihova potpuna razumi- jevanja. Za sada deklaraciju metode Main() moete smatrati arobnom formulom.

    Poglavlje 2: Poetak:Hello World" | 15

  • Razvoj programa Hello World" Postoje najmanje dva naina na koje moete napisati, prevesti i pokrenuti programe iz ove knjige: s pomou Visual Studio .NET IDE-a ili s pomou programa za ureivanje teksta i prevoditelja koji se pokree u odzivniku.

    Iako programe moete razvijati izvan Visual Studia .NET, IDE vam prua razne pred- nosti. One ukljuuju podrku za uvlaenje redova, Intellisense, oznaavanje bojama i integraciju s datotekama za pomo. Najvanije od svega, IDE sadri moan alat za ispravljanje pogreaka i mnotvo drugih alata.

    U ovoj knjizi je pretpostavljeno da ete koristiti Visual Studio .NET. Meutim, upute su vie fokusirane na jezik i platformu nego na alate. Sve navedene primjere moete kopirati u program za ureivanje teksta poput Notepada ili Emacsa, spremiti ih kao tekstualne datoteke s nastavkom imena .cs i prevesti s pomou C# prevoditelja za odzivnik koji se nalazi u kompletu .NET Framework SDK (ili kompletima razvojnih alata kompatibilnih s platformom .NET kao to su Mono ili Microsoft Shared Source CLI). Napominjemo kako neki od primjera navedenih u kasnijim poglavljima koriste Visual Studio .NET alate za izradu Windows i Web obrazaca, no ak i te primjere moete runo upisati u Notepad ako elite ii teim putem.

    Ureivanje programa Hello World" Za izradu programa Hello World u IDE-u, odaberite Visual Studio .NET s izbornika Start ili odgovarajuu ikonu na radnoj povrini, zatim odaberite File -* New -* Project. Time ete otvoriti prozor New Project (slika 2-1). Ako prvi put koristite Visual Studio, prozor New Project moda e se sam pojaviti.

    * r $ffHeBoWoHd| .7. .. J u f* 2 U C :\^cum e rtsa n S e ttin gs \A m in is tra to r\M y Docum ents\Visual S tudo\P ro jecl

    S o W lo n N e S lH e lk M o H d P , 0 to B f to ry fo r S o U ion i

    ----- vi'*- v sfV i

    m iSr

    Slika 2-1. Izrada C# konzolne aplikacije u Visual Studiju .NET

    16 J Programiranje C#

  • Za otvaranje aplikacije odaberite Visual C# u prozoru Project Types, a u prozoru Templates Console Application (ovaj korak ne morate izvesti ako koristite Visual C# Express Edition - izravno odaberite Console Application).

    Sada moete upisati naziv projekta i odabrati mapu u koji ete spremati datoteke. Pritis- nite OK i otvorit e se novi prozor u koji moete upisati kod iz primjera 2-1 (slika 2-2).

    v nollo W orld - M icroso ft Oeve Jupnifint Enviro nm cn t s a m m m m m * Custom Tod Custom Tod Nan &fflSjCv-> c t-bFile Mame Program.es $ Full Path ' C:\Docijmonts and 5

    s s gpeisw lW KM f r *-.\ _________ .*> & ?. "A i

    Slika 2-2. Editor u koji moete upisati program

    Primijetit ete kako Visual Studio .NET imenski prostor stvara prema navedenom nazivu projekta (HelloWorld) i dodaje direktivu using za System, System.Collections. Generic i System.Text jer e tipovi iz tih imenskih prostora biti potrebni za gotovo svaki program koji budete pisali.

    Visual Studio .NET stvara klasu Program koju slobodno moete preimenovati. Kada klasi mijenjate naziv, dobro je promijeniti i naziv datoteke (Classl.cs). Ako promijen- ite naziv datoteke, Visual Studio e automatski umjesto vas promijeniti naziv klase. Za reprodukciju primjera 2-1 promijenite ime datoteke Program.es (nalazi se u pro- zoru Solution Explorer) u hello.es te promijenite ime Program u HelloWorld (ako imena promijenite obrnutim redoslijedom, Visual Studio e promijeniti ime klase u hello).

    Na kraju, Visual Studio 2005 stvara kostur programa kako biste lake zapoeli s radom. Za reprodukciju primjera 2-1 uklonite argumente (string[ ] args) iz metode Main(). Zatim sljedea dva reda kopirajte u tijelo metode Main():

    Poglavlje 2: Poetak:Hello World" | 17 Gradska knjinica

  • // Koristi objekt konzole sustava

    System.Console.WriteLine("Hello World");

    Ako ne koristite Visual Studio .NET, otvorite Notepad, unesite kod iz primjera 2-1 i datoteku spremite kao tekstualnu datoteku hello.es.

    Prevoenje i pokretanje programaHello World" Visual Studio prua mnogo naina za prevoenje i pokretanje programa Hello World. Skoro svaki zadatak moete obaviti pritiskom na gumb na alatnoj vrpci Visual Studija, odabirom opcije izbornika ili u mnogim sluajevima upotrebom preaca na tipkovnici.

    Preaci na tipkovnici mogu se postaviti odabirom opcije izbornika Tools -* Options -* Keyboard. U ovoj knjizi pretpostavljeno je da koris- tite zadane postavke.

    Za prevoenje programa Hello World moete, na primjer, pritisnuti Ctrl-Shift-B ili odabrati opciju izbornika Build -> Build Solution. Moete i pritisnuti gumb Build na alatnoj vrpci Build (da biste je vidjeli moda ete morati desnom tipkom mia pritis- nuti alatnu vrpcu). Alatna vrpca Build prikazana je na slici 2-3. Gumb Build nalazi se sasvim lijevo i istaknut je.

    Slika 2-3. Alatna vrpca Build

    Za pokretanje programa Hello World bez ispravljanja pogreaka moete na tip- kovnici pritisnuti Ctrl-F5, odabrati Debug -> Start Without Debugging ili pritisnuti gumb Start Without Debugging na alatnoj vrpci Build, kao to je prikazano na slici 2- 4 (moda ete morati prilagoditi svoju alatnu vrpcu kako bi ovaj gumb bio dostupan). Program moete pokrenuti bez da ga prethodno prevedete (ovisno o postavkama pod Tools -* Options) - IDE e spremiti datoteku, prevesti je i pokrenuti (pritom e moda od vas zatraiti doputenje za svaki korak).

    Slika 2-4. Gufnb Start Without Debugging

    U prvom redu preporuam da prouite razvojni okoli Visual Studija 2005. To je za vas, kao .NET razvojnog inenjera, osnovni alat i vrlo je vano da se njime znate dobro sluiti. Vrijeme koje uloite u upozna- vanje okolia Visual Studia viestruko e vam se isplatiti u sljedeim mjesecima.

    18 | Programiranje C#

  • Pravovremeno prevoenje Prevoenjem programa hello.es koristei esc stvara se izvedbena datoteka. Upamtite da su u .exe datoteci instrukcije zapisane u M SIL-u, koji je opisan u poglavlju 1.

    Zanimljivo je da, ako ovu aplikaciju napiete u VB.N ET-u ili bilo kojem drugom jeziku sukladnom s .N E T C LS-om , dobit ete vie-manje isti MS1L. Razlike izmeu IL koda stvorenog u razliitim jezicim a praktiki ne postoje.

    Uz to to stvara IL kod, prevoditelj stvara i segmnt ,exe datoteke samo za itanje u koji umee standardno W in 32 izvedbeno zaglavlje. Prevoditelj zadaje ulaznu toku unutar segmenta samo za itanje. Program za uitavanje prelazi na tu toku kada pokrenete program, ba kao i kod svakog drugog programa za Windowse.

    Operacioni sustav, meutim, ne moe izvesti IL kod i ta ulazna toka slui samo za prijelaz do .N ET J1 T prevoditelja (koji je takoer opisan u poglavlju 1). J1 T prevoditelj generira originalne instrukcije za procesor kakve se mogu pronai u obinim ,exe datotekam a. Kljuno svojstvo J1 T prevoditelja zapravo je da se metode prevode samo prilikom koritenja, kad su na redu za izvoenje.

    Za prevoenje i pokretanje programa Hello World s pomou C# prevoditelja za odzivnik koji se nalazi u paketima .NET Framevvork SDK, Mono (http://www.mono-project.com) i Shared Source CLI (http://msdn.microsoft.com/net/sscli/) pratite sljedee korake:

    1. Spremite primjer 2-1 u datoteku hello.es.

    2. Otvorite .NET naredbeni prozor (Start - Programs - Visual Studio .NET -> Visual Studio Tools - Visual Studio Command Prompt). Ako koristite UNIX, trebate pokrenuti tekstualnu konzolu, xterm ili neto to e vam prikazati odzivnik ljuske.

    3. U naredbenom redu zadajte sljedeu naredbu ako koristite .NET ili Shared Source CLI C# prevoditelja:

    esc /debug hello.es

    Ako koristite Mono, zadajte sljedeu naredbu:

    mes -debug hello.es

    Ovim korakom pravi se EXE datoteka. Ako program sadri pogreke, prevoditelj e o njima izvijestiti u prozoru odzivnika. Preklopnik /debug u kod umee sim- bole tako da EXE datoteku moete pokrenuti pod programom za ispravljanje pogreaka ili pogledati brojeve redova koda u tragovima stoga (trag stoga ete dobiti ako program generira pogreku koju ne obraujete).

    4. Za pokretanje programa pod .NET-om unesite: hello

    Ako koristite Shared Source CLI zadajte ovu naredbu:

    clix hello.exe

    a ako koristite Mono onda ovu:

    mono hello.exe

    Sada biste u konzoli trebali vidjeti rijei Hello World.

    Poglavlje 2: Poetak:Hello World" | 19

  • Koritenje programa za ispravljanje pogreaka Alat za ispravljanje pogreaka vjerojatno je najvaniji alat u svakom razvojnom okoliu. Visual Studio ima vrlo moan alat za ispravljanje pogreaka i vrijeme koje potroite na njegovo svladavanje viestruko e vam se isplatiti. Osnove ispravljanja pogreaka vrlo su jednostavne. Tri osnovne vjetine su:

    * Kako postaviti toku prekida te kako doi do nje

    * Kako ui u poziv metode i prijei preko njega

    * Kako provjeriti i promijeniti vrijednost varijable, podatka lana itd.

    Ovo poglavlje ne ponavlja kompletnu dokumentaciju alata za ispravljanje pogreaka, ali ove su vjetine toliko vane da se jednostavno moraju ukratko objasniti.

    Alat za ispravljanje pogreaka isti cilj moe se koristiti na razliite naine, obino preko opcija izbornika, gumba itd. Najjednostavniji nain postavljanja toke prekida je pri- tiskom na lijevu marginu programskog koda. IDE toku prekida oznaava crvenom bojom, kao na slici 2-5.

    1 1 for ( int i = 0; i < 3; i++ )

    {

    )

    >

    )

    Slika 2-5. Toka prekida

    r W r Za objanjenje alata za ispravljanje pogreaka potreban nam je prim- jer koda. Ovdje naveden kod uzet je iz poglavlja 5 i nije potrebno da

    TIX razumijete kako funkcionira (iako e C++ i Java programeri vjerojatno shvatiti o emu se radi).

    Za pokretanje alata za ispravljanje pogreaka moete odabrati Debug -> Start ili jed- nostavno pritisnuti F5. Program se zatim prevodi i izvodi do toke prekida, na njoj se zaustavlja, a uta strelica oznaava sljedei iskaz za izvoenje, kao to je prikazano na slici 2-6.

    for ( int i 0; i < 3; i++ )

    0 (winArray[i] .Dra*rtJindow(); }

    }

    )

    Slika 2-6. Dosegnuta toka prekida

    20 | Programiranje C#

  • Nakon to ste doli do toke prekida, provjera vrijednosti razliitih objekata je jednostavna. Na primjer, vrijednost varijable i vidjet ete ako iznad nje postavite pokaziva mia i priekate nekoliko trenutaka (slika 2-7).

    Slika 2-7. Prikaz vrijednosti objekta

    U IDE alatu za ispravljanje pogreaka postoji i niz korisnih prozora, kao to je prozor Locals u kojem su prikazane vrijednosti svih lokalnih varijabli (slika 2-8).

    > coun te r 0 in t Gfl w in {V ir tu a lM e thods.W indow } VirtualMethods.VVindow B lb {V irtu a lM ethods.L ls tB ox) V ir tua lM e thods.lis tB ox b {V ir tu a lM e tho ds.B u tto n ) V ir tua lM ethods.Button

    fJ * winArray {Dimensions:[33^ VirtualMethods.Vtfnovvl]

    ] A u to s j L o c a ls J | p W a tch 1

    Slika 2-8. Prozor Locals

    Ugraeni tipovi, poput cjelobrojnih vrijednosti, prikazuju vrijednost, ali objekti prika- zuju sv,oj tip i uz njih je prikazan znak plus (+). Te objekte moete proiriti kako biste vidjeli njihove unutarnje podatke (slika 2-9). Vie o objektima i njihovim unutarnjim podacima moete saznati u poglavljima koja slijede.

    a {V ir tua lM ethods.Button). V ir tua lM ethods.Button a ^ w ln A rra y {D im ens ions:{3 )) V ir tud lM ethods.W indo(v{) M S 0 [ 0 ] {V ir tu a lM e thods.W indow ) V irtua lM ethods,W indow

    {V ir tu a lM e thods.lis tB ox> Virtua lM ethods.L istBox

    4 in t

    3 in t

    iV k tu a lM e rh o d s J liiU o n l____ V irh ia lMethnrfc u/IndniAi An ,r..a lM i iM | 3 A u to s j Locals | j p W a t c h t

    Slika 2-9. Detaljne informacije o objektu u prozoru Locals

    Poglavlje 2: Poetak:,,Hello World" | 21

  • U sljedeu metodu moiete ui pritiskom na F l l . U o.om sluaju sljedea metoda je

    OrawWindow() klase VJindovi, kao to je prikazano na slici 2-10.

    t ; V irtiu M 'tM t IBobueeidE)' HletosoM Deuelopment enyiit.tima.il ZA' Vto* Oebu, 0a Wntto*

    & i *9. .0*. ; .v:BL tScfcjbon&rploror-So... ' U

    ' Vliliiriini'thnfir f f }

    tSSSSSSS iS : ~ .... V; a.vW) v'-

    i ,^^1^ kfbJS

    11* j SokAton'VktUftMetho'K( t h i s . c o p - to p ; 5i

    { 3 VjrtoalMcthod t h i s . l e t t - tB'MProperi**

    J>'|l]I ffl iaSI RveiifteuraeMntet*hods // c vw il- t :s th e vtndov p'ufclic V i r t u a l v o id DrawindOW

  • POGLAVLJE 3

    Osnove programskog jezika C#

    U poglavlju 2 prikazan je vrlo jednostavan program napisan u jeziku C# . Taj je mali program toliko sloen da smo morali preskoiti nekoliko vanih pojedinosti. U ovom poglavlju te su pojedinosti objanjene detaljnijim prikazom sintakse i strukture samog jezika C# .

    Ovo poglavlje opisuje sustav tipova u jeziku C# , pravei razliku izmeu ugraenih tipova (int, bool itd.) i korisniki definiranih tipova (tipova koje sami stvarate u obliku klasa i suelja). U njemu su objanjene i osnove programiranja poput stvaranja i kori- tenja varijabli i konstanti. Nadalje, tu su objanjene enumeracije, nizovi, identifikatori, izrazi i iskazi.

    U drugom dijelu ovog poglavlja moete pronai objanjenja i primjere koritenja iskaza za kontrolu tijeka i f , switch, while, do.. .while, for i foreach. Objanjeni su i opera- tori, ukljuujui logike, relacijske, matematike operatore i operatore pridruivanja. Slijedi uvod u imenske prostore i kratak vodi kroz C# pretprevoditelj.

    Iako je glavni zadatak jezika C# stvaranje objekata i rad s njima, najbolje je poeti s osnovnim dijelovima: elementima od kojih se objekti stvaraju. U te se elemente ubrajaju ugraeni tipovi koji su temeljni dio jezika C# , kao i sintaktiki elementi jezika C# .

    Tipovi C # je vrlo tipiziran jezik. U takvom jeziku morate deklarirati tip (engl. type) svakog objekta kojeg stvorite (npr. cjelobrojnih vrijednosti, brojeva s pominim zarezom, nizova, prozora, gumba itd.), a prevoditelj e sprijeiti pojavu pogreaka tako to e inzistirati da objektima budu pridrueni samo podaci odgovarajueg tipa. Tip objekta govori prevoditelju koliko je objekt velik (npr. int oznaava objekt od 4 bajta) i koje su njegove mogunosti (npr. gumbi se mogu povui, pritisnuti i tako dalje).

    23

  • Napomena za C# 1.1 programere: sve do inaice 2 platforma .N ET bila je vrlo tipizirana u svemu osim u kolekcijama. Uvoenjem generika

    i*, stvaranje vrlo tipiziranih klasa kolekcija sada je jednostavno, kao to je prikazano u poglavlju 9.

    Poput jezika C++ i Java, C # tipove dijeli u dva skupa: ugraene (engl. intrinsic) tipove koji su dio samog jezika i korisn iki d efin irane tipove koje definira programer.

    C# skup tipova dijeli na jo dvije kategorije: vrijedn osne i referentne tipove.' Osnovna razlika izmeu vrijednosnih i referentnih tipova je nain spremanja njihovih vrijedno- sti u memoriju. Vrijednosni tip uva svoju vrijednost u memoriji dodijeljenoj na stogu (engl. stack).

    Napomena za C i C++ programere: u C# ne postoji eksplicitni pokaza- telj da je objekt referentnog tipa (tj. ne koristi se operator &). Takoer, u C # obino se ne koriste pokazivai (iznimku ovog pravila potraite u poglavlju 22).

    Ako imate vrlo velik objekt, njegovo smjetanje na gomilu ima mnogo prednosti. U poglavlju 4 objanjene su prednosti i nedostaci rada s referentnim tipovima. Ovo se poglavlje bavi ugraenim vrijednosnim tipovima koji su dostupni u C# .

    U C # veliina i format pohrane za razliite ugraene tipove (npr. int) ne ovise o platformi i jednaki su u svim .N ET jezicima.

    C# podrava tipove p ok a z iv a a u C++ stilu, ali oni se koriste samo kod rada s neu- pravljanim kodom. To je kod koji nije stvoren na platformi .NET, na primjer, COM objekti. (Rad s COM objektima objanjen je u poglavlju 22.)

    Rad s ugraenim tipovima C # nudi izobilje ugraenih tipova koji se oekuju od modernog programskog jezika, i svaki od njih preslikava se u temeljni tip kojeg podrava .NET CLS. Preslikavanje C# primitivnih tipova u temeljni .NET tip osigurava da se objekt stvoren u C # moe koristiti naizmjenino s objektima napravljenim u bilo kojem drugom jeziku koji je u skladu s .NET CLS-om, primjerice u VB.NET-u.

    Svi ugraeni tipovi, osim Object (koji je detaljnije opisan u poglavlju 5) i String (opisan u poglavlju 10) su vrijednosni tipovi. Svi korisniki definirani tipovi, osim struktura (pogledajte poglavlje 7) i enumeriranih tipova (pogledajte poglavlje 3) su referentni tipovi.

    24 | Programiranje C#

  • Napomena za Java programere: C# ima iri raspon osnovnih tipova od jezika Java. Treba istaknuti decimalni tip u C# koji je koristan za financijske izraune.

    Svaki tip ima odreenu i nepromjenjivu veliinu. Za razliku od C++, veliina int tipa u C# je uvijek 4 bajta jer se on preslikava u Int32 u .NET CLS-u. U tablici 3-1 popisani su ugraeni vrijednosni tipovi dostupni u jeziku C# .

    Tablica 3-1. Vrijednosni tipovi u C#

    Veliina (u

    Tip bajtovima) .NETtip Opis

    Byte 1 8yte Bezpredznaka (vrijednostod 0 do 255)

    Char 2 Char Unicodeznak

    Bool 1 Boolean True iliFalse

    Sbyte 1 SByte 5 predznakom (vrijednostiod -128 do 127)

    Short 2 Intl6 5 predznakom (vrijednostiod -32,768 do 32,767)

    Ushort 2 UIntl6 Bez predznaka (vrijednostiod 0 do 65,535)

    Int 4 Int32 Cjelobrojnevrijednostispredznakom od -2,147,483,648 do

    2,147,483,647

    Uint 4 UInt32 Cjelobrojnevrijednostibez predznaka od 0 do 4,294,967,295

    Float 4 Single Brojspominim zarezom. uva vrijednostiod otprilike+/- 1.5*1(HSdo

    otprilike3.4I38sasedam znaajnih znamenki.

    Double 8 Double Brojspominim zarezom dvostruke preciznosti. uva vrijednostiod

    otprilike+/- 5.0*10 w do otprilike+/-1.8*10308sa 15-16 znaajnih

    znamenki.

    decimal 16 Decimal Stalnapreciznostdo 28 znamenki ipoloajem decimalnog zareza. Kori-

    stiseu financijskimizraunima izahtijevaprefiks,,mili,,M".

    Long' 8 Int64 Cjelobrojnevrijednostispredznakom od -9,223,372,036,854,775,808

    do 9,223,372,036,854,775,807

    Ulong 8 UInt64 Cjelobrojnevrijednostibez predznaka od 0 do Oxffffffffffffffff

    Napomena za C i C++ programere: u C# vrijednost Boolean varijabli moe biti samo true ili false. Cjelobrojne vrijednosti se ne izjednaavaju sa Boolean vrijednostima u C# i ne postoji implicitno pretvaranje.

    Uz ove primitivne tipove C# ima jo dva vrijednosna tipa: enum (objanjen kasnije u ovom poglavlju) i struct (objanjen u poglavlju 4). U poglavlju 4 objanjene su i druge pojedinosti vrijednosnih tipova, poput primjene vrijednosnih tipova kao referentnih tipova u postupku koji je poznat pod nazivom pakiranje (engl. boxing) i injenice da vrijednosni tipovi ne nasljeuju.

    Poglavlje 3: Osnove programskog jezika C# | 25

  • Stog i gom ila Stog (engl. stack) je podatkovna struktura koja se koristi za spremanje elemenata na naelu posljednji unutra prvi van (poput gomile tanjura u restoranu). Stog se odnosi

    na podruje memorije koje podrava procesor i u koje se spremaju lokalne varijable.

    U C # vrijednosni tipovi (npr. cjelobrojne vrijednosti) se alociraju na stog. Za nji-

    hovu vrijednost se rezervira podru je u memoriji i na to se podru je referira imenom

    varijable.

    Referentni tipovi (npr. objekti) rasporeuju se na gomilu. Gomila (engl. heap) je pod- ruje memorije koje se koristi za alociranje prostora objektim a. Kad se objekt alocira

    na gomilu, vraa se njegova adresa i zatim pridruuje referenci.

    O bjekti na stogu se unitavaju kad izau iz dosega. O kvir stoga je obino definiran

    metodom. Ako lokalnu varijablu deklarirate unutar metode (kao to je objanjeno

    kasnije u ovom poglavlju), objekti koje stavite na stog unutar te m etode bit e uniteni

    kad metoda zavri.

    O bjekti na gomili se sakupljaju u otpad kratko nakon unitavanja posljednje reference

    koja ukazuje na njih.

    rt * Napomena za C i C++ programere: C# upravlja svom memorijom s pomou sustava za sakupljanje otpada - ne postoji operator za brisanje.

    Odabir ugraenog tipa

    Odluku o tome koju ete vrstu cjelobrojne vrijednosti (short, int ili long) koristiti obino donosite na temelju veliine vrijednosti koju elite spremiti. Na primjer, ushort moe sadrati samo vrijednosti od 0 do 65,535 , dok uint moe sadrati vrijednosti od 0 do 4,294,967,295.

    Memorija je razmjerno jeftina, dok je vrijeme jednog programera sve skuplje. Veinu vremena ete varijable deklarirati kao in t, osim ako ne postoji dobar razlog da uinite drukije.

    a Cjelobrojne vrijednosti su esto bre od manjih tipova jer su moderni procesori optimizirani za rad s njima.

    Float, double i decimal nude razliite stupnjeve veliine i preciznosti. Float je dobar za veinu malih necjelobrojnih vrijednosti. Uzmite u obzir da prevoditelj pretpostavlja da je svaki broj s decimalnim zarezom double ako ne kaete drukije. Za doslovnu dodjelu tipa float iza broja dodajte slovo f (pojedinosti pridruivanja vrijednosti litera- lima objanjene su kasnije u ovom poglavlju):

    float someFloat = 57f;

    26 | Programiranje C#

  • Tip char predstavlja Unicode zn ak . char sp ecija ln i sim boli mogu biti jedn ostavn i zna-

    kovi, U n ico de ili kontrolni zn akov i (engl. escape characters) sm jeten i izm eu ap o - strofa. Na prim jer, Aje jed n o stavan zn ak , dok je \u004l U nicode znak. K ontrolni zna-

    kovi su p o sebn i tokeni ko ji se sasto je od dva znaka, od k o jih je prvi obrn uta kosa

    crta . Na prim jer, \t je vodoravni tabulator. U obiajen i kon trolni znakovi navedeni su

    u tablici 3 - 2 .

    Tablica 3-2. Uobiajeni kontrolni znakovi

    Znak Znaenje

    V Apostrof

    \" Navodnik

    \\ Obrnuta kosa crta

    \0 Nuli

    \a Upozorenje

    \b Brisanjeunatrag

    \f Nova stranica

    \n Novi red

    \r Prijelazu sljedeired

    \t Vodoravni tabulator

    \v Okomiti tabulator

    Pretvaranje ugraenih tipova

    Objekti jednog tipa mogu se implicitno ili eksplicitno pretvoriti u objekte drugog tipa. Implicitne se pretvorbe dogaaju automatski - prevoditelj sve radi umjesto vas. Eksplicitne se pretvorbe dogaaju kad vrijednost pretvorite" u drugi tip. Semantika eksplicitne pretvorbe je Hej! prevoditelju, znam to radim!" To se ponekad naziva udarac velikim ekiem" i moe biti vrlo korisno ili vrlo bolno, ovisno o tome nalazi li se va palac na avlu.

    Napomena za VB6 programere: u jeziku VB6 se nizovi znakova i zna- kovni tip mogu lako pomijeati. Znak se tretira kao niz znakova duljine 1. No, u C# tipovi su dobro definirani. Kako biste varijabli char pridru- ili literal, morate ga umetnuti izmeu apostrofa.

    Uzmite u obzir i injenicu da VB 6 metode za pretvorbu izmeu znaka i njegove odgovarajue ASCII vrijednosti (Chr() i Asc()) ne postoje u C# . Kako biste char konvertirali u odgovarajuu ASCII vrijednost, navedite ju kao int (cjelobrojnu vrijednost):

    (in t)'A '

    Da biste broj pretvorili u char, navedite ga kao char:

    (char)65

    Poglavlje 3: Osnove programskog jezika C# | 27

  • Implicitne se pretvorbe dogaaju automatski i u njima se informacije ne mogu izgubiti. Na primjer, short int (koji je veliine dva bajta) moete jednostavno pretvoriti u int (koji je veliine etiri bajta). Bez obzira na to koja se vrijednost nalazi u short, ona se nee izgubiti prilikom pretvorbe u int:

    short x = 5;

    int y = x; // Implicitna pretvorba

    Ako provedete obrnutu pretvorbu, moe lako doi do gubitka informacija. Ako je vri- jednost u in t vea od 32 767 njen dio se moe izgubiti prilikom pretvorbe. Prevoditelj nee izvesti implicitnu pretvorbu iz int u short:

    short x;

    int y = 5 0 0 ;

    x = y; // Nee se prevesti

    Morate izvesti eksplicitnu pretvorbu koristei operator:

    short x;

    int y = 5 0 0 ;

    x = (short) y; // 0K

    Svi ugraeni tipovi sami definiraju vlastita pravila pretvorbe. Ponekad je zgodno defini- rati pravila pretvorbe za korisniki definirane tipove, a to je objanjeno u poglavlju 5.

    Varijable i konstante Varijabla (engl. variable) je lokacija u memoriji s tipom. U prethodnim su primjerima i x i y varijable. Varijablama se mogu pridruiti vrijednosti koji se mogu programski promijeniti.

    WriteLine() .N E T kostur sadri korisnu metodu za ispis na zaslon. Pojedinosti metode System.

    Console.W riteLine() bit e pojanjene kasnije u knjizi, ali osnove su jednostavne. Pozo-

    vite metodu kako je prikazano u primjeru 3 -1 , unosei niz koji elite ispisati na kon-

    zoli i param etre koji e se zamijeniti. U sljedeem primjeru:

    System.Console.WriteLine("Aiter assignmervt, mylnt: {0}", mylnt);

    niz After assignment, mylnt se ispisuje kao takav, iza ega slijedi vrijednost varija-

    ble mylnt. Lokacija parametra zamjene { 0 } zadaje gdje e se prikazati vrijednost prve

    izlazne varijable mylnt - u ovom sluaju, na kraju niza. U sljedeim poglavljima saznat

    ete mnogo vie o WriteLine().

    Varijablu moete napraviti tako to ete deklarirati njezin tip i zatim joj dodijelite naziv. Moete ju inicijalizirati prilikom deklariranja, a novu vrijednost jo j moete dodijeliti bilo kada, jednostavnom promjenom vrijednosti. To je prikazano u primjeru 3-1.

    28 | Programiranje C#

  • primjer 3-1- Inicijalizacija varijable i pridruivanje vrijednosti varijabli

    (tregion Using directives

    using System;

    using System.Collections.Generic;

    using System.Text;

    #endregion

    namespace InitializingVariables

    { class Values

    { static void Main()

    {

    int mylnt = 7;

    Sytem.Console.WriteUne(Initialized, mylnt: {o}",

    mylnt);

    mylnt = 5;

    System.Console.WriteLine("A-fter assignment, mylnt: { o}\

    mylnt);

    } }

    }

    Visual Studio 2005 za svaki program stvara imenski prostor i iskaz using (kao i podruje upotrebe). Kako bi se utedilo na prostoru, to je izostavljeno u veini primjera koda, iako je ukljueno u primjere koje moete preuzeti s prezentacija 0 Reilly ili LibertyAssociates.com.

    Ovdje se varijabla mylnt inicijalizira sa vrijednosti 7, ta se vrijednost prikazuje, varija- bli se dodjeljuje vrijednosti 5 koja se zatim ponovno prikazuje.

    Napomena za VB6 programere: u C# tip podatka dolazi ispred naziva varijable.

    Obavezno pridruivanje Ujeziku C # pridruivanje je obavezno: to jest, varijable se moraju inicijalizirati ili im se mora pridruiti vrijednost prije koritenja. Kako biste isprobali ovo pravilo, promi- jenite red koji inicijalizira mylnt u primjeru 3-1 u:

    int mylnt;

    i spremite promijenjeni program prikazan u primjeru 3-2.

    Poglavlje 3: Osnove programskog jezika C# | 29

  • *__ * Napomena za C i C++ programere: u C# , svakoj se varijabli prije upo-

    trebe mora pridruiti konana vrijednost.

    Primjer 3-2. Koritenje varijable koja nije inicijalizirana

    #region Using directives

    using System;

    using System.Collections.Generic;

    using System.Text;

    #endregion

    namespace UninitializedVariable

    { class UninitializedVariable

    { static void Main(string[] args)

    { int mylnt;

    System.Console.WriteLine

    ("Uninitialized, mylnt: {0}", mylnt);

    mylnt = 5;

    System.Console.WriteLine("Assigned, mylnt: {0}", mylnt);

    } }

    }

    Kada pokuate prevesti ovaj ispis, C# prevoditelj e prikazati poruku o pogreci pri- kazanu na slici 3-1.

    J DescrlpUon . __ ^ ; | . . F fe . . - i Colum n I

    1 Use o f unassigned local va riab le 'm y ln t ' U n in itia lized Variable.es 17 33

    Slika 3-1. Poruka o pogreci nastaloj zbog koritenja varijable kojoj nije dodijeljena vrijednost

    Ako dvaput pritisnete poruku o pogreci razvojni okoli e postaviti kursor na mjestu pogreke u kodu.

    U C# nije doputeno koritenje varijabli koje nisu inicijalizirane. Znai li to da svaku varijablu u programu morate inicijalizirati? Zapravo, ne. Ne morate stvarno inicija- lizirati varijablu, ali jo j prije koritenja morate dodijeliti vrijednost. U primjeru 3-3 prikazana je ispravna inaica programa.

    30 | Programiranje C#

  • Primjer 3-3. Pridruivanje bez inicijaliziranja

    #region Using directives

    using System;

    using System.Collections.Generic;

    using System.Text;

    #endregion

    namespace AssigningWithout Initializing

    ^ class AssigningWithout Initializing

    static void Main(string[] args)

    { int mylnt;

    mylnt = 7;

    SystenuConsole.WriteLine(Assigned, mylnt: {o}'', mylnt);

    mylnt = 5;

    System.Console.WriteLine(''Reassigned, mylnt: {0}", mylnt);

    } }

    }

    Konstante Konstanta (engl. constant) je varijabla ija se vrijednost ne moe promijeniti. Varijable predstavljaju moan alat, ali ponekad je potrebna tono odreena vrijednost, vrijed- nost za koju elite biti sigurni da e ostati nepromijenjena. Na primjer, u programu za simuliranje kemijskog eksperimenta trebate koristiti toke vrelita i ledita na Fahren- heitovoj skali. Program e biti jasniji ako varijable u koje se vrijednosti spremaju nazo- vete FreezingPoint i BoilingPoint, ali ne elite dopustiti da se njihove vrijednosti pro- mijene. Kako to sprijeiti? Rjeenje je koritenje konstanti.

    Postoje tri vrste konstanti: literali (engl. literals), sim bolike kon stante i enum eracije (engl. enum erations). U izrazu:

    x = 3 2 ;

    vrijednost 32 je literal. 32 uvijek ima vrijednost 32. Toj konstanti ne moete dodijeliti drugu vrijednost. Koliko god se trudili ne moete postii da 32 predstavlja vrijednost 99.

    Simbolike konstante pridruuju naziv konstantnoj vrijednosti. Simbolilytkonstantu moete deklarirati s pomou kljune rijei const i sljedee sintakse;/

    const tip identifikator=vrijednost;

    Konstanta se prilikom deklariranja mora inicijalizirati, a kad je jednom inicijalizirana, ne moete ju mijenjati. Na primjer:

    const int FreezingPoint = 3 2 ;

    Poglavlje 3: Osnove programskog jezika C# | 31

  • U ovoj deklaraciji, 32 je literal, a FreezingPoint je simbolika konstanta tipa int. U primjeru 3 -4 prikazana je upotreba simbolikih konstanti.

    Primjer 3-4. Upotreba simbolikih konstanti

    ttregion Using directives

    using System;

    using System.Collections.Generic;

    using System.Text;

    (tendregion

    namespace SymbolicConstants

    { class SymbolicConstants

    { static void Main(string[] args)

    { const int FreezingPoint = 32; // Stupnjevi Fahrenheita

    const int BoilingPoint = 212;

    System.Console.WriteLine("Freezing point of water: {o}",

    FreezingPoint);

    System.Console.WriteLine(''Boiling point of water: {o}",

    BoilingPoint);

    BoilingPoint = 2 1 ;

    } }

    )

    U primjeru 3-4 stvorene su dvije simbolike cjelobrojne konstante; FreezingPoint i Boi- lingPoint. Nazivi konstanti napisani su Pascalovim stilom, no to nije obavezno.

    Svrha ovih konstanti je da u svim potrebnim izrazima koriste vrijednosti 32 i 212 za toke ledita i vrelita ali, budui da konstante imaju nazive, one prenose mnogo vie znaenja. Ako odluite program prebaciti na Celzijusovu skalu, konstante moete ponovno inicijalizirati prilikom prevoenja na 0 i 100. Ostatak koda trebao bi nor- malno funkcionirati.

    Kako biste se uvjerili da se konstanti ne moe ponovno dodijeliti vrijednost, pokuajte uk