26
C# Izvornik Stanley B. Lippman Prevod Jan Sokol CET Computer Equipment and Trade Beograd London • Munich • Paris • Madrid Boston • San Francisco • New York • Toronto • Montreal Capetown • Sydney • Tokyo • Singapore • Mexico City

Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

C#Izvornik

Stanley B. Lippman

PrevodJan Sokol

CET Computer Equipment and Trade

Beograd

London • Munich • Paris • MadridBoston • San Francisco • New York • Toronto • Montreal

Capetown • Sydney • Tokyo • Singapore • Mexico City

Page 2: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

C# Izvornik

ISBN 86-7991-201-8

Autorizovan prevod sa engleskog jezika knjige C# Primer : A Practical Approach

PUBLISHED BY Addison-Wesley, USA.Original Copyright© 2002. by Pearson Education, Inc.Copyright© prevoda, 2003. CET Computer Equipment and Trade

Sva prava zadržana. Ni jedan deo ove knjige ne može biti reprodukovan, snimljen, iliemitovan na bilo koji način: elektronski, mehanički, fotokopiranjem, ili drugim vidom, bezpisane dozvole izdavača. Informacije korišćene u ovoj knjizi nisu pod patentnom zaštitom. Upripremi ove knjige učinjeni su svi napori da se ne pojave greške. Izdavač i autori nepreuzimaju bilo kakvu odgovornost za eventualne greške i omaške, kao ni za njihoveposledice.

Prevod Jan Sokol

Recenzent Nikola Milanović

Lektor Mirjana Terzić

Urednik Radmila Ivanov

Tehnički urednik Dušan Čašić

Prelom Zoran Stevanović

Izdavač CET Computer Equipment and TradeBeograd, Skadarska 45tel/fax: 011 3243-043, 3235-139, 3237-246http://www.cet.co.yue-mail: [email protected]

Za izdavača Dragan Stojanović, direktor

Obrada korica Bit Inženjering, Beograd

Tiraž 1000

Štampa „Svetlost”, Čačak

Page 3: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

Sadržaj iii

Sadržaj

Predgovor ix

1 Zdravo C# 11.1 Prvi C# program 1

1.2 Prostori imena 6

1.3 Alternativni oblici funkcije Main() 10

1.4 Pravljenje iskaza 11

1.5 Otvaranje tekstualne datoteke za čitanje i pisanje 17

1.6 Formatiranje izlaza 19

1.7 Tip string 21

1.8 Lokalni objekti 24

1.9 Vrednosni i referentni tipovi 28

1.10 C# niz 29

1.11 Izraz new 30

1.12 Sakupljanje otpadaka 32

1.13 Dinamički nizovi: kolekcijska klasa ArrayList 33

1.14 Unificirani sistem tipova 35

1.14.1 Skriveno pakovanje (boxing) 36

1.14.2 Raspakivanjem se gubi informacija o tipu 37

1.15 Stepeničasti nizovi 39

1.16 Kontejner Hashtable 41

1.17 Rukovanje izuzecima 44

1.18 Osnovni jezički priručnik za C# 47

1.18.1 Ključne reči 47

1.18.2 Ugrađeni numerički tipovi 49

1.18.3 Aritmetički, relacioni i uslovni operatori 51

1.18.4 Prioritet operatora 54

1.18.5 Iskazi 55

Page 4: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

iv C# Izvornik

2 Dizajn klase 592.1 Naša prva nezavisna klasa 59

2.2 Otvaranje novog Visual Studio projekta 63

2.3 Deklarisanje podataka članova 66

2.4 Svojstva 67

2.5 Indekseri 69

2.6 Inicijalizacija članova 72

2.7 Konstruktor klase 73

2.8 Implicitna referenca this 76

2.9 static članovi klase 79

2.10 const i readonly podaci članovi 81

2.11 Vrednosni tip enum 83

2.12 Tip delegate 86

2.13 Semantika parametara funkcije 92

2.13.1 Prosleđivanje po vrednosti 94

2.13.2 Prosleđivanje po referenci: parametar ref 96

2.13.3 Prosleđivanje po referenci: paremetar out 97

2.14 Preopterećivanje funkcija 99

2.14.1 Razrešavanja preopterećenih funkcija 100

2.14.2 Određivanje najboljeg slaganja 101

2.15 Liste parametara promenljive dužine 103

2.16 Preopterećivanje operatora 107

2.17 Operatori konverzije 110

2.18 Destruktor klase 113

2.19 Vrednosni tip struct 113

3 Objektno orijentisano programiranje 1173.1 Objektno orijentisani koncepti programiranja 117

3.2 Podržavanje polimorfnog upitnog jezika 121

3.3 Dizajniranje hijerarhije klasa 124

3.4 Objektne lekcije 128

3.5 Dizajniranje apstraktne bazne klase 132

3.6 Deklarisanje apstraktne bazne klase 133

3.7 Statički članovi apstraktne bazne klase 137

3.8 Hibridna apstraktna bazna klasa 138

3.8.1 Objektni model jednostrukog nasleđivanja 140

Page 5: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

Sadržaj v

3.8.2 Kako se razlikuje hibridna apstraktna klasa? 141

3.9 Definisanje izvedene klase 143

3.10 Redefinisanje nasleđenog virtuelnog interfejsa 145

3.11 Redefinisanje virtuelnih metoda klase Object 146

3.12 Pristup članu: modifikatori new i base 147

3.12.1 Pristupnost naspram vidljivosti 150

3.12.2 Enkapsuliranje pristupa baznoj klasi 151

3.13 Zatvaranje klase 153

3.14 Hijerarhija klase Exception 154

4 Nasleđivanje interfejsa 1594.1 Implementiranje interfejsa: System.IComparable 160

4.2 Pristupanje postojećem interfejsu 163

4.3 Definisanje interfejsa 166

4.3.1 Implementiranje našeg interfejsa: dokaz koncepta 168

4.3.2 Integrisanje interfejsa u sistemsko okruženje 174

4.4 Eksplicitna implementacija člana interfejsa 178

4.5 Nasleđivanje članova interfejsa 180

