Uvod u C#Ovo je prva lekcija programiranja u jeziku C#. Prvi deo
vas uvodi u osnovna znanja koja su neophodna da bi ste se kasnije
lako snali. Ovde emo napraviti kratak pregled jezika C# i .NET
okruenja, opis ovih tehnologija, prednosti njihove upotrebe, kao i
meusobnu povezanost. Poeemo sa osnovnim pitanjima vezanim za .NET
okruenje. Ovo je nova tehnologija koja sadri nove koncepte, sa
kojima je isprva teko uhvatiti se u kotac, uglavnom zbog toga to
predstavlja potpuno nov nain rada u razvoju aplikacija. Kratak
pregled osnova od velike je vanosti za razumevanje programiranja u
jeziku C#. Nakon kratkog pregleda prei emo na prost opis samog
jezika C#, ukljuujui korene i slinost sa jezikom C++.
ta je .NET okruenje?.NET okruenje je nova i revolucionarna
platforma za razvoj aplikacija napravljena od strane Microsofta.
Primetiete da nismo rekli razvoj aplikacija u operativnom sistemu
Windows". lako prva verzija .NET okruenja radi na operativnom
sistemu Windows, budui planovi podrazumevaju i rad na drugim
sistemima, kao to su FreeBSD, Linux, Macintosh, pa ak i na ureajima
klase linog digitalnog asistenta (PDA). Jedan od kljunih razloga za
razvoj ove tehnologije je namera da ona postane sredstvo kojim se
vri integracija razliitih operativnih sistema. Pored toga, ova
definicija .NET okruenja ne ograniava mogunosti bilo kog tipa
aplikacije. Ogranienja zapravo ne postoje - .NET okruenje daje vam
mogunost izrade Windows aplikacija, Web aplikacija, Web servisa i
skoro svega ostalog to bi ste mogli zamisliti. .NET okruenje
dizajnirano je tako da se moe koristiti iz bilo kog jezika: C#,
C++, Visual Basic, JScript, pa ak i starije jezike kao to je COBOL.
Da bi sve to funkcionisalo, pojavile su se i posebne verzije ovih
jezika za .NET: Managed C++, Visual Basic .NET, JScript .NET, kao i
razni drugi. Ne samo da svi oni imaju pristup .NET okruenju, ve
mogu i meusobno komunicirati. Sasvim je mogue kod programiranja u
jeziku C# koristiti kod napisan u Visual Basic .NET-u, kao i
obrnuto. Sve ovo omoguuje dosad nezamisliv nivo viestruke namene,
to pored ostalog ini .NET okruenje toliko atraktivnim.
ta se nalazi unutar .NET okruenja?.NET okruenje se najveim delom
sastoji od ogromne biblioteke koda koju upotrebljavamo preko
klijentskih jezika (kao to je C#) koristei tehnike objektno
orijentisanog programiranja (OOP). Ova biblioteka podeljena je na
razliite module koje koristimo u zavisnosti od zadatka. Na primer,
jedan modul sadri delove potrebne za pravljenje Windows aplikacija,
drugi je vezan za mree, a neki za razvoj Weba. Neki moduli su
podeljeni u razliite podmodule, kao to su moduli za pravljenje Web
servisa unutar modula za razvoj Weba. Namera je da razliiti
operativni sistemi podravaju neke ili sve module zavisno od
njihovih karakteristika. Na primer PDA e imati podrku za sve
osnovne funkcionalnosti .NET modula, to se svakako ne odnosi i na
one namenske ili rede koriene. Jedan deo biblioteke .NET okruenja
definie samo osnovne tipove. Tip je u stvari nain na koji se
predstavlja podatak (kao to je recimo oznaena 32-bitna celobrojna
veliina), a definicijom fundamentalnih tipova podataka olakava se
interoperatibilnost izmedu jezika koji koriste .NET * okruenje. To
se naziva zajedniki sistem tipova (engl. Common Type System - CTS).
Okruenje osim biblioteke poseduje i .NET zajedniko izvrno jeziko
okruenje (engl. Common Language Runtime - CLR), koje je odgovorno
za izvravanje svih aplikacija razvijenih uz pomo :NET
biblioteke.
1
Kako napisati aplikaciju koristei .NET okruenje?Pisanje
aplikacija unutar .NET okruenja u stvari znai pisanje koda (koristi
se bilo koji jezik koji podrava ovo okruenje) uz pomo .-NET
biblioteke koda. U ovoj semestru koristiemo VS za razvoj, koji je
mono i integrisano razvojno okruenje koje podrava jezik C# .
Prednost ovog okruenja je lakoa kojom se mogunosti .NET-a mogu
integrisati u na kod. Kod koji emo pisati bie u potpunosti C#, ali
demo koristiti .NET okruenje, a takoe i dodatne alate VS-a kada
zatreba. Da bi se C# kod izvrio neophodno ga je prevesti u jezik
koji operativni sistem na kome je aplikacija razume, poznat kao
prirodni kod. Ovo prevoenje se jo naziva i kompajliranje koda,
funkcija koju obavlja kompajler. Unutar .NET okruenja ta operacija
ima dve faze.
MSIL i JITKada kompajliramo kod koristei biblioteku .NET
okruenja, ne pravimo odmah prirodni kod specifian za operativni
sistem. Umesto toga, kompajliramo u Microsoftov posredni jezik
(engl. Microsoft Intermediate Language - MSIL). Ovaj kod nije
odreen ni jednim operativnim sistemom i nije namenjen samo za jezik
C#. Ostali .NET jezici - na primer, Visual Basic .NET - takoe se
kompajliraju u njega u svojoj prvoj fazi. VS e izvesti ovaj korak
ukoliko ga koristimo pri razvoju C# aplikacija. Da bi se program
izvrio, oigledno je potrebno jo rada. Za taj posao zaduen je
kompajler u pravo vreme (engl. Just-In-Time - JIT), koji prevodi
MSIL u prirodni kod specificiran od strane operativnog sistema i
arhitekture same maine na kojoj se program izvodi. Tek tada
operativni sistem moe izvriti program. Pojam u pravo vreme" oznaava
da se MSIL kod kompajlira samo kada je to potrebno. U prolosti je
bilo neophodno kompajlirati kod u vise razliitih aplikacija zavisno
od samog operativnog sistema i arhitekture samog procesora. esto je
to bio oblik optimizacije (da2
bi se recimo kod naterao da radi bre na AMD setu ipova), ali s
vremena na vreme moglo je biti kritino (da aplikacije, na primer
rade i pod Win9x i pod WinNT/2000 okruenjima). Sve je to sada
nepotrebno, jer JIT kompajleri (kako im samo ime kae) koriste MSIL
kod, koji je nezavisan od maine, operativnog sistema ili procesora.
Postoji nekoliko JIT kompajlera - svaki za razliitu arhitektura, a
koristie se odgovarajui da bi se napravio traeni prirodni kod.
Lepota je u tome to je mnogo manje rada potrebno sa nae strane. U
stvari, moemo zaboraviti na detalje koji se odnose na sistemsku
zavisnost i koncentrisati se na mnogo zanimljiviju funkcionalnost
naeg koda.
SklopoviKada kompajliramo aplikaciju, MSIL kod se smeta u
posebne sklopove (engl. assembly). Takvi sklopovi sadre i izvrne
programske datoteke koje mogu biti startovane direktno iz Windowsa
bez potrebe za nekim drugim programima (takve datoteke imaju .exe
nastavak) i biblioteke koje koriste i druge aplikacije (koje imaju
. dll nastavak). Sklopovi pored MSIL sadre i takozvane meta
informacije (odnosno podatke o podacima sadranim u sklopu, nazvane
jo i metapodaci), kao i opcione resurse (dodatne podatke koje
koristi MSIL, kao to su zvukovi i slike). Metapodaci dozvoljavaju
sklopovima da budu potpuno samoopisujui. Ne trebaju nam nikakve
dodatne informacije da bi smo koristili sklopove. Podrazumeva se,
naravno da izbegnemo situacije kao to su nedostavljanje traenih
informacija sistemskom registru i si., to je inae esto bio problem
pri korienju drugih platformi. To u stvari znai da je distribucija
aplikacija esto jednostavna koliko i kopiranje podataka u
direktorijum na nekom udaljenom raunaru. Kako nam nisu potrebne
nikakve dodatne informacije o ciljnim sistemima, moemo odmah
pokrenuti izvrnu datoteku iz ovog direktorijuma i (pod uslovom da
je .NET CLR instaliran) poleemo. Naravno da neemo uvek eleti da
ukljuimo sve to je potrebno za izvrenje jedne aplikacije na jednom
mestu. Moda poelimo da napiemo kod koji e moi da koriste i druge
aplikacije. U tom sluaju korisno je takav vienamenski kod smestiti
na mesto koje mogu koristiti sve aplikacije U .NET okruenju to
mesto se naziva globalni ke sklopova (engl. Global Assembly Cache -
GAC). Smetanje koda u ovaj ke je jednostavno - samo postavimo
programski skup koji sadri ovaj kod u direktorijum koji sadri
ke.
Upravljivi kodUloga CLR-a se ne zaustavlja onog trenutka kada
smo kompajlirali kod u MSIL, niti kada JIT kompajler sve to prevede
u prirodni kod. Kod napisan u .NET okruenju je upravljiv tokom svog
izvrenja (ova faza se obino naziva izvrna). To znai da CLR vodi
rauna o naoj aplikaciji kroz upravljanje memorijom, obezbeivanje
sigurnosti, dozvoljava meujeziko otklanjanje greaka i tako dalje.
Suprotno ovome, aplikacije koje ne rade pod kontrolom CLR-a
nazivaju se neupravljive, odreeni jezici kao to je C++ mogu se
koristiti za pisanje takvih aplikacija ( na primer, da bi se
pristupilo funkcijama niskog stepena operativnog sistema). Sve u
svemu, u jeziku C# moemo napisati samo onaj kod koji radi pod
upravljivim okruenjem. Mi demo iskoristiti razne mogunosti
upravljivosti CLR-a i dozvoliti .NET-u da se sam pozabavi
interakcijom sa operativnim sistemom.
Sakupljanje otpadaJedna od najvanijih mogunosti upravljivog koda
jeste koncept sakupljanja otpada. Ovo je metod .NET-a koji se stara
o tome da memorija koju je aplikacija koristila tokom svog izvrenja
bude obavezno ispranjena kada aplikacija nije vise u upotrebi. Pre
pojave .NET-a to je najee bila briga samih programera, te je usled
nekoliko malih greaka memorija misteriozno gubila itave blokove jer
bila pogreno pozivana. To je najee bilo praeno usporavanjem vaeg
raunara i obaveznim padom sistema. Sakupljanje otpada se odvija
tako to uestalo ispituje memoriju vaeg raunara i odbacuje sve to
vam nije vise potrebno. Ono nema neki vremenski okvir izvravanja,
moe se dogoditi hiljadu puta u sekundi, jednom u nekoliko sekundi,
ili kad god, ali moete biti sigurni da e se dogoditi. Kako je
sakupljanje otpada nepredvidivo, morate ga imati na umu dok radite
aplikacije. Kod koji za svoje izvrenje zahteva puno memorije morao
bi iza sebe da poisti pre nego to dopusti sakupljanju otpada da to
uradi za njega, ali to nije tako teko kako zvui.
3
Uklapanje u celinuPre nego to nastavimo, sumirajmo sve korake
koji su nam potrebni da bi smo napravili .NET aplikaciju. 1. Kod za
aplikaciju pie se korienjem .NET kompatibilnog jezika kao to je
C#:
2. Ovaj kod se kompajlira u MSIL, koji je smeten u sklop:
3. Kod koji se izvrava (bez obzira da li je sam po sebi izvrni
ili ga koristi neki drugi kod) mora se prethodno kompajlirati kroz
JIT kompajler u prirodni kod:
4. Prirodni kod se izvrava u kontekstu upravljanog CLR, zajedno
sa bilo kojom drugom aplikacijom ili procesom:
4
PovezivanjePostoji jedan dodatak gore pomenutom procesu. C# kod
koji se kompajlira u MSIL u koraku 2 ne mora da bude smeten u jednu
datoteku. Mogue je podeliti kod aplikacije u razliite datoteke koji
e se tokom kompajliranja objediniti u sklop. Ovaj proces je poznat
i kao povezivanje i veoma je koristan. Ta podela se vri jer je
mnogo lake raditi sa vise manjih datoteka nego sa jednom ogromnom.
Moete izdeliti kod na logike celine i smestiti ih u nezavisne
datoteke na kojima se moe nezavisno raditi i praktino zaboraviti na
njih kada zavrite. Ovo nam olakava pronalaenje odreenih delova koda
kada nam zatrebaju. Takoe omoguuje programerskim timovima da podele
teret na manje delove kojima je lake rukovati, kao i to da ukoliko
doe do provere nekog od tih delova ne postoji rizik da se ugroze
celina programa ili njegovi delovi na kojima se radi. Takoe celo
MSJIT kompajliranje moe se predstaviti i u celini to vam moe pomoi
da sagledate na drugi nain:
ta je C# ?Kako je gore pomenuto, C# je jedan od jezika koji slui
za izradu aplikacija koje mogu raditi pod .NET CLR-om. On
predstavlja evoluciju jezika C i C++ koju je kreirao Microsoft da
bi se radilo sa .NET okruenjem. U njegovom razvoju koriene su mnoge
prednosti drugih jezika, naravno uz otklanjanje njihovih mana.
Razvoj aplikacija u jeziku C# je jednostavniji nego u C++, jer je
sintaksa prostija. Pa ipak, C# je moan jezik i postoji veoma mali
broj stvari koje bi smo uradili u C++ jeziku pre nego u C#-u.
Paralelne mogunosti jezika C# onima naprednijim u C++-U, kao to je
direktno pristupanje i manipulisanje sistemskom memorijom, moe biti
izvedeno jedino kroz kod koji je obeleen kao nesiguran. Ove
napredne tehnike programiranja su potencijalna opasnost (odakle im
i ime) zato to je mogue pristupiti memorijskim blokovima koji su
kritini za sistem, a sve to potencijalno vodi ka katastrofi. Iz
ovog razloga, kao i drugih, ova tema nije obraena ovim
predavanjima. S vremena na vreme kod u jeziku C# je malo
razumljiviji od C++ koda. Jer je C# jezik sigurniji po pitanju
dodele tipa promenljivim (za razliku od C++-a). To znai da ukoliko
nekoj
5
promenljivoj ili nekom podatku dodelimo odreeni tip, on ne moe
biti zamenjen nekim drugim nevezanim tipom. Postoje stroga pravila
kojih se moramo pridravati prilikom konverzija tipova, to u sutini
znai da emo esto morati da napiemo vise koda u jeziku C# nego u
C++-U da bismo izvrili iste zadatke. Ali iz toga moemo izvui i neku
korist. Kod je robusniji i jednostavnije je otkloniti greke,
odnosno .NET u svakom trenutku moe odrediti kojem tipu pripada
traeni podatak. Usled toga jezik C# nam ne omoguuje naredbe kao to
su Uzmi deo memorije poevi od 4. bajta unutar podatka i duine 10
bajta i interpretiraj ga kao X", to ne mora da bude uvek loe. C# je
samo jedan od jezika koji omoguuju rad sa .NET razvojnim okruenjem,
ali moda je i najbolji. Njegova prednost je u tome to je jedini
napravljen od poetka ba za .NET okruenje, pa samim rim moe biti i
vodei jezik korien za verzije .NET-a namenjene dragim operativnim
sistemima. VB.NET je, recimo, napravljen tako da bude to sliniji
svojim prethodnicima i stoga ne moe da iskoristi .NET biblioteku
koda u potpunosti. Suprotno njemu, jezik C# je napravljen tako da
moe iskoristiti svaki deo biblioteke koda .NET okruenja koju ova
moe da ponudi.
Kakve aplikacije moemo pisati u C#-u?Kako je gore navedeno,
jezik C# nema ogranienja u pogledu toga kakve sve aplikacije moemo
napraviti. C# koristi okruenje i samim tim nema ogranienja u vezi
sa moguim aplikacijama. Pa ipak, pogledajmo koji su tipovi najee
pravljenih aplikacija: Windows aplikacije - To su recimo,
aplikacije tipa Microsoft Office koje imaju izgled Windowsa i
odlino se slau sa njim. Ovo je uproeno korienjem modula Windows
formulara unutar .NET okruenja, koji u stvari ini biblioteka
kontrola (kao to su dugmad, palete alatki, meniji i tako dalje)
koje nam koriste pri izradi Windows korisnikog interfejsa (UI). Web
aplikacije - Web strane koje moemo videti kroz bilo koji ita. .NET
okruenje prua veoma moan sistem generisanja Web sadraja i to
dinamiki, dozvoljavajui personalizaciju, sigurnost i jo mnogo toga.
Ovaj sistem se naziva Active Server Pages .NET (ASP.NET), a jezik
C# moemo koristiti za izradu ASP.NET aplikacija uz pomo Web
formulara. Web servisi - Predstavljaju nov i uzbudljiv nain izrade
raznovrsnih distribuiranih aplikacija. Koristei Web servise preko
Interneta moemo razmenjivati bilo koju vrstu podataka, koristei
prostu sintaksu, ne vodei rauna o tome u kom jeziku je napisana
aplikacija niti na kom sistemu je postavljena. Bilo kom od ovih
tipova moe zatrebati pristup bazama podataka, to se postie
korienjem Active Data Objects .NET (ADO.NET) odeljka .NET okruenja.
Mnogi od ovih resursa mogu biti iskorieni, kao to su alati za
izradu komponenata na mrei, iscrtavanje, izvoenje komplikovanih
matematikih zadataka i tako dalje.
6
Visual Studio.NETU ovom predavanju za programiranje u jeziku C#
koristimo Visual Studio .NET (VS), poev od aplikacija koje se
pokreu iz komandne linije, pa sve do kompleksnih tipova projekata.
VS nije neophodan za razvoj C# aplikacija, ali nam znatno olakava
stvari. Moemo (ako to poelimo) napisati na kod u najobinijem
programu za ureivanje teksta, kao to je Notepad, i kompajlirati kod
u sklopove koristei kompajler iz komandne linije koji je u sastavu
.NET okruenja. Meutim, zato bismo to radili, kada moemo iskoristiti
snagu VS-a da nam pomogne? Sledi kratka lista razloga zbog kojih je
VS pravi izbor za razvoj u .NET okruenju: VS automatizuje korake
neophodne pri kompajliranju prirodnog koda, ali u isto vreme
dozvoljava i kompletnu kontrolu nad opcijama ukoliko elimo da ih
promenimo. VS program za ureivanje teksta je povezan sa jezicima
koje podrava VS (ukljuujui jezik C#) i to tako da omoguuje pametnu
detekciju greaka i sugerie odgovarajui kod na pravom mestu dok ga
unosimo. VS sadri i dizajnerske alate za aplikacije koje ukljuuju
Windows formulare kao i Web formulare, koji vam omoguuju
jednostavna tehnika povlaenja i putanja (engl. drag-and-drop)
dizajn elemenata korisnikog interfejsa. Mnogi tipovi projekata koji
su mogui u jeziku C# mogu se napraviti sa, 'optenamenskim' kodom
koji se ve nalazi na pravom mestu. Umesto da poinjemo od nule, esto
emo nai razliite datoteke koje sadre kod koji je za nas zapoet,
smanjujui nam vreme provedeno u spremanju projekta. VS sadri
nekoliko arobnjaka koji vam automatizuju zadatke opte namene i koji
mogu dodati odgovarajui kod postojeim datotekama, a da mi o tome ne
vodimo brigu (ili u nekim sluajevima ak i da ne pamtimo tanu
sintaksu). VS sadri mone alatke za prikazivanje i navigaciju
elemenata naeg projekta, bez obzira da li se radi o prirodnom kodu
jezika C# ili nekoj slici, ili moda zvunoj datoteci. Pored toga to
olakava pisanje aplikacija, VS omoguuje i jednostavniju
distribuciju i prilagoavanje projekata klijentima, kako bi ih oni
lake koristili ili instalirali. VS omoguuje i napredne tehnike
otklanjanja greaka pri razvoju projekata, i to tako da moemo u isto
vreme ui u kod jedne instrukcije dok pazimo u kakvom je stanju
aplikacija. Ima jo mnogo toga, ali nadam se da ste shvatili o emu
se radi!
Reenja u VS-uKada koristimo VS za razvoj aplikacija, to radimo
kreiranjem reenja. Reenje, po VS terminologiji, predstavlja neto
vise od aplikacije. Reenja sadre projekte, koji mogu biti zasnovani
na Windows formularima, Web formularima i tako dalje. Reenja mogu
sadrati i vise projekata, tako da moemo grupisati srodan kod na
jedno mesto, iako e se oni kompajlirati u razliite sklopove na
razliitim mestima na disku. Ovo moe biti od velike koristi, kada se
radi na deljenom kodu (koji moe biti smeten u globalni ke sklopova)
u isto vreme dok aplikacije koriste taj kod. Otklanjanje greaka u
kodu je mnogo lake ako se koristi jedinstveno razvojno okruenje,
jer moemo pratiti instrukcije u viestrukim modulima koda.
7
SaetakU ovom predavanju upoznali smo se sa osnovnim pojmovima
.NET razvojnog okruenja i sa mogunostima pravljenja monih i
raznovrsnih aplikacija. Saznali smo ta je neophodno da bi se kod
napisan, recimo, u jeziku C# pretvorio u funkcionalnu aplikaciju, i
koje su prednosti upravljanog koda koji radi pod optim izvrnim
jezikom .NET-a (Common Language Runtime). Videli smo ta je u stvari
jezik C#, kako je povezan sa .NET okruenjem i upoznali se sa alatom
koji emo koristiti za programiranje u C# - Visual Studio .NET-u. U
sledeem predavanju nauiemo kako se C# kod pie pomou VS-a, pa emo
samim tim moi da se skoncentriemo na jezik C# sam po sebi, umesto
da brinemo o tome kako VS radi.
8
Pisanje programa u jeziku C#Nakon to smo se upoznali sa tim ta
je u stvari jezik C# i kako se uklapa u .NET okruenje, doao je
trenutak da zaponemo sa pisanjem koda. U tom poslu koristiemo
Visual Studio .NET (VS), pa treba da nauimo osnovne stvari o torn
razvojnom okruenju. VS je ogroman i komplikovan proizvod, tako da u
prvo vreme korisniku moe delovati zastraujue, ali uz njegovu pomo
pravljenje jednostavnih aplikacija moe biti iznenaujue prosto. im
ponemo sa korienjem VS-a uvideete da nije potrebno mnogo znati o
njemu da bismo se poigrali sa C# kodom. Kasnije emo videti neke
mnogo komplikovanije operacije koje je mogue izvesti u VS-u, ali za
sada su dovoljna osnovna znanja. Poto zavirimo u VS, sastaviemo dve
proste aplikacije. Za sada se neemo mnogo optereivati kodom, samo
emo se upoznati sa tim koje su procedure potrebne da bi se
aplikacija napravila i da bi funkcionisala kako treba, mada e sve
to uskoro postati sporedno. Prva aplikacija koju emo napraviti bie
jednostavna konzolna aplikacija. Konzolne aplikacije ne koriste
grafiko okruenje Windowsa, tako da ne moramo da brinemo o
dugmadima, menijima, interakciji sa pokazivaem mia i tako dalje.
Umesto toga, pokrenuemo aplikaciju iz komandne linije i
komunicirati sa njom na mnogo prostiji nain. Druga aplikacija e
biti bazirana na Windows formularima. Njen izgled, kao i rad sa
njom, bie vrlo prepoznatljiv onima koji su koristili Windows i
njeno kreiranje ne zahteva nita vise rada nego prethodna. Ipak,
sintaksa njenog koda je mnogo komplikovanija, mada esto neemo
morati da vodimo rauna o detaljima. Dodatna fleksibilnost Windows
aplikacija nije neophodna da bi se nauio C# jezik, dok
jednostavnost konzolnih aplikacija omoguuje da se skoncentriemo na
uenje sintakse, a da za to vreme ne brinemo o tome kako aplikacija
izgleda niti kakav je oseaj raditi sa njom.
Razvojno okruenje Visual Studio .NETKada prvi put uitate VS,
odmah se pojavi nekoliko prozora, od kojih je veina prazna, zajedno
sa nizom elemenata menija i ikona sa paletama alatki. Ukoliko prvi
put pokreete VS bie vam predstavljena lista sa vrednostima
namenjena za korisnike sa iskustvom u radu na prethodnim izdanjima
ovog razvojnog okruenja. Automatski odabrani element! su sasvim u
redu, za sada ih prihvatite jer tu nema niega to se kasnije ne moe
promeniti. Izgled VS okruenja je u potpunosti prilagodljiv, ali su
nam sasvim dovoljne ve postavljene vrednosti. One su sreene na
sledei nain:
1
Glavni prozor, koji prikazuje uvodnu poetnu stranu" kada se VS
pokrene, jeste onaj u kome se prikazuje ceo na kod. Ovaj prozor je
podeljen na kartice tako da moemo lako skakati sa jedne na drugu
datoteku tako to emo pritisnuti miem njihovo ime. Ovaj prozor ima i
druge funkcije: moe prikazati grafiki korisniki interfejs koji
dizajniramo za na projekat, iste tekstualne datoteke, HTML, kao i
razliite alate ugraene u VS. Opisaemo svaki, kako na njega naiemo
tokom rada. Iznad glavnog prozora nalaze se palete sa alatkama, kao
i VS meni. Ovde moete nai nekoliko razliitih paleta sa alatkama
rangiranih po funkcionalnosti - od alatki za snimanje i uitavanje
datoteka, preko izgradnje i pokretanja projekta, do kontrola za
otklanjanje greaka. O svima njima emo priati kada nam budu
zatrebali. Slede kratki opisi glavnih karakteristika VS-a, koje ete
najee koristiti:Server Explorer i Toolbox paleta sa alatkama
izbacuju sopstvene menije kada se preko njih prede miem, i otvaraju
nam nove dodatne mogunosti, kao to su pristup i podeavanje
karakteristika i servisa samog servera, i pristup korisnikom
interfejsu za izradu elemenata Windows aplikacija. Solution
Explorer prozor prikazuje informacije o trenutno uitanim reenjima.
Reenje je po terminologiji VS-a jedan ili vise projekata zajedno sa
njihovom konfiguracijom. Ovde moemo videti razliiti pogled na
projekte unutar reenja, kao to su datoteke iz kojih se sastoje i
njihov sadraj. Properties prozor omoguuje detaljniji pogled na
sadrinu projekta i dozvoljava nam da izvedemo dodatno
konfigurisanje pojedinih elemenata. Na primer, taj prozor moemo
koristiti da promenimo izgled dugmeta unutar Windows formulara.
Task List and Output prozor prikazuje informacije prilikom
kompajliranja projekta zajedno sa zadacima koji treba da se izvre
(slino listi zadataka u Microsoft Outlooku). Ovi zadaci se mogu
uneti runo, a mogu biti i automatski generisani od VS-a.
2
Ponimo sa pravljenjem prvog primera naeg projekta, koji e u sebe
ukljuiti mnogo VS elemenata koje smo gore naveli.
Konzolna aplikacijaU ovom predavanju koristiti napravimo jednu
jednostavnu. emo konzolne aplikacije, posebno na poetku, stoga
Veba br. 1.Napravite novi projekat konzolne aplikacije birajui
File | New | Project... iz menija:
Izaberite Visual C# Projects direktorijum unutar prozora Project
Types:, i tip projekta Console Application u okviru prozora
Templates: (za ovo ete morati malo da pomerite prozor na dole). U
okviru za tekst Location: promenite putanju u
C:\Temp\SoftIng\LecturesCode\Vezba1 (ovaj e direktorijum biti
automatski napravljen ukoliko ve ne postoji), i ostavite
podrazumevani tekst u okviru za tekst Name: Pozdrav Svete.
3
Pritisnite miem na dugme OK. Kada se projekat inicijalizuje
dodajte sledee redove u datoteku koja se bude pojavila u glavnom
prozora:
Izaberite Debug | Start Without Debbuging iz menija. Posle
nekoliko trenutaka trebalo bi da vidite sledee:
Pritisnite bilo koji taster da izaete iz aplikacije. Takoe samu
konzolnu aplikaciju moemo pokrenuti i na drugi nain: Odaberite
Start | Programs | Microsoft Visual Studio .NET 2003 | Visual
Studio .NET Tools | Visual Studio .NET Command Prompt. Pojavie se
komandni prozor i bie definisane sve promenljive okruenja potrebne
prevodiocima i alatkama Visual Studija. Ako se pokrene obino
komandno okruenje, bez zadavanja tih promenljivih, .NET alatke nee
raditi.
4
Posle otvaranja komandnog prozora .NET-a uite u folder u kome
ste sauvali ovu konzolnu aplikaciju. Unesite u komandnom prozoru
sledeu komandu, koja prevodi kod konzolne aplikacije: csc Class.cs
Naravno programiranje pod celim Visual Studio .NET je tkz. Case
Sensity, osetljiv velika i mala slova. Tako da morate da obratite
panju pri kucanju koda. Ovde to nije sluaj, ali nije naodmet da se
navikavate na velika i mala slova. Prvo ete dobiti obavetenje o
verziji prevodioca i izvrnog okruenja, a zatim i o autorskim
pravima. Pokrenute program i biete pozdravljeni na sledei nain:
C:\> Class1 Pozdrav svete na jeziku C# ! C:\> Funkcija
Console.WriteLine() dodaje tekstu indikator novog reda (engl.
Newline character). U windowsu je to kombinacija znaka za poetak
reda i znaka za prelazak u novi red. Da biste u nekoliko iskaza
pisali u istom redu, koristite funkciju Write(). Ona zahteva da
sami dodate indikator novog reda. Sada u prethodnom programu
zamenite iskaz WriteLine() sledeim iskazima: Cons ol e. Writ e ("
Zdr av o sv e t e " ) ; Console.Write ( " n a jeziku C # ! \ r \ n
" ) ; Obrnuta kosa crta (\) ispred znaka je signal prevodiocu da je
u pitanju izlazna sekvenca (engl. escape sequence). Iz sledee
tabele vidi se da C# koristi iste izlazne znake kao i C++. Ako iza
obrnute kose crte stavite neki dragi znak, dobiete od prevodioca
poruku da nije prepoznao izlazni znak. Izlazna sekvenca \a \b V \n
V \t \v \" \\ ZnaenjeZvono. Zvunik proizvodi kratak signal.
Brisanje ulevo (engl. backspace). Pomera za jedno mesto ulevo. Kraj
strane. Pomera na poetak sledee strane prilikom tampanja. Na ekranu
daje kontrolni znak. Novi red. Pomera u sledei red. Na ekranu se
kursor pomera na poetak sledeeg reda. Znak za povratak na poetak
reda. Pomera na poetak tekueg reda. Tekst koji se ispisuje na
ekranu posle ovog znaka, pojavljivae se preko tekueg sadraja reda.
Horizontalan tabulator. Daje znak tabulatora. Vertikalan tabulator.
Pomera kursor nadole za zadati broj redova. Na ekranu daje
kontrolni znak. Navodnici. Bez obrnute kose crte se koristi kao
graninik za znakovne nizove. U kombinaciji sa obrnutom kosom crtom,
prevodilac ga tumai kao obian znak. Dvostruka obrnuta kosa crta.
Ispisuje obrnutu kosu crtu.
5
6
Kako to radiZa sada neemo ispitivati kod koji smo koristili u
ovom projektu; vise demo brinuti o tome kako koristiti VS da bi se
kod osposobio za izvravanje. Kao to ste videli, VS radi gomilu
stvari za nas, to ini jednostavnim proces kompajliranja i izvrenja
koda. Postoji vise naina za izvoenje ak i ovako jednostavnih
koraka. Na primer, pravljenje novog projekta moe se izvesti preko
stavke menija File| New | Project... kao to smo i radili, ili
pritiskanjem kombinacije tastera Ctrl+Shift+N, ili pritiskom miem
na odgovarajuu ikonu u paleti sa alatkama. Slino tome va kod moe
biti kompajliran i izvren na vise naina. Za metod koji smo
koristili izborom stavke menija Debug | Start Without Debbuging,
imamo takoe preicu (Ctrl+F5), a isto tako i ikonu u paleti sa
alatkama. Kod moemo pokrenuti korienjem stavke menija Debug | Start
(takoe pritiskajui F5 ili odabirajui odgovarajuu ikonu; ili moemo
kompajlirati kod bez njegovog pokretanja (sa ukljuenom ili
iskljuenom proverom greaka) koristei Build | Build, Ctrl+Shift+B,
ili odabirajui drugu ikonu. Kada je kod kompajliran moemo ga
pokrenuti startovanjem dobijene .exe datoteke iz Windows Explorera,
ili iz komandne linije. Da bismo to izveli, moramo otvoriti
komandnu liniju, prei u direktorijum
C:\Temp\SoftIng\LecturesCode\Vezba1\bin\Debug\, uneti Pozdrav Svete
i pritisnuti taster Enter. U narednim primerima samo emo rei:
Napravite novi konzolni projekat", ili: Pokrenite program", a vi
izaberite nain koji vam odgovara da biste to uradili. Ukoliko ne
bude drugaije naglaeno, kod treba pokretati sa ukljuenim
otklanjanjem greaka. Treba naglasiti da se poruka Press any key to
continue koju ste videli u okviru konzolnog programa, pojavljuje
samo ukoliko nije ukljueno ispravljanje greaka. Ako pokrenemo
projekat u modu za otklanjanje greaka prozor konzolnog programa e
nestati. U principu to je dobro, ali ne i za prethodni primer.
Ukoliko bismo tako uradili, ne bismo videli rezultate naeg rada.
Sada smo napravili projekat preko koga moemo detaljno pogledati
neke delove ovog projektnog okruenja. Prvi prozor na koji treba
obratiti panju je Solution Explorer | Class View u gornjem desnom
uglu ekrana koji je dole prikazan u oba reima rada (reim moete
menjati pritiskajui dugmad u dnu prozora).
Ovaj pogled preko Solution Explorera prikazuje datoteke od kojih
se sastoji projekat Pozdrav svete. Datoteka kojoj smo dodali kod je
Class1.cs prikazana zajedno sa jo jednom kod datotekom,
AssemblyInfo.cs. (Sve datoteke sa C# kodom imaju nastavak cs). Ova
druga datoteka sa kodom za sada nije naa briga, ona sadri dodatne
informacije o naem projektu koje nas se jo uvek ne tiu.
7
Unutar ovog prozora moemo menjati sadraj glavnog prozora, koji e
se kod unutar njega prikazivati, i to tako to emo otvoriti datoteku
.cs koja nam je potrebna ili pritisnuti na nju desnim dugmetom mia
i odabrati opciju View Code. To moete uraditi i na drugi nain,
jednostavnim pritiskom miem na dugme iz palete sa alatkama u
gornjem delu prozora. U okviru ovog prozora moemo i manipulisati sa
datotekama, brisati ih, menjati im ime i slino. Ovde se takoe mogu
nalaziti i drugi tipovi datoteka, kao to su resursne datoteke
projekta (resursi su datoteke koje nisu uvek C# datoteke - to mogu
biti i slike ili zvune datoteke). Naravno, i sa njima moemo
manipulisati preko istog interfejsa. Lista References sadri spisak
.NET biblioteka koje koristimo u naem projektu. I to je neto ime
emo se pozabaviti kasnije, zato to su standardne reference za na
poetak dovoljne. Drugi pogled istog prozora, Class View,
predstavlja nain da pogledamo na projekat kroz strukturu koda koji
smo napravili. Tome emo se vratiti kasnije, a za sada odaberimo
pogled Solution Explorer. Primetiete da se sadraj donjeg prozora
menja u odnosu na to koju ikonu ili datoteku odaberete u gornjim
prozorima. To je jo jedan prozor koji ima vise pogleda, ali
najvaniji od njih je pogled Properties:
Ovaj prozor pokazuje dodatne informacije o tome ta smo odabrali
u prozora iznad njega. Na primer, kada izaberemo Class1.cs iz naeg
projekta videemo ono to je prikazano na slici. Ovaj prozor moe da
nam prikae i informacije o drugim elementima koje odaberemo, kao to
su komponente korisnikog interfejsa, to emo videti u drugom delu
ovog predavanja koji se bavi Windows aplikacijama. esto, ukoliko
unesemo izmene u prozor Properties, to e direktno uticati na kod
tako to e dodati nove redove koda ili menjati sadraj naih datoteka.
U nekim projektima proveemo isto toliko vremena menjajui stvari u
ovom prozora, koliko emo provesti u pisanju samog koda. Sada
pogledajmo prozor Output. Kada ste pokretali program verovatno ste
primetili da se u ovom prozora pojavio neki tekst pre konzolnog
prozora nae aplikacije. Na naem raunara pojavilo se, na primer:
8
Kao to moete pretpostaviti, to je izvetaj o statusu datoteka
koje se kompajliraju. Ovde emo dobiti i izvetaj o grekama koje se
mogu dogoditi tokom kompajliranja. Na primer, probajte da obriete
taku-zarez iz reda koji smo dodali unosei kod u prethodnom koraku,
i ponovo kompajlirajte. Ovaj put videete sledee:
Ovaj put projekat nee raditi. U sledeem predavanju kada budemo
preli na sintaksu C#-a, videemo da se taka-zarez oekuje kroz ceo
kod - na kraju skoro svakog reda naeg koda. Poto sada moramo neto
uraditi da bismo naterali kod da radi, VS automatski dodaje zadatak
u listu zadataka koja deli prostor sa prozorom Output:
9
Ovaj prozor e nam pomoi da utvrdimo gde se u naem kodu nalaze
greke i vodie rauna o tome ta sve treba da uradimo da bi
kompajlirali na kod. Ako dva puta pritisnemo miem na greku
prikazanu u ovom prozoru, kursor e se postaviti tano na mestu gde
je greka unutar koda (otvorie se datoteka koda koja sadri greku
ukoliko ve nije otvorena), tako da problem moemo brzo reiti. Takoe
emo videti male crvene talasaste linije na mestu gde lei naa greka
tako da kod nije teko pretraiti. Zapazite kako je lokacija greke
navedena kao broj reda. VS program za ureivanje teksta standardno
ne prikazuje brojeve redova, a to je neto to bi bilo od koristi da
vidimo. Da bismo to postigli, trebalo bi potvrditi odreena polja za
potvrdu unutar dijaloga Options do koga se dolazi izborom stavke
menija Tools | Options.... Ime polja za potvrdu je Line Numbers i
nalazi se u kategoriji Text Editor | C# | General, kao to je
prikazano na sledeoj slici:
10
Promenljive i izraziRaunarski program je, najpreciznije reeno,
serija operacija koja manipulie podacima. To vai i za
najkomplikovanije primere kao to su obimne i vienamenske Windows
aplikacije (Microsoft Office, na primer). Najee skriven od pogleda
korisnika, taj skup operacija se uvek odvija u pozadini. Ono to
vidite na vaem monitoru toliko vam je poznato, da je teko zamisliti
da je cela pria neto vise od pokretnih slika". U stvari, ono to
vidite jeste samo predstava nekih podataka, ija gruba forma nije
nita drugo do niz nula i jedinica smetenih negde u unutranjosti
memorije vaeg raunara. Sve to uradite na ekranu, bez obzira na to
da li se radi o pokretanju pokazivaa mia, pritiska na neku ikonu,
ili unosa teksta u program za ureivanje teksta, rezultirae
naizmeninom razmenom podataka u memoriji. Naravno, postoje i manje
apstraktne situacije koje vam mogu pokazati isto. Ukoliko ukljuite
aplikaciju kalkulator, obezbediete podatke u obliku brojeva i
izvesti odreene operacije sa njima na nain na koji biste to uradili
i na papiru, samo to je ovako mnogo bre. Ako je raunarski program u
osnovi izvoenje operacija nad podacima, to znai da je nama potreban
nain na koji moemo uskladititi neke podatke, kao i utvrivanje
metoda manipulacije njima. Ove dve funkcije se obezbeuju preko
promenljivih i izraza respektivno, a u ovom predavanju istraiemo ta
to uopteno i detaljno znai. Prethodno je potrebno da se upoznamo sa
osnovnom sintaksom jezika C#.
Osnove C# sintakse
Izgled i oseaj rada sa jezikom C# vrlo je slian C++-u i Javi. U
poetku sintaksa izgleda prilino zbunjujue, a i manje je nalik
pisanom engleskom nego neki drugi jezici. Pa ipak, kako zaponete sa
programiranjem u jeziku C# shvatiete da je sintaksa razumljiva i da
je mogue napisati vrlo jasan i itljiv kod bez mnogo muke. Za
razliku od kompajlera za neke druge jezike, C# kompajler ne obraa
panju na dodatne razmake unutar koda, bez obzira na to da li se
sastoje od blanko znakova, tabulatora ili znakova za novi red. To
znai da imamo prilinu slobodu u formatiranju naeg koda, iako se
pridravanjem odreenih pravila itanje koda moe znatno olakati. C#
kod je sastavljen od niza iskaza, a svaki od njih se zavrava
takom-zarezom. Kako se beli (prazan) prostor ignorie, mogue je u
jedan red staviti vise iskaza, ali zarad itljivosti uobiajeno je
prei u novi red nakon take-zareza. Na taj nain izbegavamo vise
iskaza u jednom redu. Savreno je prihvatljivo (ak i prilino
normalno) da se jedan iskaz unese u vise redova. C# spada u jezike
sa blokovskom strukturom, to znai da su svi iskazi delovi bloka
unutar koda. Ovi blokovi, koji su oivieni vitiastom zagradom ({i}),
mogu da sadre bilo koju vrstu iskaza, a i ne moraju ni jednu.
Zapamtite da vitiaste zagrade ne zahtevaju taku-zarez iza sebe. Na
primer, blok C# koda moe izgledati ovako: { ; ;
}
Ovde naravno nisu pravi izgled C# koda - kroz ovaj tekst je samo
prikazano gde bi trebalo staviti C# iskaze. Primetite da su u ovom
sluaju red 2 i red 3 deo istog iskaza zbog toga to na kraju reda
dva ne postoji taka-zarez.
1
U ovom jednostavnom primeru nain na koji je uvuen tekst tipian
je za C#. To nije izmiljeni metod pisanja C# koda, ve ustaljena
praksa; VS e sam uraditi slinu stvar. Uopteno, svaki blok koda ima
svoj stepen uvlaenja, koliko e desno biti postavljen u odnosu na
levu ivicu. Blokovi koda mogu biti ugnedeni jedan u drugi (odnosno,
blokovi mogu sadrati druge blokove), i u torn sluaju se ugnedeni
blokovi uvlae jo vie: { ; { ; ; } ; } Takoe, redovi koda koji
predstavljaju nastavak prethodnog reda uvlae se jo vise, kao u
prvom primeru u redu 3. Zapamtite da ovaj stil pisanja niim nije
uslovljen. Meutim, ukoliko ga ne koristite, stvari mogu postati
vrlo konfuzne! Jo jedna stvar koju esto nalazimo u C# kodu jesu
komentari. Komentari, strogo govorei, uopte nisu deo C# koda, ali
na svu sreu postoje unutar njega. Komentari rade ono to im ime
kazuje: omoguavaju dodavanje opisnog teksta vaem kodu - i to na
srpskom (engleskom, francuskom, nemakom, mongolskom i tako dalje)
jeziku, a to e kompajler u potpunosti ignorisati. Kada se budemo
bavili nekim delovima koda koji su dui, bie zgodno da dodamo
podsetnike o tome ta radimo, na primer: Ovaj red koda pita
korisnika za broj", ili: Ovaj deo koda je napisao Petar". C# sadri
dva naina da se to izvede. Moemo postaviti markere na poetku i na
kraju komentara, ili moemo upotrebiti marker koji oznaava da je sve
do kraja ovog reda komentar. Ovaj poslednji metod je izuzetak od
pravila koje smo gore pomenuli, da C# kompajler ignorie prelazak u
novi red. Za obeleavanje komentara prvom metodom koristimo znakove
/ * " na poetku komentara, i znakove * / " na kraju. Ovo moete
koristiti za jedan red i za vise njih, ali u torn sluaju svi redovi
izmedu markera postaju deo komentara. Jedina stvar koju ne moemo
unositi unutar markera jeste * / ", jer bi to bilo shvaeno kao kraj
komentara. Tako da je prihvatljivo sledee: /* Ovo je komentar */ /*
Takoe... ... i ovo */ Ali sledee bi izazvalo probleme: /* Komentari
se cesto zavravaju " */" znakovima */ Ovde e kraj komentara
(znakovi posle * / ") biti prepoznat kao C# kod i doi e do greke.
Drugi pristup komentarima ukljuuje zapoinjanje komentara znakom / /
". U nastavku moete unositi ta god vam je volja sve dok ste u istom
redu! Sledee ispravno: // Ovo je druga vrsta komentara. Ali, sledee
nee raditi, zato to e drugi red biti interpretiran kao C# kod: //
Takoe je i ovo, ali ovo nije.
2
Ova vrsta komentara je korisna za dokumentovanje iskaza, jer moe
biti postavljena u istom redu kao i iskaz: ; // Objanjenje iskaza
Trei tip komentara u jeziku C# dozvoljava vam da dokumentujete va
kod. To su pojedinani redovi komentara koji poinju sa tri / "
simbola umesto sa dva, na primer: /// Poseban komentar Pod
normalnim okolnostima kompajler ignorie ovakve komentare kao i sve
druge, ali VS moete konfigurisati tako da on pravi posebno
formatirane tekstualne datoteke kada se projekat kompajlira, koje
nam kasnije mogu koristiti da napravimo prateu dokumentaciju. Vrlo
je vano naglasiti da je C# kod osetljiv na upotrebu malih i velikih
slova. Za razliku od nekih drugih jezika, kod se mora unositi pazei
na upotrebu velikih i malih slova. Ukoliko se toga ne pridravamo,
zaustaviemo kompajliranje projekta.
Osnove strukture C# konzolne aplikacije
Pogledajmo jo jednom primer konzolne aplikacije iz prethodnog
predavanja (Pozdrav Svete), i zavirimo u njegovu strukturu. Kod je
izgledao ovako: using System; namespace Pozdrav_Svete { /// ///
Summary description for Class1. /// class Classl1 { static void
Main(string [] args) { // // TODO: Add code to start application
here // Console.WriteLine("Pozdrav svete na jeziku C# !"); } } }
Moemo odmah uoiti sve elemente sintakse o kojima smo malopre
priali. Vidimo takuzarez, vitiaste zagrade, komentare zajedno sa
odgovarajuim uvlaenjem. Najvaniji deo koda za sada je: static void
Main (string [] args) { // // TODO: Add code to start application
here // Console.WriteLine("Pozdrav svete na jeziku C# !"); } Ovaj
deo koda se izvrava kada se konzolna aplikacija startuje, ili jo
preciznije, izvrava se blok koda oivien vitiastim zagradama. Jedini
red koda koji e neto uraditi jeste onaj koji smo dodali automatski
generisanom kodu - to je u stvari jedini red koji nije komentar.
Ovaj kod jednostavno ispisuje neki tekst unutar konzolnog prozora,
iako nas trenutno ne interesuje taan mehanizam kojim se to
izaziva.
3
Cilj nam je da u prvih nekoliko predavanja objasnimo osnove
sintakse jezika C#, tako da nas ne interesuje kako u toku svog
izvravanja aplikacija dolazi do take gde se poziva
Console.WriteLine (). Kasnije emo razjasniti znaaj ovog dodatnog
koda.
Promenljive
Kako je naznaeno u uvodu ovog predavanja, promenljive nam slue
da u njih skladitimo podatke. U osnovi, o promenljivima unutar
memorije raunara razmiljamo kao o malim kutijama koje su poreane u
nekoj polici. Te kutije moemo puniti raznim stvarima i prazniti ih,
ili moemo samo zaviriti u njih. Iako u osnovi svi raunarski podaci
u sutini sadre istu stvar (nizove jedinica i nula), promenljive
imaju vise tipova. Ponovo kroz analogiju sa kutijama moemo
zamisliti da one dolaze u razliitim veliinama i oblicima, tako da
odreene stvari mogu stati samo u odreene kutije. Glavni razlog za
ovakav nain raspodele po tipovima lei u tome to postoje razliiti
tipovi podataka kojima se na drugaiji nain manipulie, tako da
ograniavajui promenljive po tipu izbegavamo zabunu. Na primer, ne
bi bilo logino tretirati na isti nain nizove jedinica i nula koje
zajedno ine digitalnu sliku kao i zvune datoteke. Da bismo
koristili promenljive, one moraju biti deklarisane. To znai da
moramo da im dodelimo ime i tip. Jednom kad ih deklariemo,
koristiemo ih za smetanje onog tipa podataka koji je naznaen u
deklaraciji. Da bi se promenljiva navela u jeziku C# koristi se tip
i ime kao u sledeem primeru: ; Ako probamo da upotrebimo
promenljivu koja nije deklarisana, kod se nee kompajlirati, ali u
torn sluaju kompajler e vas tano obavestiti ta je problem. Pored
toga, ako pokuate da upotrebite promenljivu kojoj niste dodelili
neku vrednost, to e takoe prouzrokovati greku, ali kompajler e i to
primetiti. injenica je da postoji neogranien broj tipova koje moemo
koristiti. To nam omoguava da sami definiemo svoje tipove ma koliko
zamreni oni bili. Kada smo ve kod toga, postoje odreeni tipovi
podataka koje e svi poeleti da koriste u odreenom trenutku, na
primer promenljive koje sadre brojeve. Iz tog razloga postoje
prosti unapred definisani tipovi promenljivih koje bi trebalo
znati.
Prosti tipovi promenljivih
Prosti tipovi su recimo brojevne ili logike vrednosti (tano ili
netano) koje sainjavaju osnovne blokove za izgradnju naih
aplikacija, kao i za izgradnju drugih, sloenijih tipova. Veina
prostih tipova su brojevni, to nam u prvi mah izgleda malo udno -
zar nam ne treba samo jedan tip promenljivih da bismo uskladitili
brojeve? Razlog za podelu tipova brojevnih promenljivih lei u samom
mehanizmu smetanja brojeva kao nizova jedinica i nula u memoriju
raunara. Za celobrojne vrednosti jednostavno uzimamo odreen broj
bitova (nezavisnih cifri koje mogu biti jedinice ili nule) i
predstavljamo na broj u binarnom formatu. Promenljiva koja smeta N
bitova dozvoljava nam da preko nje prikaemo bilo koji broj izmedu 0
i (2n- 1). Bilo koji broj iznad ove vrednosti bie prevelik da se
smesti u promenljivu. Recimo da imamo promenljivu u koju moemo
smestili dva bita. Preslikavanje izmedu celih brojeva i bitova koji
ih predstavljaju izgleda ovako: 0=00 1=01 2-10 3-11
4
Ako elimo da smestimo vise brojeva, treba nam vise bitova (tri
bita e nam recimo, omoguiti smetanje brojeva od 0 do 7).
Nezaobilazan zakljuak bi bio da nam za sve brojeve koje moemo
zamisliti treba beskonana koliina bita, to ba i nee stati u na
verni PC. ak i da postoji odgovarajui broj bitova za svaki broj,
nikako ne bi bilo efikasno koristiti sve bitove za, recimo,
promenljivu koja treba da smesti u sebe brojeve od 0 do 10 (ogroman
prostor bi bio protraen). etiri bita bi nam ovde zavrila posao,
dozvoljavajui nam da u isti memorijski prostor smestimo znatno vise
vrednosti iz ovog opsega. Umesto toga, imamo odreen broj razliitih
celobrojnih tipova koje demo koristiti za razliite opsege brojeva,
ime emo zauzimati i razliite koliine memorije (sve do 64 bita).
Sledi njihova lista: Zapamtite da svaki od ovih tipova koristi
jedan ili vie standardnih tipova definisanih u .NET okruenju. Kao
to smo razmotrili u prvom predavanju, korienje standardnih tipova
nam omoguuje kombinovanje vise razliitih jezika u jedan projekat
ili reenje. Nazivi koje koristimo za tipove u jeziku C#
predstavljaju pseudonime za tipove koji su definisani u okruenju.
Ova tabela je lista imena ovih tipova, i onoga ta predstavljaju
unutar biblioteke .NET okruenja.Tip sbyte byte short ushort int
uint long ulong pseudonim za System.SByte System.Byte System.Intl6
System.UIntl6 System.Int32 System.UInt32 System.Int64 System.UInt64
dozvoljene vrednosti ceo broj izmeu -128 i 127. ceo broj izmeu 0 i
255. ceo broj izmeu -32768 i 32767. ceo broj O i 65535. ceo broj
izmeu -2147.483.648 i 2147.483.647. ceo broj izmeu 0 i 4294967295.
ceo broj izmeu -9223.372.036.854.775.808 i
9223.372.036.854.775.807. ceo broj izmeu 0 i
1846.744.073.709.551.615.
Znak u" koji stoji ispred imena nekih promenljivih jeste
skraenica za unsigned" (neoznaeno), to znai da u taj tip
promenljivih ne moemo smetati negativne brojeve, to se moe videti
iz kolone dozvoljenih vrednosti u prethodnoj tabeli. Pored
celobrojnih, potreban nam je i nain da smestimo brojeve sa
pokretnim zarezom, odnosno decimalne brojeve. Postoje tri tipa
promenljivih namenjenih brojevima sa pokretnim zarezom: float,
double i decimal. Prva dva tipa uvaju brojeve u pokretnom zarezu u
obliku +/- m x 2e, gde se dozvoljene vrednosti za m i e razlikuju
za svaki tip. Tip decimal koristi oblik +/- m x 10e. Ova tri tipa,
zajedno sa dozvoljenim vrednostima, kao i realnim opsezima,
prikazani su u sledeoj tabeli:Tip float double decimal Pseudonim za
System. Single System.Double System.Decimal Minm 0 0 0 Maxm 224 253
296 Mine -149 -1075 -26 Maxe 104 970 0 Pribl. min vrednost
1.5x10-45 5.0x10124 1.0x10-28 Pribl. max vrednost 3.4x1038
1.7x10308 7.9x1028
5
Pored brojevnih tipova postoje jo tri prosta tipa:Tip char bool
string Pseudonim za System.Char System.Boolean System.String
Dozvoljene vrednosti pojedinaan Unicode znak, smeten kao ceo broj
izmeu 0 i 65535. logika vrednost, true ili f a l s e . niz
znakova.
Zapazite da ne postoji gornja granica za niz znakova koji
sainjavaju string. To je zbog toga to koliina memorije koju on
zauzima moe biti promenljiva. Logiki tip bool je jedan od najee
korienih tipova promenljivih u jeziku C#. Slini tipovi se najee
koriste i u drugim jezicima. Vrlo je vano imati promenljivu koja
moe imati vrednosti true ili false, zbog logikog toka aplikacije.
Uzmite u razmatranje, na primer, na koliko pitanja moe biti
odgovoreno sa true ili false (odnosno, sa da ili ne). Poreenje
vrednosti dve promenljive ili potvrivanje nekog unosa podataka,
predstavljaju samo dva od mnogih naina primene logikih promenljivih
koje emo uskoro isprobati. Poto smo se upoznali sa tipovima
promenljivih, uradimo kratak primer kako ih deklarisati i
koristiti.
Veba br. 2.Napravite novi projekat konzolne aplikacije birajui
File | New | Project... iz menija:
Izaberite Visual C# Projects direktorijum unutar prozora Project
Types:, i tip projekta Console Application u okviru prozora
Templates: (za ovo ete morati malo da pomerite prozor na dole). U
okviru za tekst Location: promenite putanju u
C:\Temp\SoftIng\LecturesCode\Vezba2 (ovaj e direktorijum biti
automatski napravljen ukoliko ve ne postoji), i ostavite
podrazumevani tekst u okviru za tekst Name: Rad sa
promenljivima1.
6
Dodajte sledei kod u Classl.cs (obriite redove sa komentarom na
torn mestu):
Pokrenite program (ukoliko vam nije iskljuen reim za otklanjanje
greaka, konzolna aplikacija e se zatvoriti pre nego to vidite ta se
dogodilo):
Kako to radiKod koji ste dodali uradi sledee:deklarie dve
promenljive; dodeljuje vrednosti promenljivima; preko konzole
ispisuje te dve vrednosti.
7
Promenljive se deklariu u sledeem kodu: int MojInteger; string
MojString; Prvi red deklarie promenljivu tipa int i to pod imenom
MojInteger, a dragi red deklarie promenljivu tipa string nazvanu
MojString.Zapamtite da je dodeljivanje imena promenljivima
ogranieno, odnosno ne moe ba sve biti ime promenljive. O ovome emo
priati u delu koji se bavi imenovanjem promenljivih.
Sledea dva reda koda deklariu vrednosti: MojInteger = 17;
MojString = "Moj Ceo Broj \"MojInteger\" je:"; Ovde dodeljujemo dve
fiksne vrednosti (poznatije kao vrednosti literala unutar koda)
naim promenljivima koristei operator dodele = (o operatorima emo
detaljnije govoriti u delu koji se bavi izrazima u okviru ovog
predavanja). Dodeljujemo vrednost 17 promenljivoj MojInteger, dok
promenljivoj MojString dodeljujemo MojInteger" is (ukljuujui i
navodnike). Kada se dodeljuju znakovne vrednosti literala,
zapamtite da moraju biti oiviene navodnicima. Da bi se to izvelo
kako treba, neke znakove ne smemo koristiti unutar navodnika (na
primer-same navodnike), ili ih moramo oznaiti tako to emo umesto
njih koristiti neki niz znakova (poznat kao escape sekvenca) koji
predstavlja one koje elimo da koristimo. U ovom primeru koristili
smo sekvencu \" da bismo oznaili duple navodnike: MojString = "Moj
Ceo Broj \"MojInteger\" je:"; Da nismo koristili escape sekvencu, i
umesto nje probali: MojString = ""MojInteger" je"; pri
kompajliranju bi se pojavila greka. Pri dodeljivanju znakova
literala moramo biti oprezni sa prelazima u novi red - C# kompajler
e odbaciti literale koji su vei od jednog reda. Ako elimo da
proirimo literal na vise od jednog reda, moramo koristiti escape
sekvencu \n. Na primer, sledea dodela: MojString = "Ovaj string ima
\nprelazaka u novi red. "; bie prikazana u dva reda u okviru
konzolnog prozora. Sve iskone (engl. escape) sekvence sastoje se iz
znaka obrnute kose crte ( \ ) koji prati nekoliko znakova (videemo
kasnije koji su to znakovi). Poto je znak obrnute kose crte
iskorien u ovu svrhu, i za njega postoji escape sekvenca koja se
jednostavno sastoji iz dva takva znaka, \\. Vratimo se kodu. Ostao
nam je samo jo jedan red koji nismo prouili: Console.WriteLine("{0}
{1}.", MojString, MojInteger);
8
Ovo je jako slino metodi ispisivanja teksta unutar konzole koju
smo koristili u prvom primeru, ali smo sada naveli i nae
promenljive. Ovo je tehnika koju emo koristiti u prvom delu knjige
da bismo u okviru konzolnog prozora ispisali neki tekst. Unutar
zagrada imamo dve stvari: string, listu promenljivih ije vrednosti
elimo da ubacimo u izlazni string, odvojenu zarezima. ini se da
string koji ispisujemo na izlazu, " {0} {1}. ", ne sadri nikakav
koristan tekst. Ali kada se program pokrene, vidimo da taj string u
stvari predstavlja ablon u koji ubacujemo sadraj naih promenljivih.
Svaki znak oivien vitiastim zagradama predstavlja mesto na koje se
smeta sadraj naih promenljivih. A svako mesto (ili string za
formatiranje) predstavljeno je celobrojnom vrednou oivienom
vitiastim zagradama. Celobrojne vrednosti poinju od nule i uveavaju
se za jedan, a ukupan broj mesta treba da bude jednak broju
promenljivih koje su navedene u produetku stringa i odvojene su
zarezima. Kada se tekst ispie na konzoli, svako mesto biva
zamenjeno odgovarajuom vrednou predviene promenljive. U gore
navedenom primeru { 0 } je zamenjena stvarnom vrednou prve
promenljive MojString, a {1} je zamenjeno sadrajem promenljive
MojInteger. Ovaj metod ispisa teksta na konzolu koristiemo i u
narednim primerima.
9
Imenovanje promenljivih, konvencije i vrednosti literalaKao to
je spomenuto u prethodnom delu, za ime promenljive ne moe se
koristiti bilo koji niz znakova. I pored toga, ostaje nam dovoljno
fleksibilan nain imenovanja promenljivih. Osnovna pravila pri
imenovanju promenljivih su:Prvi znak imena promenljive mora biti
ili slovo, ili znak podvlaenja (_), ili @. Naredni znakovi mogu
biti slova, znakovi podvlaenja ili brojevi.
Kao dodatak tome postoje odreene kljune rei koje oznaavaju neke
radnje samom kompajleru, kao to su kljune rei using i namespace iz
prethodnih primera. Ako kojim sluajem iskoristimo neku od kljunih
rei kao ime promenljive, kompajler e se pobuniti, i ubrzo ete
shvatiti da ste napravili greku, pa stoga ne brinite o tome mnogo.
Na primer, sledea imena promenljivih su dobra:myBigVar VAR1
_test
Ova nisu:99FlasaPiva namespace Sve-je-gotovo
Upamtite, C# je osetljiv na korienje velikih i malih slova, zbog
ega moramo pamtiti taan oblik imena koje smo dodelili promenljivoj.
ak i jedna greka ovog tipa spreie kompajliranje programa.Posledica
toga je i to da moemo imati vie promenljivih koje se razlikuju samo
u velikim i malim slovima. Na primer, ovo su sve razliite
promenljive:myVariable MyVariable MYVARIABLE
Pravila imenovanjaImena promenljivih su neto sa ime ete mnogo
raditi. Zbog toga bi vredelo malo vremena utroiti na neku optu
klasifikaciju i sortiranje imena koja emo koristiti. Pre nego to
krenemo trebalo bi da imate na umu da je ovo kontroverzna oblast.
Tokom godina razliiti sistemi su dolazili i odlazili, a neki
programeri se svojski bore da opravdaju sopstvene sisteme. Do skoro
najpopularniji sistem bio je poznat kao maarska notacija. U njemu
svaka promenjiva sadri prefiks koji se pie malim slovom i
identifikuje tip. Na primer, ako je promenljiva tipa int onda
stavljamo i ( ili n) ispred njenog imena (recimo iGodiste).
Koristei ovaj sistem, lako se moe utvrditi kog su tipa promenljive.
Primena tog sistema u modernijim jezicima kao to je C#, malo je
nezgodna. Za one tipove promenljivih koje smo do sada upoznali,
mogli bismo se lako snai sa jednim ili dva slova kao prefiksima.
Ali poto sami moemo definisati kompleksnije tipove, a i kako
postoji vise stotina kompleksnih tipova u osnovi .NET okruenja, taj
sistem brzo postaje neupotrebljiv. Kako na jednom projektu moe
raditi vise ljudi, svaki od njih moe za sebe pronai posebnu1
kombinaciju oznaka za prefikse i na taj nain potpuno zbuniti
ostale, to dovodi do pogubnih posledica. Programeri su do sada
shvatili da je najbolje imenovati promenljivu prema njenoj nameni.
Ako iskrsne bilo kakva sumnja, dovoljno je lako pronai kome tipu
promenljiva pripada. U VS-u dovoljno je da pokaziva mia namestimo
na ime promenljive kojoj elimo da otkrijemo tip i ispisae se poruka
koja nas o tome obavetava. Trenutno imamo dve konvencije prema
kojima se promenljive imenuju u .NET okruenju, a to su PascalCase i
camelCase. Nain na koji su napisana imena ove dve konvencije je
prema njihovoj upotrebi: obe se odnose na to da imena promenljivih
budu sastavljena iz vie rei, a i naglaavaju da svaka re poinje
velikim slovom, dok su sva ostala mala. Konvencija camelCase ima
dodatno pravilo - da prvo slovo kompletnog imena promenljive bude
malo slovo. Sledei primer koristi camelCase konvenciju:godite
imeUenika datumUpisa
A u sledeem je upotrebljena konvencija PascalCase:Godite
PrezimeUenika ZimaNaegNezadovoljstva
Za proste promenljive pridravaemo se konvencije camelCase, dok
demo PascalCase koristiti za naprednije imenovanje, to je u stvari
preporuka Microsofta. Konano, vredi napomenuti da su sistemi
imenovanja u prolosti esto koristili znak podvlaenja, obino da bi
se odvojile rei unutar imena promenljivih, kao to je
moja_prva_promenljiva. Ovakav pristup je sada odbaen.
Tabela 4.1. Prefiksi tipova podataka
Tip podatakaBoolean Byte Char Decimal Double Integer Long Object
Short String
Prefiksbln byt chr dec dbl int lng obj sho str
Primer vrednostiblnUlogovan bytGodiste chrLozinka decProdato
dblRezultatIzracunavanja intBrojacPetlje lngIdKupca objWord
shoTotalnaVrednost strIme
2
Tabela 4.2. Prefiksi promenljivih po podruju vaenja
Podruje vaenjaGlobal Private to class Nonstatic promenljiva,
local to method
Prefiksg m (no prefix)
Primer vrednostig_strSnimiPutanju m_blnPromenaVrednosti
Vrednosti literalaU prethodnom primeru videli smo dve vrednosti
literala - celobrojnu i znakovnu. I drugi tipovi promenljivih takoe
mogu imati vrednosti literala, to e biti prikazano u sledeoj
tabeli. Mnogi od njih ukljuuju sufikse, odnosno nizove znakova koji
se dodaju na kraju literala da bi se naznaio eljeni tip. Neki
literali imaju vie razliitih tipova koje na osnovu konteksta
odreuje kompajler za vreme kompajliranja:Tabela 4.3. Sufiksi
literala kod tipova podataka
Tip(ovi)bool int,uint, long, ulong uint,ulong long, ulong ulong
float double decimal char string
Kategorijalogika celobrojna celobrojna celobrojna celobrojna
realna realna realna znakovna niz znakova
Sufiksnema nema u ili U l ili L ul, uL, Ul,lu, U, Lu, ili LU f
ili F nema, d ili D m ili M nema nema
Primer/dozvoljene vrednostitrue ili false 100 100U 100L 100UL
1.5F 1.5 1.5M a, ili escape sekvenca a..a, moe se ukljuiti escape
sekvenca
String literaliRanije u ovom predavanju videli smo nekoliko
iskonih sekvenci koje moemo koristiti u literalnim stringovima.
Vredi predstaviti kompletnu tabelu, da bismo imali podsetnik:
Tabela 4.4. Escape sekvence
Escape sekvenca\` \" \\ \0 \a
Znak koji pravijednostruki navodnik dvostruki navodnik obrnuta
kosa crta nula alarm(pravi pitanje)
Vrednost znaka u unicode-u0x0027 0x0022 0x005C 0x0000 0x0007
3
Tabela 4.4. Escape sekvence
Escape sekvenca\b \f \n \r \t \v
Znak koji praviunazad za jedan znak prelazak na sledeu stranicu
novi red prenos u novi red horizontalni tabulator vertikalni
tabulator
Vrednost znaka u unicode-u0x00080 0x000C 0x000A 0x000D 0x0009
0x000B
Kolona ove tabele koja prikazuje Unicode vrednost, predstavlja
heksadecimalnu vrednost koju taj znak ima u Unicode skupu znakova.
Za svaki Unicode znak moemo navesti odgovarajuu iskonu sekvencu,
kao to su one u tabeli. Sekvenca se uvek sastoji od znaka \ iza
koga sledi etvorocifrena heksadecimalna vrednost (na primer etiri
cifre iza znaka x u gornjoj tabeli). To znai da su sledea dva
stringa ekvivalentna:"Petar\s string." "Petar\u0027s string"
Oigledno da imamo vise mogunosti korienjem Unicode iskorienih
sekvenci. Takoe moemo deformisati i literalne stringove. To
podrazumeva da su u taj niz ukljueni svi znakovi oivieni dvostrukim
navodnikom, ukljuujui i one koji oznaavaju kraj reda ili iskonu
sekvencu. Jedini izuzetak je iskona sekvenca za dvostruke navodnike
koja se mora navesti da bi se izbegao prevremeni kraj niza. Da bi
se ovo izbeglo, na poetak niza znakova, pre navodnika, stavljamo
znak @:@"sinonim string literala."
Niz znakova, odnosno string, lako moemo deformisati na normalan
nain, ali sledei zahteva ovaj metod:@"Kratka lista: objekat 1
objekat 2"
Literalni stringovi naroito su korisni u imenima datoteka zato
to ovi esto koriste znak obrnute kose crte. Ako koristimo normalan
string, moramo koristiti dvostruku obrnutu kosu crtu u celom
stringu, na primer:"C: \Temp\MojFolder\MojFajl.doc"
Sa litaralnim stringom, ovo moe biti itljivije. Sledei literalni
string predstavlja potpuno isto kao malopreanji niz
znakova:@"C:\Temp\ MojFolder\MojFajl.doc"
4
Zapamtite da su nizovi znakova, odnosno stringovi, referentnog
tipa, za razliku od onih koji su vrednosnog tipa Posledica toga je
i to da se stringu moe dodeliti vrednost null, to znai da string
promenljiva ne pokazuje na string. Ovo emo kasnije detaljnije
objasniti.
Odreivanje i dodeljivanje vrednosti promenljivimSetimo se da smo
deklarisali promenljive koristei samo njihov tip i ime, na
primer:int godite;
Potom smo joj dodelili vrednost uz pomo operatora dodele
=:godite = 25; Upamtite da promenljive moraju biti inicijalizovane
pre nego to ih upotrebimo. Prethodni redovi mogu biti korieni kao
inicijalizacija.
Ima jo nekoliko stvari koje moemo uraditi, koje ete vidati u C#
kodu. Prvo, moemo navesti vise razliitih promenljivih istog tipa u
isto vreme, to je mogue izvesti ako ih odvojimo zarezom:int
xVelicina, yVelicina;
gde su i xVelicina i yVelicina obe navedene kao celobrojne
promenljive. Druga tehnika koju ete sretati jeste dodeljivanje
vrednosti promenljivima dok ih deklariemo, to u stvari znai
kombinovanje dva reda koda:int godite = 25;
A moemo i obe tehnike koristiti zajedno:int xVelicina =4,
yVelicina = 5;
Ovde su xVelicina i yVelicina razliitih vrednosti. Pogledajte
sledee:int xVelicina, yVelicina = 4;
Ovo znai da je yVelicina inicijalizovana, a xVelicina samo
deklarisana.
IzraziVideli smo kako deklarisati i inicijalizovati promenljive
i vreme je da nauimo kako da sa njima manipuliemo. C# kod sadri vei
broj operatora koji tome slue, ukljuujui i operator dodeljivanja =,
koji smo ve koristili. Kombinovanjem operatora sa promenljivima i
literalima (koji se nazivaju operandi kada se koriste zajedno sa
operatorima) moemo formirati izraze, koji ine osnovne gradivne
blokove pri raunanju. Postoji irok dijapazon operatora, od onih
jednostavnih do najkomplikovanijih, koje ete sretati samo u
matematikim primenama. Prosti ukljuuju sve osnovne matematike
operacije, kao to je; recimo operator + za sabiranje, a oni
komplikovaniji, na primer, manipulaciju nad sadrajem promenljive i
to prikazane u binarnom obliku. Postoje i logiki operatori koji
slue u radu sa logikim promenljivima, kao i operatori dodele,
recimo =.
5
U ovom predavanju skoncentrisaemo se na matematike i operatore
dodeljivanja, dok emo za idua ostaviti logike operatore. Naime,
preko logikih emo ispitivati kontrolu toka programa. Operatori se
mogu grubo podeliti na tri kategorije: unarni operatori, koji rade
samo sa jednim operandom; binarni operatori, koji rade sa dva
operanda; ternarni operatori, koji rade sa tri operanda. Najvei deo
operatora spada u binarne, samo nekoliko u unarne, dok je ternarni
samo jedan koji se jo zove i uslovni operator (uslovni operator je
logiki, odnosno on vraa logiku vrednost, ali o tome u iduem
predavanju). Pogledajmo sada matematike operatore, koji sadre i
binarnu i unarnu kategoriju.
Matematiki operatoriPostoji pet prostih matematikih operatora,
od kojih dva imaju i unarnu i binarnu formu. U donjoj tabeli
navedeni su svi ove operatori, zajedno sa kratkim primerom njihove
upotrebe i rezultatima pri radu sa prostim numerikim tipovima
(celobrojnim i decimalnim):
Tabela 4.5. Operatori
Operator+ * / % + -
Kategorijabinarni binarni binarni binarni binarni unarni
unarni
Primer izrazavar1=var2+var3; var1=var2-var3; var1 = var2 * var3;
var1 = var2 / var3 var1 = var2 % var3 var1 = +var2 var1 = -var2
Rezultatvar1 je dodeljena vrednost sume var2 i var3 var1 je
dodeljena vrednost razlike var2 i var3 var1 je dodeljena vrednost
proizvoda var2 i var3 var1 je dodeljena vrednost deljenja var2 i
var3 var1 je dodeljena vrednost koja je ostatak deljenja var2 i
var3 var1 je dodeljena vrednost var2 var1 je dodeljena vrednost
var2
Primeri su pokazani korienjem prostih numerikih tipova. Ukoliko
koristite druge proste tipove moe doi do zabune. Sta mislite da e
se dogoditi ako, na primer, saberete dve logike promenljive ? U
ovom sluaju nita, zato to e se kompajler odmah pobuniti ako,
recimo, pokuate da koristite operator + (ili bilo koji dragi
matematiki operator) sa bool promenljivama. Sabiranje dve
promenljive tipa char takoe dovodi do malog nesporazuma. Zapamtite
da se promenljive tipa char uvaju kao brojevi, pa prema tome,
sabiranje takve dve promenljive za rezultat daje broj (da budemo
precizniji, broj tipa int). Ovo je primer implicitne konverzije i o
njemu emo jo dosta govoriti, kao i o eksplicitnoj konverziji, koja
se takoe odnosi na sluajeve kada su var1, var2, i var3 razliitih
tipova.
6
Nakon ovoga, binarni + operator ima smisla koristiti sa
promenljivama tipa string. U ovom sluaju tabela treba ovako da
izgleda:Tabela 4.6. Operatori
Operator+
Kategorijabinarni
Primer izrazavar1=var2+var3;
Rezultatvar1 je dodeljena nadovezana vrednost stringova var2 i
var3
Nijedna draga matematika operacija nee raditi sa stringovima.
Ostala dva operatora koje treba da upoznamo su operatori
inkrementiranja i dekrementiranja. Oba su unarni operatori koji se
koriste na dva razliita naina: ili odmah ispred, ili odmah iza
operanda. Pogledajmo na brzinu rezultate ovih prostih izraza, pa ih
onda razmotrimo:Tabela 4.7. Operatori inkrementiranja i
dekrementiranja
Operator++ -++ --
Kategorijaunarni unarni unarni unarni
Primer izrazavar1=++var2 var1=--var2 var1=var2++ var1=var2-var1
var2 var1 var2 var1 var2 var1 var2 je je je je je je je je
Rezultatdodeljena vrednost. var2+1, uveana za 1. dodeljena
vrednost. var2-1, umanjena za 1. dodeljena vrednost var2. uveana za
1. dodeljena vrednost var2. umanjena za 1.
Kljuna stvar kod ovih operatora je da se vrednost operanda uvek
menja. ++ uvek uveava svoj 1 operand za 1, a - ga uvek umanjuje za
1. Od toga gde se operator tano nalazi, zavisi i rezultat koji je
smeten u var1. Smetanje operatora pre operanda, znai da se operand
menja pre nego to se izvre dalja izraunavanja. Ukoliko ih stavimo
posle operanda, operand se menja tek posle izraunavanja. Ovo
zahteva jo jedan primer. Razmotrite sledei kod:int var1, var2 = 5,
var3=6; var1 = var2++* --var3;
Pitanje je sledee: koja e vrednost biti dodeljena promenljivoj
var1 ? Pre nego to se izraz izrauna, operator -- e promeniti
vrednost var3 iz 6 u 5. Operator ++ koji stoji posle var2, moemo
ignorisati, jer se on nee izvriti pre nego to se obavi raunanje,
tako da e var1 biti proizvod 5 i 5, odnosno 25. Prosti unarni
operatori mogu nam koristiti u mnogim situacijama. Oni su u stvari
samo skraenica za izraze tipa:var1 =var1+ 1;
Ovaj tip izraza ima mnogo upotreba, pogotovo kada se radi o
petljama.
7
Preko sledeeg primera videemo kako da koristimo matematike
operatore i upoznaemo se sa nekim novim, korisnim konceptima.
Veba br. 3.Napravite novi projekat konzolne aplikacije birajui
File | New | Project... iz menija: Izaberite Visual C# Projects
direktorijum unutar prozora Project Types:, i tip projekta Console
Application u okviru prozora Templates: (za ovo ete morati malo da
pomerite prozor na dole). U okviru za tekst Location: promenite
putanju u C:\Temp\SoftIng\LecturesCode\Vezba3 (ovaj e direktorijum
biti automatski napravljen ukoliko ve ne postoji), i ostavite
podrazumevani tekst u okviru za tekst Name: Promenljive2 Dodajte
sledei kod u Class1.cs:
Operatori dodeljivanja
Do sada smo koristili prost operator dodele =, i moda vam je
iznenaujue da bilo koji drugi postoji. Meutim, ima ih vise i mogu
biti vrlo korisni! Svi ostali operatori dodele rade na slian nain.
Kao i kod operatora = i drugi se dre toga da se promenljiva kojoj
se dodeljuje vrednost nalazi sa leve strane, dok se operandi i
operatori nalaze sa desne strane. Kao i ranije videemo tabelarni
prikaz njihovih objanjenja:
Snimite program, i pokrenite ga.
8
Unesite vae ime i pritisnite Enter. Zatim unesite potrebne
brojeve, i pritiskajte Enter.
Kako to radi
Osim to nam prikazuje operatore, ovaj kod nam donosi dva vana
koncepta sa kojima emo se susresti mnogo puta u radnim primerima:
Korisniki unos Konverzija tipa Korisniki unos je slian komandi
Console.WriteLine (), koju smo ve videli. Ovde, meutim, koristimo
Console.ReadLine(). Ova komanda trai od korisnika neki unos, koji
smeta u promenljivu tipa string:
Ovaj kod ispisuje sadraj dodeljene promenljive, userName, pravo
na ekran. U ovom primera uitavamo i dva broja. Ovo je malo
kompleksnije, zato to Console.ReadLine() generie string, a nama
treba broj. Ovo nas uvodi u temu konverzije tipa. O ovome emo
detaljnije u kasnije, za sada pogledajmo kod iz primera. Prvo,
navodimo dve promenljive u koje treba smestiti brojeve koje
unosimo:
Sledee, ispisujemo poruku i koristimo komandu Convert.ToDouble()
na promenljivoj tipa string koju nam je vratio red
Console.ReadLine(), da bismo konvertovali promenljivu iz tipa
string u tip double. Ovaj broj dodeljujemo promenljivoj prviBroj
koju smo naveli:
9
Ova sintaksa je izuzetno prosta, a verovatno vas nee zauditi
kada saznate da se mnoge druge konverzije odvijaju na slian nain. I
drugi broj dobijamo na isti nain:
Potom na izlaz aljemo rezultate sabiranja, oduzimanja, mnoenja,
deljenja, i na kraju prikazujemo ostatak posle deljenja, koristei
operator modula (%) za to:
U oit e da su izrazi prviBroj + drugiBroj i slino, parametri
iskaza Console. WriteLine( ) , bez korienja neke posredne
promenljive:
Ovakva sintaksa omoguuje veliku itljivost koda, i smanjuje broj
redova koje moramo da napiemo.
10
Operatori dodeljivanjaDo sada smo koristili prost operator
dodele =, i moda vam je iznenaujue da bilo koji drugi postoji.
Meutim, ima ih vise i mogu biti vrlo korisni! Svi ostali operatori
dodele rade na slian nain. Kao i kod operatora = i drugi se dre
toga da se promenljiva kojoj se dodeljuje vrednost nalazi sa leve
strane, dok se operandi i operatori nalaze sa desne strane. Kao i
ranije videemo tabelarni prikaz njihovih objanjenja:Tabela 4.8.
Operatori dodeljivanja
Operator
Kategorijabinarni binarni binarni binarni binarni binarni
Primer izrazavar1=var2; var1+=var2 var1-=var2; var1*=var2;
var1/=var2; var1%=var2;
Rezultatvar1 je dodeljena vrednost var2 var1 je dodeljena
vrednost koja ini sumu v a r1 v ar2 var1 je dodeljena vrednost
razlike varl i var2 var1 je dodeljena vrednost proizvoda v a r 1 i
var2 var1 je dodeljena vrednost deljenja var1 i var2 var1 je
dodeljena vrednost ostatka deljenja var1 i var2
= += -= *= /= %=
Kao to vidite, dodatni operatori ukljuuju var1 u izraunavanje,
tako da:var1 += var2;
daje isti rezultat kao i:var1 = var1 + var2;
Upamtite da se operator += moe koristiti i sa stringovima, kao i
+. Ukoliko koristimo dugaka imena za promenljive, ovi operatori nam
mogu nainiti kod itljivijim.
Prvenstvo operatora
Kada raunar obrauje izraz, on izvrava svaki operator prema
redosledu. Meutim, to ne znai da se operatori uvek izraunavaju
sleva nadesno. Jednostavan primer je: var1 = var2 + var3; Ovde se
prvo izvrava operator + pa tek onda =. Postoje i druge situacije
kada prvenstvo izvoenja operatora nije oigledno, na primer: var1 =
var2 + var3 * var4; Ovde je redosled izvrenja sledei: prvo operator
* , zatim + i na kraju =. Ovo je standardni matematiki redosled i
daje isti rezultat kao da ste na papiru izveli neku operaciju u
algebri. Kod takvih kalkulacija, moemo odrediti prvenstvo
izvravanja koristei zagrade, na primer: var1 = (var2 + var3) *
var4;
11
Ovde se sadraj unutar zagrada izraunava prvi, to znai da e
operator + biti izvren pre operatora *. Redosled po kome se
izvravaju operatori prikazan je u tabeli dole - tamo gde su
operatori istog prioriteta (kao recimo * i /) redosled se odreuje
sleva udesno:Tabela 4.9. Prvenstvo operatora
PrvenstvoNajvii
Operator++, (korieni kao prefiksi); +, -(unarni) *, /, % +, =,
*=, /=, %=, +=, -= ++, (korieni kao sufiksi)
Najnii
Zapamtite da se redosled moe promeniti upotrebom zagrada, kako
je gore opisali
Imenovani prostori
Pre nego to nastavimo, bilo bi korisno da upoznamo imenovane
prostore - metod .NET okruenja kojim se obezbeuje kontejner koji
sadri aplikacioni kod, i to tako da i kod i njegov sadraj mogu biti
jedinstveno identifikovani. Imenovani prostori se takoe koriste i
pri kategorisanju objekata .NET okruenja. Najvei deo tih objekata
su definicije tipova, kao to su recimo prosti tipovi (System. Int32
i slino). C# kod se podrazumevano sadri u globalnim imenovanim
prostorima. To znai da se tom kodu moe pristupiti iz nekog drugog
koda koji je unutar globalnih imenovanih prostora, tako to se
navede njegovo ime. Moemo koristiti i kljunu re namespace, da bismo
eksplicitno definisali imenovani prostor u bloku koda oivienom
vitiastim zagradama. Takva imena moraju biti kvalifikovana, ukoliko
e ih koristiti kod izvan imenovanog prostora. Kvalifikovano ime je
ono koje sadri sve informacije o svojoj hijerarhiji. To znai da
ukoliko imamo kod u jednom imenovanom prostoru, koji treba da
koristi ime definisano u nekom drugom imenovanom prostoru, moramo
ukljuiti referencu na ovaj imenovani prostor. Kvalifikovana imena
koriste znak(.) izmeu nivoa imenovanog prostora. Na primer:
namespace LevelOne { //kod u imenovanom prostoru LevelOne //ime
"NameOne" definisano } //kod u globalnom imenovanom prostoru Ovaj
kod definie jedan imenovani prostor, LevelOne, kao i jedno ime u
njemu, NameOne (ovde nije upotrebljeno nita od pravog koda, da bi
bilo uopteno; umesto toga stavljeni su komentari tamo gde bi
trebale da stoje definicije). Kod napisan unutar LevelOne
imenovanog prostora, poziva ovo ime upotrebom "NameOne" - nije
potrebna nikakva druga klasifikacija, Meutim, kod u globalnom
imenovanom prostoru mora pozivati ovo ime na sledei nain:
"LevelOne.NameOne". U okviru imenovanih prostora moemo definisati
ugnedene imenovane prostore, takoe koristei kljunu re namespace.
Ugnedeni imenovani prostori se pozivaju preko svoje hijerarhije,
opet koristei taku da bi naveli svaki nivo unutar hijerarhije. Ovo
emo najbolje prikazati preko primera.
12
Razmotrite sledee imenovane prostore: namespace LevelOne { //kod
u imenovanom prostoru LevelOne namespace LevelTwo { //kod u
imenovanom prostoru LevelOne.LevelTwo //ime "NameTwo" definisano }
} //kod u globalnom imenovanom prostoru Ovde se NameTwo mora
pozivati kao "LevelOne.LevelTwo.NameTwo" iz globalnog imenovanog
prostora; ili kao "LevelTwo.NameTwo" iz imenovanog prostora
LevelOne; ili kao "NameTwo" iz imenovanog prostora
LevelOne.LevelTwo. Vano je naglasiti da su imena jedinstveno
definisana od strane njihovih imenovanih prostora. Mogli bismo
definisati ime "NameThree" u imenovanim prostorima LevelOne i
LevelTwo: namespace LevelOne { //ime "NameThree" definisano
namespace LevelTwo { //ime "NameThree" definisano } } Ovde smo
definisali dva imena, LevelOne.NameThree i
LevelOne.LevelTwo.NameThree, koja se mogu koristiti nezavisno jedno
od drugoga. Kada definiemo imenovani prostor, moemo pojednostaviti
pristup imenima koje sadre pomou iskaza using. Iskaz using znai: U
redu, trebae nam imena iz ovog imenovanog prostora, pa se neemo
muiti da svaki put navodimo njihova puna imena". Na primer, u
sledeem kodu kaemo da iz imenovanog prostora LevelOne treba da
imamo pristup imenima u imenovanom prostora LevelOne.LevelTwo bez
klasifikacije: namespace LevelOne { using LevelTwo; namespace
LevelTwo { //ime "LevelTwo" definisano } } Sada iz imenovanog
prostora LevelOne moemo pozvati ime LevelTwo.NameTwo pomou
"NameTwo".
13
Ponekad, kao u primera NameThree, ovo moe dovesti do problema sa
kolizijom istih imena u razliitim imenovanim prostorima (kada se
kod verovatno nee kompajlirati). U takvim sluajevima, moemo
definisati sinonim za imenovani prostor kao deo iskaza using:
namespace LevelOne { using LT=LevelTwo; // ime "NameThree"
definisano namesp ace Lev elTwo { } } Ovde se iz imenovanog
prostora LevelOne ime LevelOne. NameThree poziva kao "NameThree", a
ime LevelOne.LevelTwo.NameThree kao "LT.NameThree". Iskaz using
odnosi se na imenovani prostor u kome se sadri, kao i na sve
imenovane prostore ugnedene u njega. U gore navedenom kodu globalni
imenovani prostor ne moe koristiti "LT.NameThree". Meim, koristie
iskaz using, na sledei nain: using LT = LevelOne.LevelTwo;
namespace LevelOne { //ime "NameThree" definisano namespace
LevelTwo { //ime "NameThree" definisano } // ime "NameThree"
definisano
}
Tada kod u globalnom imenovanom prostora kao i u LevelOne mogu
koristiti "LT.NameThree". Ovde je vano podvui jo neto. Iskaz using
sam po sebi ne daje vam pristup imenima u drugom imenovanom
prostoru. Ukoliko kod nije na neki nain povezan sa vaim projektom
tako to je definisan u izvornoj datoteci vaeg projekta, ili ukoliko
nije deformisan unutar nekog drugog koda koji je povezan sa vaim
projektom, neemo imati pristup imenima koja sadri. Isto tako, ako
je kod koji sadri imenovani prostor povezan sa vaim projektom,
pristup imenima koje sadri je omoguen, bez obzira na to da li
koristimo using. Iskaz using nam prosto olakava pristup ovim
imenima, a moe i prilino skratiti inae dugaak kod, da bi ga
napravio razlonijim. Ukoliko se vratimo na kod u Pozdrav Svete, sa
poetka ovog predavanja, videemo sledee redove koji se odnose na
imenovane prostore:using System; namespace Pozdrav_Svete { .....
..... }
Prvi red koristi using da definie imenovani prostor System koji
e biti korien u ovom C# kodu, i moe mu se pristupiti iz svih
imenovanih prostora koji su u ovoj datoteci, bez klasifikacije.
System imenovani prostor je koreni imenovani prostor za aplikacije
.NET okruenja i sadri sve osnovne funkcionalnosti neophodne za
konzolne aplikacije.14
Zatim je deklarisan i imenovani prostor za samu aplikaciju,
Pozdrav Svete.
SaetakU ovom predavanju preli smo prilian deo terena koji se
bavi pravljenjem korisnih (ako ne i osnovnih) C# aplikacija.
Upoznali smo se sa osnovama C# sintakse i analizirali osnove koda
konzolnih aplikacija koje VS generie za nas, kada se pravi konzolni
aplikacioni projekat. Najvei deo ovog predavanja, bavi se korienjem
promenljivih. Videli smo ta su to promenljive, kako se prave, kako
im se dodeljuju vrednosti i kako se manipulie tim vrednostima.
Usput, upoznali smo se i sa osnovama interakcije sa korisnikom,
tako to smo videli kako ispisati tekst u konzolnoj aplikaciji i
kako proitati ono to nam korisnik unese. Ovo je ukljuilo samo
osnovne tipove konverzije. Takoe smo nauili kako formirati izraze
pridruivanjem operatora i operanda, i kako se ovi izvravaju i kojim
redosledom. Na kraju, upoznali smo se sa pojmom imenovanih
prostora, koji e nam kako napredujemo kroz knjigu postajati sve
vaniji. Poto vam je ova tema predstavljena prilino skraeno,
stvorena je osnova za dalje diskusije. Sve to smo do sada
programirali izvrava se red po red.
Vebe1. Kako pozvati ime veliki iz koda unutar imenovanog
prostora cudan ? namespace cudan { //kod u imenovanom prostoru
cudan } namespace super { namespace velikani { // definisano ime
veliki } } 2. Koje od navedenih imena promenljivih nije ispravno:
a) b) c) d) e) mojaPromenljivaJeDobra 99Flake _floor
time2GetJiggyWidIt tf.zr.ac.yu
15
Kontrola toka programaSav kod u jeziku C# koji smo do sada
videli ima neto zajedniko. U svakom od primera kod se izvravao red
po red, od gore ka dole, ne proputajui nita. Kada bi se svaka
aplikacija izvravala ovako, bili bismo vrlo ogranieni u onome to se
da uraditi. U ovom predavanju videemo dve metode kontrole toka
programa, odnosno redosleda izvrenja redova u C# kodu. Te dve
metode su sledee: Grananje - gde izvravamo kod uslovno, u
zavisnosti od rezultata nekog poreenja, na primer. Ovaj kod izvri
samo ako je myVal manje od 10." Petlje - ponavljanje izvrenja istih
iskaza (odreeni broj puta, dok se ne dostigne uslov koji je unapred
zadat). Obe tehnike ukljuuju korienje Bulove logike. U predavanju o
prikazu tipova videli smo tip bool, ali nismo mnogo radili sa njim.
Krenuemo od toga ta se podrazumeva pod Bulovom logikom, tako da
bismo je mogli upotrebiti u toku kontrole programa.
Bulova logika
Tip bool, moe sadrati samo dve vrednosti: true ili false. Ovaj
tip se esto koristi da bi se zabeleio rezultat neke operacije, tako
da moemo reagovati na osnovu tog rezultata. Uglavnom se tipovi bool
koriste da uskladite rezultat nekog poreenja.Istorijski, vredelo bi
seati se (i potovati) engleskog matematiara Dorda Bula, iji je rad
sredinom devetnaestog veka omoguio osnovu Bulove logike.
Kao primer, razmotrite situaciju u kojoj bismo eleli da izvrimo
kod na osnovu toga da li je promenljiva myVal manja od 10. Da bismo
ovo uradili, moramo proveriti da li je iskaz myVal je manje od 10"
istinit ili neistinit. Tanije, moramo znati logiku vrednost
rezultata tog poreenja. Logiko poreenje zahteva upotrebu logikog
operatora poreenja (koji se jo zove i relacioni operator), koji su
prikazanih u donjoj tabeli. U svim ovim sluajevima, var1 je
promenljiva tipa bool, dok tipovi promenljivih var2 i var3 mogu
biti razliiti.Tabela 5.1. Operatori dodeljivanja
Operator == != < > =
Kategorijabinarni binarni binarni binarni binarni binarni
Primer izrazavar1=var2== var3; var1=var2!= var3; var1=var2<
var3; var1=var2>var3; var1=var2= var3;
Rezultatvar1 je dodeljena vrednost true ako je var2 jednaka
var3, u suprotnom false. var1 je dodeljena vrednost true ako je
var2 nije jednaka var3, u suprotnom false. var1 je dodeljena
vrednost true ako je var2 manja od var3, u suprotnom false. var1 je
dodeljena vrednost true ako je var2 vea od var3, u suprotnom false.
var1 je dodeljena vrednost true ako je var2 manja ili jednaka var3,
u suprotnom false. var1 je dodeljena vrednost true ako je var2 vea
ili jednaka var3, u suprotnom false.
1
Moemo koristiti ove operatore na brojnim vrednostima u kodu kao
to je:bool isLessThan1O; isLessThan1O = myVal < 10; . ...
U ovom kodu bie dodeljena vrednost true promenljivoj
isLessThan1O, ako je vrednost promenljive myVal manja od 10, u
suprotnom bie dodeljena vrednost false. Ove operatore poreenja
moemo koristiti i na drugim tipovima, kao to su stringovi:bool
isPetar; isPetar =myString == "Petar";
Ovde e isPetar biti istinita samo ako myString u sebi ima string
"Petar". Takoe se moemo fokusirati i na logike vrednosti:bool
isTrue; isTrue = myBool == true;
Ipak, ovde smo ogranieni na korienje samo operatora == i !
=.Upamtite da e doi do greke u kodu ako sluajno pretpostavite da
va11>va12 mora biti true zato to je va11 maxProm) { maxProm =
intArray [i] ; maxIndex = i; } return maxProm; } Moemo koristiti
funkciju na sledei nain: int [] myArray = (1, 8, 3, 6, 2, 5, 9, 3,
0, 2); int maxIndex Console.Write("Maksimalna vrednost u nizu
myArray je {0)", MaxVrednost(myArray, out maxIndex);
Console.WriteLine{"Maksimalna vrednost niza je (0) element u nizu",
maxindex+1); Rezultat ovoga je: Maksimalna vrednost u nizu myArray
je 9 Maksimalna vrednost niza je 7 element u nizu Ovde je vano
naglasiti da se kljuna re out mora upotrebiti u pozivu funkcije, ba
kao i kljuna re ref. Upamtite daje vrednosti maxIndex dodato jedan,
i vraa se ovde dok je ispisujemo na ekran. To je zato da bismo
indeks preveli u razumljiviji oblik, tako da se prvi element u nizu
ne oznaava sa 0 ve sa 1.
12
Opseg vaenja promenljive
Moda ste se upitali zato je uopte potrebna razmena podataka sa
funkcijama. Razlog je taj to se promenljivama u C#-u moe pristupiti
samo iz lokalnih regiona koda. Za datu promenljivu kae se da ima
opseg vaenja unutar koga joj se moe pristupiti. Opseg vaenja
promenljive je vana tema i najbolje emo je predstaviti preko
primera. Definisanje i korienje osnovnih funkcija.
Veba br. 12.Napravite novi projekat konzolne aplikacije birajui
File | New | Project... iz menija: Izaberite Visual C# Projects
direktorijum unutar prozora Project Types: i tip projekta Console
Application u okviru prozora Templates: (za ovo ete morati malo da
pomerite prozor na dole). U okviru za tekst Location; promenite
putanju u C:\Temp\SoftIng\LecturesCode\Vezba12 (ovaj e direktorijum
biti automatski napravljen ukoliko ve ne postoji), i ostavite
podrazumevani tekst u okviru za tekst Name: PrimerOpsegParam.
Dodajte sledei kod u Class1.cs:
Kompajlirajte kod i obratite panju na greku i upozorenje koji se
pojavljuju u listi zadataka:
13
Kako to radiSta je krenulo loe? Promenljivoj mojString,
definisanoj u glavnom delu programa (u funkciji Main ()), nije
mogue pristupiti iz funkcije Write (). Razlog za ovu nepristupanost
jeste to to promenljiva ima svoje podruje vaenja unutar koga je
validna. To podruje podrazumeva blok koda u kom je deformisana i
bilo koje direktno ugnedene blokove koda. Blokovi koda u funkcijama
odvojeni su od blokova koda iz kojih se pozivaju. Unutar funkcije
Write() ime mojString je nedefinisano, pa je i promenljiva
mojString deformisana u funkciji Main() van opsega vaenja - ona se
moe koristiti samo u funkciji Main(). Moemo imati potpuno nezavisnu
promenljivu u funkciji Write(), nazvanu mojString. Pokuajte da
izmenite kod na sledei nain:
Veba br. 13.Napravite novi projekat konzolne aplikacije birajui
File | New | Project... iz menija: Izaberite Visual C# Projects
direktorijum unutar prozora Project Types: i tip projekta Console
Application u okviru prozora Templates: (za ovo ete morati malo da
pomerite prozor na dole). U okviru za tekst Location; promenite
putanju u C:\Temp\SoftIng\LecturesCode\Vezba13 (ovaj e direktorijum
biti automatski napravljen ukoliko ve ne postoji), i ostavite
podrazumevani tekst u okviru za tekst Name: PrimerParam2. Dodajte
sledei kod u Class1.cs:
Ovaj kod e se kompajlirati i rezultat e biti:
14
Operacije koje izvodi ovaj kod su sledee: Main() definie i
inicijalizuje promenljivu tipa string sa imenom mojString. Main()
prebacuje kontrolu na funkciju Write(). Write() definie i
inicijalizuje promenljivu tipa string sa imenom mojString, koja
nije isto to i promenljiva mojString definisana u funkciji Main().
Write() ispisuje niz znakova na konzolu koji sadri vrednost
mojString definisan unutar funkcije Write(). Write() vraa kontrolu
funkciji Main(). Main() Main(). ispisuje na konzolu vrednost koju
sadri mojString definisan unutar funkcije
Promenljive iji opseg vaenja na ovaj nain pokriva samo jednu
funkciju, poznate su kao lokalne promenljive. Takoe je mogue imati
globalne promenljive, iji opseg vaenja pokriva vie funkcija.
Izmenite kod na sledei nain:
15
Rezultat je sada:
Ovde smo dodali jo jednu promenljivu pod imenom mojString, ovaj
put na viem nivou hijerarhije imena. Ova promenljiva je definisana
na sledei nain: static string mojString; Primetiete da opet
koristimo kljunu re static. Pomenimo da u konzolnim aplikacijama,
pri navoenju globalnih promenljivih u ovom obliku, moramo koristiti
kljune rei static ili const. Ako elimo da menjamo vrednost globalne
promenljive, moramo navesti static, jer const zabranjuje menjanje
vrednosti promenljive. Da bismo napravili razliku izmeu ove
promenljive i lokalnih promenljivih istog imena u funkcijama Main()
i Write(), moramo se obratiti promenljivoj koristei puno
kvalifikovano ime. Ovde se globalnoj promenljivoj obraamo sa
Class1.mojString. To je neophodno samo kada imamo globalne i
lokalne promenljive sa istim imenom. Kada ne bi bilo lokalne
promenljive mojString, globalnu promenljivu bismo mogli
upotrebljavati jednostavno sa mojString umesto Class1.mojString.
Kada imamo lokalnu promenljivu koja ima isto ime kao i globalna
promenljiva, za globalnu se kae da je skrivena. Vrednost globalne
promenljive postavljena je u funkciju Main() sa: Class1.mojString =
"Globalni string"; A unutar funkcije Write() pristupa joj se sa:
Console.WriteLine("Globalni mojString = (0)", Class1.mojString);
Sigurno se pitate zato ne bismo ovu tehniku koristili za razmenu
podataka sa funkcijama, umesto to dodajemo parametre kako smo
ranije videli. Postoje situacije kada je ovakav nain poeljniji za
razmenu podataka, ali ih ima isto toliko (ako ne i vise) kod kojih
to nije sluaj. Izbor - da li koristiti globalnu promenljivu,
zasniva se na nainu na koji e se koristiti funkcija. Globalne
promenljive uglavnom nisu pogodne za opte namenske funkcije koje su
sposobne da rade sa bilo kojim podacima koje obezbedimo, i nisu
ograniene samo na podatke u specifinim globalnim promenljivama.
Kasnije emo detaljnije govoriti o tome.
Opseg vaenja promenljive u drugim strukturama
Jedna od stvari koju smo objasnili u prolom delu ima posledice
na opseg vaenja izvan funkcija. Opseg vaenja promenljivih ukljuuje
blok koda u kom su definisane, i bilo koje direktno ugnedene
blokove koda. To se odnosi i na druge blokove koda, kao to su
grananja i petlje. Razmotrite sledei kod:
16
Veba br. 14.Napravite novi projekat konzolne aplikacije birajui
File | New | Project... iz menija: Izaberite Visual C# Projects
direktorijum unutar prozora Project Types: i tip projekta Console
Application u okviru prozora Templates: (za ovo ete morati malo da
pomerite prozor na dole). U okviru za tekst Location; promenite
putanju u C:\Temp\SoftIng\LecturesCode\Vezba14 (ovaj e direktorijum
biti automatski napravljen ukoliko ve ne postoji), i ostavite
podrazumevani tekst u okviru za tekst Name: PrimerOpsegParam2.
Dodajte sledei kod u Class1.cs:
Ovde je promenljiva tipa string pod imenom text lokalna za for
petlju. Taj kod se nee kompajlirati zato to poziv za
Console.WriteLine(), koji se dogaa van petlje, pokuava da koristi
promenljivu text koja je izvan opsega vaenja kada je van petlje.
Pokuajte da promenite kod na sledei nain:
17
Ovaj kod takoe nee raditi zbog toga to promenljiva mora biti
deklarisana i inicijalizovana pre upotrebe, a text je
inicijalizovana samo u for petlji. Vrednost dodeljena promenljivoj
text gubi se kada se izae iz petlje. Ipak, moemo napraviti sledeu
promenu:
Promenljiva text e biti inicijalizovana van petlje pa moemo
pristupiti njenoj vrednosti. Rezultat ovog jednostavnog koda je
sledei:
Ovde je poslednja vrednost, dodeljena promenljivoj text u
petlji, dostupna i izvan petlje. U svetlu prethodnih primera, nije
odmah oigledno zato promenljiva text posle petlje ne zadrava prazan
niz zna