4.6 Preopterećen, sakriven ili dvosmislen? 183

4.7 Vladanje semantikom kopiranja: ICloneable 185

4.8 Vladanje semantikom finalizacije: IDisposable 187

4.9 BitVector: Proširenje pomoću kompozicije 190

5 Istraživanje prostora imena System 1995.1 Podržavanje osnovnih tipova 199

5.2 Niz je System.Array 200

5.3 Upiti o okruženju 203

5.3.1 Klasa Environment 204

5.3.2 Pristupanje svim promenljivim okruženja 205

5.3.3 Klasa Process 207

5.3.4 Pronalaženje logičkih disk jedinica 208

5.4 System.IO 209

5.4.1 Upravljanje nastavcima za tip datoteke: klasa Path 210

5.4.2 Upravljanje direktorijumima 212

5.4.3 Upravljanje datotekama 215

5.4.4 Čitanje i pisanje datoteka 216

Page 6: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

vi C# Izvornik

5.5 Sistemska zbirka 221

5.5.1 Kontejner System.Collections.Stack 221

5.5.2 Klasa System.Diagnostics.TraceListener 223

5.5.3 System.Math 225

5.5.4 Klasa DateTime 226

5.6 Regularni izrazi 228

5.7 System.Threading 235

5.8 Web model Zahtev/Odgovor 241

5.9 System.Net.Sockets 245

5.9.1 Objekat tipa TcpListener sa serverske strane 246

5.9.2 Objekat tipa TcpClient sa klijentske strane 248

5.10 System.Data 249

5.10.1 Tabele baze podataka 250

5.10.2 Otvaranje baze podataka: Biranje dobavljača podataka 252

5.10.3 Navigacija u objektu tipa DataTable 254

5.10.4 Postavljanje objekta tipa DataRelation 257

5.10.5 Biranje i izrazi 258

5.11 System.Xml 259

5.11.1 Dobijanje XML podataka iz naših programa 260

5.11.2 Klasa XmlTextReader: vatrogasna stanica 265

5.11.3 Objektni model dokumenta 272

5.11.4 System.Xml.Xsl 277

5.11.5 System.Xml.XPath 279

6 Dizajner Windows obrazaca 2836.1 Prvi program sa Windows obrascima 283

6.2 Pravljenje grafičkog korisničkog interfejsa (GUI) 285

6.3 Implementiranje povratnih poziva rutina za obradu događaja 288

6.3.1 Implementiranje događaja kontrole TextBox 292

6.3.2 Implementiranje događaja dugmeta OK 293

6.3.3 Implementiranje događaja dugmeta Quit 294

6.4 Inspekcija i generisanje događaja kontrola 295

6.4.1 Labele se mogu programirati 296

6.5 Implementiranje dijaloga tipa MessageBox 298

6.6 Okvir sa listom (List Box) za neformatirani izlaz 299

6.7 Razmatranje dijaloga za datoteke 302

Page 7: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

Sadržaj vii

6.8 Mnogo dugmadi 304

6.9 Serviranje menija 306

6.10 Kontrola DataGrid 308

6.11 Dodavanje kontrole PictureBox 310

7 ASP.NET i dizajner Web obrazaca 3157.1 Naš prvi program sa Web obrascima 316

7.2 Otvaranje projekta ASP.NET Web aplikacije 316

7.2.1 Menjanje svojstava dokumenta 318

7.2.2 Dodavanje kontrola u dokument: Label 319

7.3 Dodavanje stranica u projekat 320

7.4 Kontrola HyperLink: Povezivanje sa drugim stranicama 321

7.5 Kontrola DataGrid 321

7.6 Razumevanje životnog ciklusa stranice 323

7.7 Dobavljač podataka 325

7.8 Upravljanje Web stanjem 326

7.8.1 Dodavanje kontrole TextBox 328

7.8.2 Dodavanje kontrole ImageButton 329

7.8.3 Dodavanje kontrole ListBox 329

7.9 Upravljanje stanjem: Članovi klase 331

7.10 Upravljanje stanjem: Objekat tipa Session 332

7.11 Upravljanje stanjem: Objekat tipa Application 333

7.12 Validacione kontrole 334

7.13 Dodavanje kontrole DropDownList 336

7.14 Dodavanje grupe kontrola RadioButton 337

7.15 Dodavanje kontrole CheckBoxList 338

7.16 Dodavanje validacionih kontrola 340

7.17 Dodavanje kotrole Calendar 344

7.18 Dodavanje kontrole Image 345

7.19 Programiranje kontrola na Web serveru 345

8 Zajednički izvršni jezik 3498.1 Sklopovi 349

8.2 Refleksija tipova za vreme izvršavanja 353

8.3 Modifikovanje izdvajanja pomoću prebrojivog tipa BindingFlags 358

8.4 Pozivanje metoda za vreme izvršavanja 362

Page 8: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

viii C# Izvornik

8.5 Delegiranje testiranja na refleksiju 364

8.6 Atributi 367

8.6.1 Izvorni atribut Conditional 367

8.6.2 Izvorni atribut Serializable 369

8.6.3 Izvorni atribut DllImport 370

8.7 Implementiranje naše klase Attribute 372

8.7.1 Pozicioni i imenovani parametri 375

8.7.2 AttributeUsage 376

8.8 Otkrivanje atributa pomoću refleksije za vreme izvršavanja 376

8.9 Međujezik 378

8.9.1 Proučavanje međujezika 379

8.9.2 Pomoćni program ildasm 381

Indeks 385

Page 9: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

ix

Predgovor

C# je novi jezik napravljen u Microsoftu i predstavljen sa Visual Studio .NET-om. Više od milion redova C# koda je već upotrebljeno za implementaciju klasa.NET okruženja. Ova knjiga predstavlja jezik C# i njegovu upotrebu u progra-miranju klasa .NET okruženja ilustrujući aplikacione domene kao što suASP.NET i XML.

Najpre ću predstaviti programski zadatak, a onda prikazati jednu ili dve imple-mentacije opisujući jezička svojstva ili aspekte klase okruženja. Cilj je da po-kažem kako koristiti jezik i klase okruženja za rešavanje problema, a ne dajednostavno nabrojim osobine jezika i API klasa okruženja.

Učenje jezika C# je dvostepeni proces: učenje jezika C# i upoznavanje klasa.NET okruženja. Ovaj dvostepeni proces se ogleda u organizaciji ovog teksta.

U prvom koraku prikazujemo jezik – njegove mehanizme kao što su klase i na-sleđivanje interfejsa i delegati, i odgovarajuće koncepte kao što je unificirani si-stem tipova, referentni naspram vrednosnih tipova, pakovanje i tako dalje. Ovajkorak je objašnjen u prva četiri poglavlja.

Drugi korak je upoznavanje sa klasama .NET okruženja, posebno sa Windows iWeb programiranjem, kao i podrškom za XML. Ova tema je obrađena u drugojpolovini knjige.

Ako savladate sve lekcije iz ove knjige, vaše veštine C# programiranja bi trebaloda postanu mnogo bolje.. Pored toga, upoznaćete se sa dobrim delom klasa.NET okruženja. Sav kod je dostupan za preuzimanje na Web lokaciji moje kom-panije www.objectwrite.com.

Poštu mi možete poslati direktno na [email protected].

Page 10: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

x C# Izvornik

Organizacija knjigeKnjiga sadrži osam relativno dugih poglavlja. Prva četiri poglavlja su posvećenajeziku C# i u njima se opisuju ugrađene jezičke osobine, mehanizam klasa, na-sleđivanje klasa i nasleđivanje interfejsa. Sledeća četiri poglavlja istražuju različi-te domene biblioteka podržanih u klasama .NET okruženja.

U poglavlju 1 opisuju se osnove jezika, kao i neke osnovne klase obezbeđene uklasama okruženja. Ovo poglavlje vođeno je dizajniranjem male aplikacije. Uve-deni su koncepti kao što su prostori imena, rukovanje izuzecima i unificirani si-stem tipova.

U poglavlju 2 opisuju se osnove pravljenja klasa. Naučićemo šta je nivo pristu-pa, koje su razlike između članova const i readonly i objasniti specijalizova-ne metode kao što su indekseri i svojstva. Opisaćemo različite strategijeinicijalizacije članova, kao i pravila za preopterećivanje operatora i operatorekonverzije. Naučićemo šta je to tip delegate koji služi kao vrsta univerzalnogpokazivača na funkciju.

U poglavljima 3 i 4 prikazuju se nasleđivanje klase i interfejsa. Nasleđivanje kla-se nam omogućava da definišemo familiju specijalizovanih tipova koji nadjača-vaju generički interfejs, kao što je apstraktna bazna klasa WebRequest iprotokolno specifični podtip HttpWebRequest. Sa druge strane, nasleđivanjeinterfejsa nam omogućava da obezbedimo zajednički servis ili deljene atributeza inače nepovezane tipove. Na primer, interfejs IDisposable oslobađa resur-se. Klase koje drže veze sa bazom podataka ili rukovaoce prozorom će najvero-vatnije implementirati IDisposable iako su na drugi način nepovezane.

Poglavlje 5 obezbeđuje širok obim biblioteka klasa u .NET-u. Naučićemo šta jeto ulaz i izlaz, uključujući rukovanje datotekom i direktorijumima, regularne iz-raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe-sponse, kratki uvod u ADO.NET i ostvarivanje veze sa bazom podataka iupotrebu XML-a.

Poglavlja 6 i 7 objašnjavaju "povuci i pusti" razvoj Windows obrazaca i Webobrazaca. Poglavlje 7 se usredsređuje na ASP.NET i životni ciklus Web stranice.Oba poglavlja obezbeđuju mnogo primera upotrebe postojećih kontrola i doda-vanje rukovaoca događajima za korisničku interakciju.

Page 11: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

Predgovor xi

Poslednje poglavlje obezbeđuje programerski uvod u .NET zajednički izvršni je-zik (Common Language Runtime). Ono daje fokus na sklopove, refleksiju tipo-va, atribute i završava se kratkim pregledom odgovarajućeg međujezika koji jecilj kompilacije svih .NET jezika.

Napisano za programereU ovoj knjizi se ne očekuje da poznajete C++, Visual Basic ili Javu, ali se pretpo-stavlja da ste programirali u nekom jeziku. Ne očekujem, na primer, da znatetačnu sintaksu naredbe petlje foreach jezika C#, ali pretpostavljam da znatešta je to petlja. Iako ću ilustrovati kako da pozovete funkciju u jeziku C#, pret-postavljam da znate šta mislim kada kažem "pozvati funkciju". Ovaj tekst nezahteva prethodno znanje objektno orijentisanog programiranja ili ranije verzijeASP-a i ADO-a.

Neki ljudi – neki vrlo pametni ljudi – smatraju da je pod .NET-om programskijezik na drugom mestu u odnosu na odgovarajući zajednički izvršni jezik (Com-mon Language Runtime – CLR) oko kojeg jezici plutaju kao kontinenti na tek-tonskim pločama. Ja se ne slažem. Jezik je način kako se izražavamo, i izborjednog jezika utiče na dizajn naših programa. U ovoj knjizi se pretpostavlja da jejezik C# omiljeni jezik za .NET programiranje.

Knjiga je organizovana u osam relativno dugih poglavlja. Prva četiri poglavlja seusredsređuju na jezik C# pregledajući ugrađene jezičke osobine, mehanizamklasa, nasleđivanje klasa i nasleđivanje interfejsa. Sledeća četiri poglavlja is-tražuju različite domene biblioteka podržanih u klasama .NET okruženja, kaošto su regularni izrazi, niti, soketi, Windows obrasci, ASP.NET i zajednički iz-vršni jezik.

Leksičke konvencijeImena tipova, objekti i ključne reči su u fontu Courier kao što je int, unapreddefinisani tip u jeziku; Console, klase definisane u okruženju; maxCount,objekat definisan ili kao podatak član ili kao lokalni objekat u funkciji; i fore-ach, jedna od unapred definisanih naredbi petlji. Iza imena funkcija sledi parpraznih zagrada kao u WriteLine(). Prvo uvođenje koncepta, kao što je saku-pljanje otpadaka ili enkapsuliranje podataka, predstavljen je kurzivnim fontom. Na-mera ovih konvencija je da tekst učine čitljivijim.

Page 12: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

xii C# Izvornik

PriznanjaOva knjiga je rezultat rada mnogih koji su pomagali njenom autoru da ostanena kursu. Najsrdačnije zahvaljujem svojoj ženi Bet i svojoj deci, Danijelu i Ani.Propustio sam mnogo porodičnih izlazaka da bi ova knjiga mogla biti urađena.Hvala svima što ste bili (uglavnom) strpljivi i puni razumevanja i niste prečestopitali da li sam već završio.

Treba da zahvalim Caro Segal i Shimon Cohenu na you-niversity.com, koji su miposvetili mnogo vremena i pružili ohrabrenje. Takođe dugujem zahvalnost Eri-cu Gunnersonu, Peteru Draytonu i Donu Boxu, koji su u jednom ili drugom tre-nutku ispunjavali ulogu viteza na konju.

Želeo bih da se zahvalim i Eleni Driskill. Dva puta. Prvo, za one divne crteže upoglavlju 6. Drugo, za njenu dozvolu da ih reprodukujem.

Deborah Lafferty je bila moj urednik od prvog izdanja C++ Primer davne 1986.Ona je uvek imala razumevanja za mene i ja veoma cenim njena ohrabrivanja (ipodsticanja) u realizaciji ovog projekta.

Nekoliko specijalnih produkcijskih zahvalnica upućujem Stephanie Hiebert iSteve Hallu. Stephanie je glavni urednik izdanja mog skoro dvadesetogodišnjegizdavanja. Ona je ovu knjigu učinila boljom. Steve me je vratio u moje sedlo zakucanje pošto sam bio uzdrman široko opasnim Framemaker problemima. Ne-ka deo mog virtuelnog šešira dobijete oboje.

Sledeći saradnici su ponudili mnoge pametne komentare i sugestije pri pregle-danju različitih delova ovog rukopisa: Indira Dhingra (posebno hvala za obez-beđivanje poslednjeg smisaonog pregleda ovog rukopisa), Cay Horstmann,Eugene Kain, Jeff Kwak, Michael Lierheimer, Drew Nathanson, Clovi Tondo iDamien Watkins.

Delovi ovog rukopisa su bili isprobani na kursevima i razgovorima širom našeplanete: Sydney, Amsterdam, Munich, Tel Aviv, Orlando, San Francisco i San Jo-se. Hvala svima koji su obezbedili povratni odgovor.

Page 13: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

Predgovor xiii

ResursiNajbogatija dokumentacija kojoj ćete se vremenom vraćati opet je Visual Stu-dio .NET dokumentacija. Reference .NET okruženja su osnova za pravljenje bilokog C#/.NET programiranja.

Drugi bogati izvor o .NET-u sastoji se od artikala i članaka u MSDN Magazinu.Uvek sam impresioniram onim što nađem u svakom od njih. Možete ga naći naadresi http://msdn.microsoft.com/msdnmag.

Diskusiona lista DOTNET, koju sponzoriše DevelopMentor, bogat je izvor in-formacija. Na nju se možete prijaviti na adresi http://discuss.develop.com.

Sve što su Jeffrey Richter, Don Box, Aaron Skonnard ili Jeff Prosise napisali o.NET-u (ili XML-u u slučaju Aarona) treba obavezno pročitati. Trenutno, najve-ći deo onog što pišu pojavljuje se u MSDN Magazinu.

Navodim spisak knjiga za koje mislim da su veoma korisne:

❑ Active Server Pages+, Richard Anderson, Alex Homer, Rob Howard i DaveSussman, Wrox Press, Birmingham, England, 2000.

❑ C# Essentials, Ben Albahari, Peter Drayton i Brad Merrill, O’Reilly, Cambrid-ge, MA, 2001.

❑ C# programming, Burton Harvey, Simon Robinson, Julian Templeman, i Kar-li Watson, Wrox Press, Birmingham, England, 2000.

❑ Essental XML: Beyond Markup, Don Box, Aaron Skonnard i John Lam, Addi-son-Wesley, Boston, 2000.

❑ Microsoft C# Language Specifications, Microsoft Press, Redmond, WA, 2001.

❑ A Programmer’s Introduction to C#, 2nd Edition, Eric Gunnerson, Apress, Ber-keley, CA, 2001.

Stanley LippmanLos Angeles

November 18, 2001.www.objectwrite.com

Page 14: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET
Page 15: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

1

Poglavlje 1

Zdravo C#

Moja ćerka je učila da svira brojne muzičke instrumente. Sa svakim od njih jeimala strah da počne svirati klasiku – ne, ne Schubert ili Schoenberg, negoBackstreet Boys i Britney Spears. Trudeći se da zadrže njeno interesovanje doksu je upućivali u osnove sviranja, njeni učitelji muzike su joj uglavnom po-vlađivali. U nekom smislu ovo poglavlje pokušava da održi isti nesigurni balansu predstavljanju jezika C#. U našem slučaju klasika je predstavljena Web obra-scima i nasleđivanjem tipova. Osnove su naoko prizemni unapred definisani je-zički elementi i mehanizmi, kao što su pravila opsega, aritmetički tipovi iprostori imena. Moj metod podrazumeva da uvodim jezičke elemente kako po-staju neophodni za implementaciju prvog malog programa. Za one koji raz-mišljaju tradicionalnije, poglavlje se završava zaključnom listom unapreddefinisanih jezičkih elemenata.

C# podržava oba numerička tipa, celobrojni i sa pokretnim zarezom, tip Boo-lean, tip Unicode znak i visoko precizne decimalne tipove. Ovi tipovi se posma-traju kao jednostavni tipovi. Sa ovim tipovima je povezan skup operatora,uključujući sabiranje (+), oduzimanje (-), jednakost (==) i nejednakost (!=). C#takođe obezbeđuje unapred definisani skup naredbi kao što su uslovne if iswitch naredbe, kao i naredbe za izvršavanje petlji for, while i foreach. Sveone, kao i mehanizmi prostora imena i rukovanja izuzecima, opisani su u ovompoglavlju.

1.1 Prvi C# programTradicionalni prvi program u novom jeziku je onaj koji na korisničkoj konzolištampa Hello, World! U C#-u ovaj program se implementira ovako:

Page 16: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

2 C# Izvornik

// Naš prvi C# programusing System;class Hello{ public static void Main() { Console.WriteLine( "Hello, World!" ); }}

Kada se kompajlira i izvrši, naš program generiše poznato

Hello, World!

Naš program ima četiri elementa: (1) komentar predstavljen dvostrukom ko-som crtom (//), (2) direktivu using, (3) definiciju klase i (4) funkciju članicaklase (alternativno nazvan metod klase) koja je nazvana Main().

C# program počinje izvršavanje u funkciji Main(), članici klase. Ovo se nazivaulazna tačka programa. Main() mora biti definisana kao static. U našemprimeru deklarišemo je i kao public i kao static.

public identifikuje dozvoljeni nivo pristupa funkciji Main(). Članu klase de-klarisanom kao public može se pristupiti iz bilo kog dela programa. Član kla-se generalno je ili funkcija članica koja izvršava određenu operaciju povezanu saponašanjem klase, ili podatak član koji sadrži vrednost povezanu sa stanjem kla-se. Tipično, funkcije članice klase se deklarišu kao public, a članovi podaci sedeklarišu kao private. ( Nivoe pristupa članu opet ćemo razmotriti kada bu-demo dizajnirali klase.)

Generalno, funkcije članice klase podržavaju ponašanje povezano sa klasom. Naprimer, WriteLine() je javna funkcija članica klase Console. WriteLine()štampa rezultat na korisničku konzolu, posle kojeg sledi znak za novi red. Ta-kođe, klasa Console obezbeđuje funkciju Write(). Write() štampa izlaz naterminal, ali bez umetanja znaka za novi red. Tipično, Write() koristimo kadaželimo da korisnik odgovori na upit prosleđen konzoli, a WriteLine() kadajednostavno prikazujemo informaciju. Ubrzo ćemo videti relevantan primer.

Primarna aktivnost C# programera je da dizajniraju i implementiraju klase. Štasu klase? Uglavnom predstavljaju entitete u našem aplikacionom domenu. Na

Page 17: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

Zdravo C# 3

primer, ako razvijamo bibliotečki sistem za izdavanje knjiga, verovatno će nambiti potrebne klase kao što su Book, Borrower i DueDate (sa aspekta vreme-na).

Odakle dolaze klase? Naravno, najčešće od programera kao što smo mi. Pone-kad je naš posao da ih implementiramo. Ova knjiga je osmišljena i napravljenatako da od vas napravi eksperta u toj oblasti. Ponekad su klase već dostupne. Naprimer, .NET System okruženje obezbeđuje klasu DateTime koja je podesna zakorišćenje u našem predstavljanju apstrakcije DueDate. Jedan od izazova da sepostane ekspert C# programer – i to ne trivijalan – je mogućnost bliskosti sa višeod 1000 klasa definisanih unutar .NET okruženja. Ne mogu sve da ih obuhva-tim u ovom tekstu, ali ćemo razmotriti dobar broj klasa uključujući podršku zaregularne izraze, niti, sokete, XML i Web programiranje, podršku za baze poda-taka i novi način građenja Windows aplikacija.

Izazovan problem je kako logično organizovati hiljadu ili više klasa tako da kori-snici (to smo mi) mogu locirati i od njih napraviti neki smisao (i sačuvati imenaod kolizije sa drugim imenima). Fizički ih možemo organizovati unutar direk-torijuma. Na primer, sve klase koje podržavaju Active Server Pages (ASP)mogu se staviti u ASP.NET direktorijum pod korenskim direktorijumomSystem.NET. Ovo organizaciju čini sasvim jasnom nekome ko pretura postrukturi direktorijuma.

Šta sa unutrašnjostima programa? Kako se ispostavilo, postoji analogno organi-zovan mehanizam unutar samog C#-a. Radije nego da definišemo fizički direk-torijum, identifikujemo prostor imena (namespace ). Za .NET okruženje, prostorimena koji se nalazi na vrhu nazvan je System. Na primer, klasa Console jedefinisana unutar prostora imena System.

Grupi klasa koje podržavaju zajedničku apstrakciju je dat njihov vlastiti prostorimena definisan unutar prostora imena System. Na primer, prostor imena Xmlje definisan unutar prostora imena System. (Kažemo da je prostor imena Xmlugnežđen unutar prostora imena System.) Zauzvrat, nekoliko prostora imenaje ugnežđeno unutar prostora imena Xml. Na primer, postoji prostor imena Se-rialization, kao i prostori imena XPath, Xsl i Schema. Ovi razdvojeniprostori imena unutar prostora imena Xml su razdvojeni da bi enkapsulirali ilokalizovali deljenu funkcionalnost unutar opšteg opsega XML-a. Na primer,

Page 18: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

4 C# Izvornik

ovo uređenje olakšava identifikaciju podrške koju .NET obezbeđuje za WorldWide Web Consortium (W3C) XPath preporuku. Drugi prostori imena, ug-nežđeni unutar prostora imena System, uključuju IO koji sadrži klase za dato-teke i direktorijume, Collections, Threading, Web i tako dalje.

U strukturi direktorijuma pokazujemo vezu sadržanih direktorijuma i onog ko-ji ih sadrži sa obrnutom kosom crtom (\), bar pod Windowsom – na primer,

System\Xml\XPath

Sa prostorima imena, slično, vezu između sadržanih prostora i onog koji ih i sa-drži prikazujemo pomoću operatora scope (.) na mestu obrnute kose crte – naprimer:

System.Xml.XPath

U oba slučaja znamo da je XPath sadržan unutar Xml, koji je sadržan unutarSystem.

Kad god se pozovemo na ime u C# programu, kompajler mora povezati to imesa stvarnom deklaracijom nečega negde u našem programu. Na primer, kada na-pišemo:

Console.WriteLine( “Hello, World!“ );

kompajler mora nekako otkriti da je Console ime klase i da je WriteLine()funkcija članica unutar klase Console – što znači da je unutar opsega definicijeklase Console. Zato što smo u našoj datoteci definisali samo klasu Hello, beznaše pomoći kompajler ne može razrešiti na šta upućuje ime Console. Kad godkompajler ne može da razreši na šta upućuje ime, on generiše grešku za vremekompajliranja, što zaustavlja građenje našeg programa:

C:\C#Programs\hello\hello.cs(7):

The type or namespace name 'Console' doesnot exists in the class or namespace

(Tip ili prostor imena 'Console' ne postojiu klasi ili prostoru imena)

Direktiva using u našem programu,

using System;

Page 19: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

Zdravo C# 5

upućuje kompajler da pogleda u prostor imena System za bilo koje ime koje nemože odmah razrešiti unutar datoteke koja se obrađuje – u ovom slučaju, dato-teku koja sadrži definiciju naše klase Hello() i njenu funkciju članicuMain().

Alternativno, možemo kompajleru eksplicitno reći gde da traži:

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

Neki ljudi – u stvari, neki pametni i u svakom slučaju vrlo pristojni ljudi – veru-ju da je eksplicitno izlistavanje potpuno kvalifikovanih imena – što znači, ono kojeidentifikuje ceo skup prostora imena u kojima je klasa sadržana – uvek bolje oddirektive using. Oni naglašavaju da potpuno kvalifikovano ime jasno identifi-kuje gde se klasa nalazi i veruju da je ovo korisna informacija (čak i ako je pono-vljena 14 puta unutar 20 susednih redova). Ne delim njihovo mišljenje (i stvarnone volim toliko kucanje). U mom tekstu – i ovo je jedan od razloga zašto mi,autori, pišemo knjige – potpuno kvalifikovano ime klase se nikad ne koristi1,osim da se razreši dvosmislena upotreba imena tipa (pročitajte odeljak 1.2 zailustraciju situacija u kojima je ovo neophodno).

Ranije sam napisao da klase najčešće dolaze od drugih programera ili iz biblio-teka koje obezbeđuje razvojni sistem. Odakle još dolaze? Iz samog C# jezika. C#unapred definiše nekoliko najčešće korišćenih tipova podataka, kao što su celibrojevi, jednostruko i dvostruko precizni tipovi sa pokretnim zarezom, i stringo-vi. Svaki tip ima dodeljeni specifikator tipa koji identifikuje tip u C#-u: intpredstavlja primitivni tip celog broja, float, primitivni tip sa jednostrukompreciznošću; double tip sa dvostrukom preciznošću; i string, tip niza znako-va. ( Obratite pažnju na tabele 1.2 i 1.3 u odeljku 1.18.2 za listu unapred defini-sanih numeričkih tipova.)

Na primer, alternativna implementacija našeg jednostavnog programa definišeobjekat string i inicijalizuje ga string literalom "Hello, World!".

public static void Main() {string greeting = "Hello, World!";Console.WriteLine( greeting );

}

1. Čarobnjaci Visual Studia, kao što su Windows Forms i Web Forms, generišu potpuno kvalifiko-vana imena. Međutim, zato što su imena mašinski generisana, ne kvalifikuju se kao primeri za bro-janje.

Page 20: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

6 C# Izvornik

string je ključna reč jezika C# – a to je reč rezervisana za jezik C# i uvedena saspecijalnim značenjem. public, static i void su takođe ključne reči jezika.greeting se posmatra kao identifikator. On obezbeđuje ime za objekat tipastring. Identifikatori u jeziku C# moraju počinjati ili znakom podvlačenja (_)ili abecednim karakterom. Imena su osetljiva na razliku u velikim i malim slovi-ma, tako da greeting, Greeting i Greeting1 predstavljaju posebne identi-fikatore.

Zajednička tačka rasprave među programerskim centrima je da li složena imenatreba da budu razdvojena znakom podvlačenja, kao na primer xml_text_rea-der, ili kapitalizacijom prvog slova svake unutrašnje reči, kao na primerxmlTextReader. Po konvenciji, identifikatori koji predstavljaju imena klasauglavnom počinju velikim slovom, kao XmlTextReader.

Unutar jedinice programske vidljivosti, koja se još naziva prostor deklaracija ili op-

seg, identifikatori moraju biti jedinstveni. U lokalnom opsegu – a to je, u telu funk-cije, kao u našoj definiciji funkcije Main() – ovo nije problem zato štogeneralno kontrolišemo celu definiciju bilo kog objekta u funkciji. Kako se pod-ručje opsega širi – odnosno, kako se povećava broj uključenih programera i or-ganizacija – problem jedinstvenih identifikatora postaje sve teži. Ovo je mestogde prostori imena stupaju na scenu.

1.2 Prostori imenaProstori imena su mehanizam za kontrolisanje vidljivosti imena unutar progra-ma. Oni su namenjeni da olakšaju kombinovanje programskih komponenti izrazličitih izvora tako što minimizuju konflikte između imena identifikatora.Pre nego što saznamo više o mehanizmu prostora imena, uverimo se da razume-mo problem radi čijeg rešenja su uvedeni prostori imena.

Imena koja nisu smeštena u prostor imena se automatski stavljaju u jedan nei-menovani globalni prostor deklaracija. Ova imena su vidljiva u programu bezobzira da li se javljaju u istoj ili odvojenoj programskoj datoteci. Da bi se pro-gram izgradio, svako ime u globalnom prostoru deklaracija mora biti jedinstve-no. Globalna imena otežavaju uključivanje nezavisnih komponenti u programe.

Na primer, zamislite da razvijate dvodimenziionalnu (2D) grafičku komponen-tu i da nazovete jednu od globalnih klasa imenom Point. Koristite komponen-

Page 21: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

Zdravo C# 7

tu i sve radi odlično. O tome kažete nekom od prijatelja i oni naravno želetakođe da je koriste.

U međuvremenu, ja sam razvio trodimenzionalnu grafičku komponentu i jednuod globalnih klasa nazvao imenom Point. Koristim komponentu i takođe sveradi odlično. Pokažem je nekolicini mojih prijatelja. Komponenta im se sviđa ioni žele takođe da je koriste. Za sada su svi srećni bar oko projekata koje kodira-mo.

Sada zamislite da imamo zajedničkog prijatelja. Ona implementira 2D/3D igrui želi da upotrebi naše dve komponente, obe visoko cenjene. Nažalost, kadauključi obe komponente u aplikaciju, dve nezavisne upotrebe identifikatoraPoint rezultiraju greškom za vreme kompajliranja. Njena igra ne uspeva da seizgradi. Pošto ona nema nijednu komponentu, ne postoji jednostavna ispravkada bi dve komponente radile zajedno.

Prostori imena obezbeđuju opšte rešenje za problem sukoba globalnih imena.Prostor imena daje ime unutar kojeg su klase i drugi tipovi enkapsulirani2. Toznači da imena koja se nalaze u prostoru imena nisu vidljiva u opštem progra-mu. Kaže se da prostor imena predstavlja nezavisan prostor deklaracije ili opseg.

Pomozimo našem zajedničkom prijatelju obezbeđivanjem odvojenih prostoraimena za dve instance klase Point:

namespace DisneyAnimation_2DGraphics{

public class Point(...)

//...}

namespace DreamWorksAnimation_3DGraphics{

public class Point(...)

//...}

2. Samo se prostori imena i tipovi mogu deklarisati u opštem prostoru imena. Funkcija se možedeklarisati samo kao članica klase. Objekat koji predstavlja podatak može biti ili član klase ili lokal-ni objekat u funkciji kao što je naša deklaracija greeting.

Page 22: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

8 C# Izvornik

Ključna reč namespace predstavlja definiciju prostora imena. Ono što sledi izaove ključne reči je ime koje jedinstveno identifikuje prostor imena. (Ako više pu-te upotrebimo ime postojećeg prostora imena, kompajler će pretpostaviti daželimo da dodamo još jednu deklaraciju u postojeći prostor imena. Činjenica dadve upotrebe imena prostora imena ne dovode do kolizije nam omogućava dadeklaraciju prostora imena proširimo kroz datoteke.)

Sadržaj svakog prostora imena je smešten unutar vitičastih zagrada. Naše dve kla-se Point nisu više vidljive opštem programu; svaka je ugnežđena u odgovarajućiprostor imena. Kažemo da je svaka član svog odgovarajućeg prostora imena.

Direktiva using je u ovom slučaju više nego rešenje. Ako naš prijatelj u progra-mu otvori oba prostora imena –

using DisneyAnimation_2DGraphics;using DreamWorksAnimation_3DGraphics;

nekvalifikovana upotreba identifikatora Point će još uvek rezultirati greškomza vreme kompajliranja. Da bismo nedvosmisleno referencirali ovu ili onu klasuPoint, moramo upotrebiti potpuno kvalifikovano ime – na primer,

DreamWorksAnimation_3DGraphics.Point origin;

Ako ovo čitamo sdesna nalevo, tu je deklarisano da origin bude instanca klasePoint definisane u prostoru imena DreamWorksAnimation_3DGraphics.

Dvoznačnošću unutar i između prostora imena rukuje se različito u zavisnostiod primećene količine kontrola među kojima postoji sukob imena. U najjedno-stavnijem slučaju, dve upotrebe istog imena se pojavljuju u jednom prostorudeklaracije i kada je druga upotreba imena primećena odmah, rezultirajugreškom za vreme kompajliranja. Pretpostavka je da programer kome se ovo de-silo ima mogućnost da izmeni ili dodeli novo ime identifikatoru u radnom pro-storu deklaracije gde se sukob imena pojavio.

Manje je jasno šta bi trebalo da se desi ako se sukob pojavi između prostora ime-na. U jednom slučaju, otvaramo dva nezavisna prostora imena od kojih svaki sa-drži upotrebu istog imena, kao dve instance klase Point. Ako smo napravilieksplicitnu upotrebu više puta definisanih identifikatora Point, generiše segreška; kompajler ne pokušava da prioritet da jednoj upotrebi u odnosu na dru-gu ili da na neki drugi način reši dvoznačnu referencu. Jedno rešenje, kao što

Page 23: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

Zdravo C# 9

smo malopre videli, jeste da kvalifikujemo pristup svakog identifikatora. Alter-nativno, možemo definisati pseudonim za jednu ili sve više puta definisane in-stance. Ovo možemo uraditi sa varijantom direktive using koja sledi:

namespace GameApp{

// definiše dve instance tipa Pointusing DisneyAnimation_2DGraphics;using DreamWorksAnimation_3DGraphics;

// OK: Naprave se jedinstveni identifikatori// za svaku instancuusing Point2D = DisneyAnimation_2DGraphics.Point;using Point3D = DreamWorksAnimation_3DGraphics.Point;

class myClass{Point2D thisPoint;Point3D thatPoint;}

}

Pseudonim je ispravan samo u trenutnom prostoru deklaracije. To znači da onne uvodi dodatno stalno ime tipa povezano sa klasom. Ako pokušamo da ga ko-ristimo među prostorima imena, kao u ovom slučaju:

namespace GameEngine{

class App {// greška: nije prepoznatoprivate GameApp.Point2D origin; }

}

kompajler neće ništa uraditi i generisaće sledeću poruku:

The type or namespace name ‘Point2D’ does not exist in theclass or namespace ‘GameApp’

(Tip ili prostori imena sa imenom ‘Point2D’ ne postoje u klasi ili prostoru imena‘GameApp’)

Kada koristimo prostor imena, uglavnom ne znamo koliko je u njemu definisa-no imena. Bilo bi vrlo neprijatno ako bismo, svaki put kada dodamo novi pro-

Page 24: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

10 C# Izvornik

stor imena, morali zadržavati dah dok ponovo kompajliramo kako bismovideli da li će doći do greške. Zbog toga nam jezik minimizuje smetnje koje pro-gramu može naneti otvaranje prostora imena.

Ako su dve ili više instanci identifikatora, kao što su naše dve klase Point, vi-dljivi u radnom prostoru deklaracije preko višestrukih direktiva using, greškaće se pojaviti samo pri nekvalifikovanoj upotrebi identifikatora. Ako ne pristu-pimo identifikatoru, još uvek može da nastane dvoznačnost, a neće se pojavitini greška ni upozorenje.

Ako identifikator, vidljiv preko direktive using, duplicira identifikator koji smomi definisali, naš identifikator ima prednost. Nekvalifikovana upotreba identifi-katora se uvek razrešava na instancu koju smo mi definisali. Efekat koji dobijamoje da naša instanca sakriva vidljivost identifikatora u prostoru imena. Program na-stavlja da radi isto tako kao što je radio pre upotrebe dodatnog prostora imena.

Kakve vrste imena treba davati prostorima imena? Opšta imena, kao što suDrawing, Data, Math i slično, teško da će biti jedinstvena. Preporučuje se do-davanje prefiksa koji identifikuje organizaciju ili projektnu grupu.

Prostori imena su neophodni elementi komponentnog razvoja. Kao što smo vi-deli, oni omogućavaju ponovnu upotrebu našeg softvera u programskimokruženjima. Ipak, za manje ambiciozne programe, kao što je Hello programsa početka ovog poglavlja, korišćenje prostora imena je nije potrebno.

1.3 Alternativni oblici funkcije Main()U preostalom delu ovog poglavlja, dok budemo implementirali mali programWordCount, razmotrićemo unapred definisane elemente jezika C#. WordCo-unt otvara korisnički definisanu tekstualnu datoteku i izračunava broj pojavasvake reči u toj datoteci. Rezultati se sortiraju po rečničkom redosledu i upisujuse u izlaznu datoteku. Pored toga, program podržava dve opcije koje se moguproslediti iz komandne linije:

1. –t dovodi do toga da program uključi praćenje toka; podrazumeva se da jepraćenje toka isključeno.

2. –s dovodi do toga da program izračuna i obavesti ukupno vreme koje mu jebilo potrebno da pročita datoteku, obradi reči i upiše rezultat; podrazumevase da se o vremenima ne daju izveštaji.

Page 25: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

Zdravo C# 11

Naš prvi zadatak u funkciji Main() jeste da, ako ih ima, pristupimo parametri-ma prosleđenim u program iz komandne linije. To možemo uraditi tako što će-mo upotrebiti drugi oblik funkcije Main() koji definiše potpis funkcije sajednim parametrom:

class EntryPoint{ public static void Main( string [] args ) {}}

args je definisan kao niz stringova. Niz args se automatski popunjava bilo ko-jim argumentima koje korisnik prosledi iz komandne linije. Na primer, ako kori-snik pozove naš program na sledeći način:

WordCount -s mytext.txt

prvi element niza args sadržaće element –s, a drugi mytext.txt.

Takođe, bilo koji oblik funkcije Main() može eventualno vratiti vrednost tipaint:

public static int Main() {}public static int Main( string [] args ) {}

Vraćena vrednost se posmatra kao izlazni status programa. Po dogovoru, vraće-na vrednost 0 znači da se program izvršio uspešno. Vrednosti različite od nuleoznačavaju neki oblik greške u programu. Paradoksalno, povratni tip void in-terno rezultira kao povratni status 0; to znači da izvršno okruženje programuvek posmatra kao uspešno izvršen. U sledećem odeljku saznaćemo kakomožemo upotrebiti drugi oblik funkcije Main().

1.4 Pravljenje iskazaPrva stvar koju treba uraditi jeste da odredimo da li je korisnik prosledio nekeargumente. Ovo možemo uraditi pitajući niz args koliko elemenata sadrži3.Odlučio sam da se naš program isključi ako korisnik ne obezbedi potrebne argu-mente iz komandne linije. (Kao vežbanje, možda želite da program implementi-rate tako da korisniku omogući interaktivni unos željenih opcija. Na ovaj načinprogram je, naravno, druželjubiviji.)

3. U jeziku C# ne možemo napisati if(!arts.Length) kako bismo proverili da li je niz prazan,jer se 0 ne interpretira sa značenjem netačno.

Page 26: Izvornik - CETcet.rs/wp-content/uploads/2017/06/C_sharp_izvornik_pog01.pdf · raze, sokete i programiranje u nitima, hijerarhije klase WebRequest i WebRe- sponse , kratki uvod u ADO.NET

12 C# Izvornik

U mojoj implementaciji, ako je niz args prazan, program štampa objašnjenjepravog načina pozivanja programa WordCount, a onda izlazi pomoću naredbereturn. (Naredba return prouzrokuje da se funkcija, u kojoj se naredba re-turn pojavila, prekine – odnosno, da se vrati na mesto sa kojeg je pozvana.)

public static void Main( string [] args ){

if ( args.Length == 0 ) { display_usage(); return; }}

Length je svojstvo niza. U njemu se nalazi broj elemenata koji trenutno postojeu nizu. Provera dužine je smeštena unutar uslovne naredbe if jezika C#. Akoprovera dobije vrednost tačno, izvršava se iskaz koji odmah sledi iza provere;inače, on se ignoriše. Ako treba izvršiti više iskaza, kao u našem primeru, onimoraju biti ograničeni vitičastim zagradama (tekst unutar zagrada se nazivablok iskaza).

Uobičajena greška koju početnici prave je da zaborave blok iskaza kada žele daizvrše dva ili više iskaza4:

// ovo je neispravna upotreba naredbe ifif ( args.Length == 0 ) display_usage(); return;

Uvlačenje naredbe return prikazuje programerovu nameru. Ono ipak ne re-flektuje ponašanje programa. Bez bloka iskaza uslovno se izvršava samo funkci-ja; iskaz return se izvršava bez obzira da li je niz prazan ili ne.

Iskaz return takođe može da vrati vrednost. Ova vrednost postaje povratnavrednost funkcije – na primer

4. Svi ovi fragmenti koda se javljaju u funkciji Main(). Da bih sačuvao prostor, ne prikazujem za-tvarajući deo funkcije Main().