C#
C# (izgovor: /си шарп/), je jedan od mlađih programskih jezika. Nastao je 2000. godine kao sastavni deo Majkrosoftovog razvojnog okruženja .NET Framework 1.0. Na čelu tima koji se bavio razvojem C#-a bio je Anders Hejlsberg. C# podržava više paradigmi (objektno orijentisanu, imperativnu, deklarativnu, generičku) kao i većina modernih viših programskih jezika. Jezik je opšte primene i namenjen je izradi aplikacija za .NET Framework platformu.
C# | |
---|---|
Pojavio se | 2000. |
Autor(i) | Anders Hejlsberg |
Sistem tipova | statički |
Uticaji | C++, Java |
Istorijat
urediJanuara 1999. godine, Anders Hejlsberg osnovao je tim za izradu novog programskog jezika koji se u početku zvao Kul (eng. "C-like Object Oriented Language"), idejno zamišljen kao programski jezik C, ali objektno orijentisan.[1] Majkrosoft je hteo da sačuva prvobitno ime, ali je zbog zaštitnog znaka odustao.
U julu 2000. godine okruženje .NET predstavljeno je na Konferenciji profesionalnih programera (eng. Professional Developers Conference), jezik je preimenovan u C#, a biblioteke i ASP.NET prenesene u C#. C# predstavlja naslednika C i C++ jezika, dobio je ime šarp, inspirisano muzičkom notacijom i znači da se napisana nota izvodi za pola koraka više. Fajlovi pisani u ovom jeziku imaju ekstenziju .cs
.
Hejlsberg je glavni dizajner C#-a u Majkrosoftu, a ranije je radio i na dizajnu Turbo Paskala, Delfija i Visual J++. U mnogim intervjuima i tehničkim dokumentima on je naveo[traži se izvor] da su upravo nedostaci drugih programskih jezika (npr. C++, Java, Delphi i Smalltalk) doveli do stvaranja C#.
Džejms Gosling, koji je 1994. kreirao programski jezik Java, i Bili Džoj, suosnivač San-Majkrosistemsa (engl. Sun Mycrosistems) nazvali su C# imitacijom Jave. Tačnije, Džejms Gosling je izjavio kako je C# kao Java kojoj su isključene sigurnost, produktivnost i bezbednost.[2][3] Klaus Kreft i Angelika Langer (autori knjiga o C++-y) naveli su u svom blogu da su "Java i C# gotovo identični programski jezici. Dosadno ponavljanje bez inovacija."[4] "Teško da će neko tvrditi da su Java i C# jezici koji su promenili način na koji pišemo programe", kao i da je "C# mnogo toga pozajmio od Jave i obrnuto. Sada kada C# podržava boksing i anboksing, imamo osobine veoma slične Javi."[5] U julu 2000. Hejlsberg je rekao da C# nije "Javin klon" i da je po dizajnu bliži C++.[6]
Od izdanja C# 2.0 u novembru 2005 , jezici C# i Java počinju da se razvijaju u različitim pravcima, a sličnosti je sve manje. Jedna od bitnih razlika jeste dodavanje generika u oba jezika sa veoma različitom implementacijom. C# koristi generičke objekte prve klase (engl. first-class) koji se mogu koristiti kao i svaka druga klasa.[7] Osim toga, C# je dodao nekoliko glavnih karakteristika po kojima bi se u velikoj meri odvajao od drugih programskih jezika i približio funkcionalnom stilu. Značajne karakteristike su: podržavanje lambda izraza, metode proširenja i anonimni tipovi. Ove karakteristike omogućavaju C# programerima da koriste tehnike funkcionalnog programiranja i primenjuju ih kad god je to moguće. Link (engl. LINQ) ekstenzije i funkcionalni uvoz (eng. functional import) omogućuju programeru da piše manje koda koji se često ponavlja i koristi (npr. kod baza podataka, razdvajanje XML) fajla, pretraživanje podataka itd. stavljajući akcenat na programersku logiku kako bi se poboljšala čitljivost i održivost.[8]
C# je imao i svoju maskotu koja se zvala Endi (engl. Andy), po Andersu Hejlsbergu. Penzionisana je u januaru 2004. godine.
Verzije
urediVerzija C# 1.0
urediNajavljena je 2000. godine, a premijerno je prikazana 2002. godine od strane kompanije Majkrosoft. Bio je prvi programski jezik prilagođen za .NET Framework okruženje.
Verzija C# 2.0
urediU julu 2003. Majkrosoft je predstavio specifikaciju za C# 2.0 za početak 2004. godine. Ova verzija sadrži neke nove mogućnosti programskog jezika, od kojih je najznačajnije da su generici sada parametrizovani tipovi, mnogo više kao što su to bili C++ šabloni. Oni se implementiraju generisanjem po tipu nezavisnog bajtkoda u vremenu prevođenja (kompajliranja), a kada se u vremenu izvršenja (engl. run-time) šablon prvi put instancira za konkretan tip, tada se generiše bajtkod zavisan od tipa. Ta mogućnost daje visoko-performansne i mnogo više tipizirane generike koji ne zahtevaju mnogo izvornog koda.
Verzija C# 3.0
urediVizuelni Studio je 2008. dobio C# verziju 3.0 koja je posedovala mnogo novih funkcija. To je olakšalo programerima u pravljenju svojih aplikacija. Inovacije u verziji 3.0:
- Lambda izrazi
- Stabla
- Anonimni tipovi
- Implicitni tipovi
Verzija C# 4.0
urediPrvi put predstavljena u aprilu 2010. godine. Inovacije u verziji 4.0:
- Kasno spajanje
- Opcioni parametri
Verzija C# 5.0
urediPredstavljena u avgustu 2012. godine. Glavne novine su:
- Asinhroni članovi
- Atributi info pozivaoca
Verzija C# 6.0
urediPredstavljena u julu 2015. godine. Inovacije u verziji 6.0:
- Statički uvoz
- Filteri izuzetaka
- Ime operatora
Verzija C# 7.0
urediPredstavljena u martu 2017. godine. Novine:
- Izlazne varijable
- Torke i dekonstrukcija
- Podudaranje uzoraka
- Lokalne funkcije
Verzija C# 7.1
urediPredstavljena u avgustu 2017. godine. Podverzija sa manjim izmenama
- Asinhronost u funkciji Main
- Predeterminisani izrazi sa literalima
- Naznačeni nazivi elemenata tuple
Verzija C# 7.2
urediPredstavljena u novembru 2017. godine podverzija sa manjim izmenama:
- Referentna semantika sa vrednosnim tipovima podataka
- Prenos imenovanih argumenata
- Vodeće donje crte kod numeričkih podataka
- Modifikator privatnog zaštićenog pristupa
Verzija C# 7.3
urediPredstavljena u maju 2018. godine podverzija sa manjim izmenama:
- Lakši pristup fiksnim poljima bez
- Ponovno dodeljivanje lokalnih promenljivih pomoću rezervisane reči ref
- Korišćenje inicijalizatora na nizovima stackalloc
- Korišćenje fiksnih iskaza sa bilo kojim tipom koji podržava obrazac
- Korišćenje dodatnih generičkih ograničenja
Kakve aplikacije možemo pisati u C#-u?
urediJezik C# nema ograničenja u pogledu toga kakve sve aplikacije možemo napraviti. C# koristi okruženje i samim tim nema ograničenja u vezi sa mogućim aplikacijama. Najčešći tipovi pravljenih aplikacija:
- Vindovs aplikacije - To su recimo, aplikacije tipa Majkrosoft Ofis (eng. Microsoft Office) koje imaju izgled Vindovsa i odlično s slažu sa njim. Ovo je uprošćeno korišćenjem modula Vindovs formulara unutar .NET okruženja, koji u stvari čini biblioteka kontrola (kao što su dugmad, palete alatki, menija itd.) koje nam koristi pri izradi Vindovs korisničkog interfejsa.
- Veb aplikacije- Veb strane koje možemo videti kroz bilo koji čitač. .NET okruženje pruža veoma moćan sistem generisanja Veb sadržaja i to dinamički, dozvoljavajući personalizaciju, sigurnost i još mnogo toga.
- Veb servisi - predstavljaju nov i uzbudljiv način izrade raznovrsnih distribuiranih aplikacija. Koristeći Veb servise preko Interneta možemo razmenjivati bilo koju vrstu podataka, koristeći prostu sintaksu, ne vodeći računa o tome u kom jeziku je napisana aplikacija niti na kom sistemu je postavljena.[9]
Razlika između C# i C++
urediKod u jeziku C# je malo razumljiviji od koda C++. Jezik C# je sigurniji po pitanju dodele tipa promenljivama. To znači da ukoliko nekoj promenljivoj ili nekom podatku dodelimo određeni tip, on ne može biti zamenjen drugim tipom. Postoje stroga pravila kojih se moramo pridržavati prilikom konverzija tipova, što u suštini znači da ćemo morati da napišemo više koda u C# nego u C++-u da bismo izvršili iste zadatke. Kod je robusniji i jednostavnije je otkloniti greške, odnosno .NET u svakom trenutku može odrediti kom tipu pripada traženi podatak.
Zbog toga u C# jeziku, naredbe kao što su „uzmi deo memorije počevši od 4. bajta unutar podatka i dužine 10 bajtova i interpretiraj ga kao X”, što ne mora uvek da bude loša osobina.
Za razliku od C++, C# ne podržava višestruko nasleđivanje, iako klasa može implementirati više interfejsa.[10]
Osobine jezika
urediBitno je napomenuti da C# programski jezik sintaksno nije složen (ima oko 80 rezervisanih reči), ali je vrlo izražajan u delu gde je potrebno rešiti bilo kakav problem u procesu razvoja softvera. Pored mogućnosti koje se tiču same primene programskih jezika, bitno je napomenuti da C# podržava i sledeće:
- Direktan pristup memoriji pomoću pokazivača u stilu C++-a
- Rezervisane reči za izdvajanje nesigurnih operacija
- Upozoravanje skupljača smeća okruženja CLR(CLR) da ne uništava objekte na koje pokazuju pokazivači dok se ti objekti ne oslobode, itd.
Portabilnost
urediC# po dizajnu najbolje oslikava CLI (eng. Common Language Infrastructure).Specifikacije jezika ne zahtevaju generisanje CIL (eng. Common Intermediate Language) ili bilo kog drugog specifičnog formata, već se može kompajlirati kao i tradicionalni programski jezici C++, Fortran i drugi.
Metode
urediKao kod C++, za razliku od Jave, kod C# programeri moraju da koriste ključnu reč virtual kako bi iz podklase promenili nasleđeni metod.
Metode proširenja dozvoljavaju programerima da koriste statičke metode, s mogućnošću da dodaju metode objektu.
Ne postoje globalne promenljive niti metode. Sve promenljive i funkcije moraju biti deklarisane unutar klasa.
Pristup memoriji
urediPokazivači se mogu koristiti samo u blokovima označenim sa unsafe i potrebna je posebna dozvola za pokretanje. Većini objekata se pristupa putem sigurnih referenci koji uvek pokazuju na postojeće objekte ili imaju jasno definisanu nultu vrednost (eng. null), nemoguće je dobiti referencu na nepostojeći objekat ili na slučajni blok memorije. Memorija se ne oslobađa eksplicitno već to radi skupljač otpadaka (eng.Garbage Collector).
Izuzeci
urediTradicionalni način obrade grešaka u jeziku C jeste da funkcija vraća kod greške u slučaju da se operacija ne izvrši uspešno. Problem sa ovakvim pristupom je da programer može, slučajno ili zbog propusta da ignoriše grešku i u tom slučaju, ako je greška toliko ozbiljna, može se doći u situaciju da nastavi sa izvršavanjem i dolazi do prekida, često s rezultatima koje korisnik ne može da razume.
Izuzetak je nepredviđen ili neočekivani događaj koji sprečava program da nastavi rad. Može da bude posledica programske greške, koju prethodno nije otkrio prevodilac ili pak hardverska greška.
Obradom izuzetaka moguće je na elegantan način odgovoriti na greške. Tako izvršno okruženje CLR, umesto da dođe do prekida programa, javlja da se greška dogodila, koja se u programu može obraditi, otkloniti greška ili prekinuti program na korektan način. U slučaju da program ne obradi izuzetak, izvršno okruženje će prekinuti program.
Izuzeci i obrada izuzetaka su primarni mehanizam za otkrivanje grešaka u jeziku C#. Na raspolaganju je sintaksa strukturne obrade izuzetaka (engl. structured exception handeling - SEH). Osnovni mehanizam za hvatanje i obradu izuzetaka sastoji se od ispitnog bloka try , bloka za hvatanje izuzetaka catch i završnog bloka finally, koji se pišu između obaveznih vitičastih zagrada. Osim korišćenja sva tri blokova, moguće je koristiti i druge kombinacije, koje uključuju samo blokove try i finally, bez korišćenja bloka catch. Takođe se može koristiti blok try i jedan ili više catch blokova i u tom slučaju blok finally nije obavezan.
Tri pomenuta bloka se koriste na sledeći način:
- ispitni blok try sadrži sumnjive iskaze koji mogu da dovodu do izuzetka. Njegovo izvršavanje se završava u trenutku kada se izuzetak dogodi
- blok catch služi za hvatanje izuzetaka i njihovu obradu. Može biti podešen tako da hvata samo određen tip izuzetaka. Ovom bloku se predaje objekat izveden iz klase Exception i neophodno mu je zadati tip
- blok finally je završni postupak u obradi izuzetka i izvršava se uvek, bilo da izuzetak nije bačen, ili da je uhvaćen, pa čak i u slučaju kada zbog greške program treba da bude prekinut.
try
{
//испитни блок
}
catch (<Први_тип_изузетка>)
{
//искази за обраду првог типа изузетка
}
catch (<Други_тип_изузетка>)
{
//искази за обраду другог типа изузетка
}
catch (Exception e)
{
//искази за обраду општег типа изузетка
}
finally
{
//искази који се извршавају
}
Blok za obradu izuzetka opšte klase Exception, koji hvata sve izuzetke, se postavlja kao poslednji u nizu blokova za hvatanje izuzetaka. U slučaju da se ovaj blok postavi na bilo koje drugo mesto, osim na kraju svih blokova za hvatanje, prevodilac će prijaviti grešku.
Osim izuzetaka koje izaziva CLR, program može da baca i svoje izuzetke. Jedan od čestih slučajeva je kada se prilikom hvatanja izuzetka, u programu ponovo ubaci isti ili neki drugi izuzetak pomoću rezervisane reči throw. Izuzetak se može baciti i u slučaju neke neuspešno izvedene operacije. Da bi se bacio novi izuzetak, moguće je koristiti neku od već postojećih klasa izuzetaka, ili izvesti neku novu klasu iz klase Exception.
//пример бацања изузетка
throw (new НамеснкиИзузетак)
//пример изведене класе изузетка из класе Exception
public class НаменскиИзузетак : Exception
{
//подаци о наменском изузетку
}
Osim klase Exception postoji i veliki broj izvedenih klasa, od kojih svaka obezbeđuje informacije o grešci koja je izazvala izuzetak. Od toga su samo tri osnovne klase za specifikaciju klase izuzetaka.
klasa izuzetaka | objašnjenje |
---|---|
ApplicationException | Osnovna klasa za izuzetke u imenskom prostoru SystemApplication. Izaziva se prilikom grešaka u aplikaciji koje nisu fatalne |
IOException | Osnovna klasa za izuzetke u imenskom prostoru System.IO. Izaziva se prilikom ulazno/izlaznih grešaka |
SystemException | Osnovna klasa za izuzetke u imenskom prostoru System |
Osim obrade grešaka, po potrebi, u jeziku C# je u okviru bloka za obradu greške moguće prekinuti izvršavanje programa i za to su na raspolaganju dve metode:
- Environment.Exit(izlazniKod) — prekida program i operativnom sistemu vraća izlazniKod. Definisana je u imenskom prostoru System. Obično se koristi kod konzolnih programa
- Aplication.Exit() obaveštava sve petlje poruka da moraju prekinuti rad, zatvara sve prozore koje je otvorila aplikacija i završava rad programa, bez vraćanja izlaznog koda. Definisana je u imenskom prostoru System.Windows.Forms i obično se koristi za izlazak iz Vindovsovih aplikacija.
Polimorfizam
urediObjektno orijentisana paradigma uvodi pojam nasleđivanja, tj. izvođenja koja predstavlja mogućnost da se jedna klasa definiše na osnovu neke druge klase pri čemu će ta nova klasa da ima sve osobine koje ima i postojeća klasa, neke osobine će biti promenjene, a neke nove će biti dodate. To konkretno znači da ne moramo da prepisujemo postojeću klasu poznati "kopi-pejst" (eng. copy-paste) pristup koji se često koristi u proceduralnom programiranju i predstavlja izvor mnogih grešaka) već samo da navedemo od koje klase polazimo, odnosno koja je osnovna ili roditeljska klasa i da modifikujemo ili dodamo neke članice klase.
class класаОсновна
{
//Методе, својства и поља чланови основне класе
}
class класаИзведена : класаОсновна
{
//Методе, својства и поља чланови изведене класе
}
Izvedena klasa, uz članove koje ima osnovna klasa, pri čemu preuzima i njihove nivoe pristupa deklarisane u osnovnoj klasi.
Ne postoji višestruko nasleđivanje, odnosno svaka klasa može biti potomak samo jedne klase. Ovu odluku doneo je glavni dizajner jezika kako bi se izbegle komplikacije i pojednostavili arhitektonski zahtevi tokom CLI-ja (eng. Common Language Infrastructure).
Polimorfizam koji omogućava dopisivanje metoda, moguć je jedino preko virtuelnih metoda. Jednom kada se metoda proglasi virtuelnom, metoda u izvedenoj klasi može da ostane ista kao u osnovnoj klasi, u kojem slučaju se izvršava izvorna metoda u iz osnovne klase ili da se izmeni i izvede i na neki drugi način. Kao i u slučaju metoda, svojstva klase takođe se mogu izmeniti pomoću virtualnih svojstava osnovne klase, uvek kada je svojstvo osnovne klase nije deklarisano kao privatno, u suprotnom u izvedenoj klasi je neophodno napraviti zasebno polje.
Ako se klasa definiše kao apstraktna, onda se ona ne može koristiti direktno, odnosno članove te klase je moguće upotrebiti isključivo ako iz nje napravi izvedena klasa. Apstraktna klasa se deklariše tako što se pre rezervisane reči class i imena klase napiše apstract.
Primer deklarisanja apstraktne klase:
abstract class класаАпстрактна
{
//Чланови класе
}
Ako se pokuša deklarisati instanca apstraktne klase, prevodilac će prijaviti grešku i neće prevesti programa Da bi se sprečilo pravljenje izvedene klase od osnovne, osim korišćenja privatnih konstruktora, koji sprečavaju i samo deklarisanje njene instance, postoji i drugi način. Izvođenje klase se može sprečiti korišćenjem rezervisane reči saled (zapečaćeno), kojom se okončava lanac nasleđivanja.
Primer deklarisanja zapečaćene klase:
saled class класаАпстрактна
{
//Чланови класе
}
Tako iz zapečaćene klase nije moguće izvesti novu klasu, dok apstraktna klasa obavezuje pravljenje izvedene klasa. Modifikatore abstract y saled nije moguće koristiti zajedno. Za razliku od Jave, C# podržava preopterećenje operatera.
Omotavanje i odmotavanje
urediU C# koristi specijalan tip podataka object, koji prihvata bilo koji podatak, vrednosnog ili referentnog tipa. Kada se deklariše objekat, u dinamičkoj memoriji se rezerviše prostor za instancu promenljive, a tim podatkom upravlja izvršno okruženje. Ako se na primer promenljivoj tipa int dodeli instanca tipa object, u dinamičkoj memoriji se pravi instanca tipa int i ta referenca se dodeljuje promenljivoj tipa object.
Omotavanje (engl. Boxing) je operacija implicitnog pretvaranja promenljive u odgovarajući objekat.
Odmotavanje (engl. Unboxing) je operacija eksplicitnog pretvaranja objekta u vrednosni tip.
Primer
urediNakon što se deklariše poseban tip strukture:
struct МојаСтруктура
{
public int Вредност;
}
sa imenom MojaStruktura i koja sadrži jedan član Vrednost, ona se može smestiti u objekat tipa promenljive i pri tome se deklarisanom članu može dodeliti određena vrednost. Ova promenljiva se može smestiti u objekat, u ovom slučaju referentniTip:
МојаСтруктура промељиваТип1 = new МојаСтруктура();
промељиваТип1.Вредност = 10;
object референтниТип = промељиваТип1;
Potom se ovakva struktura smeštena u objekat može pretvoriti u novu promenljivu, pri čemu je na raspolaganju pristupanje njenom sadržaju:
МојаСтруктура промељиваТип2 = (МојаСтруктура)референтниТип;
Console.WriteLine(промељиваТип2.Вредност);
Rezultat će iznositi promeljivaTip2.Vrednost = 10;
Enkapsulacija
urediEnkapsulacija, enkapsuliranje što u prevodu znači zamotavanje je način da vi sakrijete, zaštitite i kontrolišete pristup podacima koji se nalaze u objektu. To radite tako što članovima klase odredite rang vidljivosti, tj. odredite koji su članovi klase, na primer, javni, privatni, zaštićeni ili interni.
Zbog enkapsulacije postoje metode get i set preko kojih pristupamo atributima klasa.
Konverzija podataka
urediPostoje razne konverzije, odnosno pretvaranje između različitih tipova podataka (32-bitni u 64-bitne brojeve, int u float ili string...). Prevodilac ponekad automatski dopušta implicitnu konverziju slučaju da mu je jasna priroda konverzije, ali se pri tome smanjuje preciznost. Tako je na primer promenljivoj tipa long, koja u memoriji zauzima 8 bajtova, moguće dodeliti vrednost 50 tipa int, koja zauzima 4 bajta, ali nije dozvoljeno dodeliti znakovni niz „50”, s obzirom da ne može da razume prirodu takve konverzije.
U nekim slučajevima je dozvoljena eksplicitna konverzija, kojom se prevodiocu saopštava da zaista treba izvršiti konverziju. Operatori konverzije su zapravo novi tip podatka upisan između zagrada.
Implicitna konverzija:
long вредност = 50; //имплицитна конверзија
int вредност = (long) вредност; //експлицитна конверзија
Kao eksplicitnu konverziju prevodilac će tumačiti i ako se broju doda sufiks po tipu. Tako na na primer (long) 50 je isto što i 50L, da bi se izvršila konverzija u podatak dvostruke preciznosti (double) može se napisati 50.0 ili 50D, konverzija u podatak sa pokretnim zarezom (float) će se dobiti dodavanjem sufiksa 50F. Kod korišćenja novčanih vrednosti (decimal) nije dovoljno samo dodeliti vrednost, već je izvršiti konverziju sufiksa M (od Money):
decimal вредност = 50.00M;
Za konverziju znakovnih nizova u broj, većina prostih numeričkih tipova raspolaže metodom Parse():
string низ = "50";
int вредност = int.Parse(низ);
Postoje i statičke metode za konverziju iz klase Convert:
string низ = "50";
int вредност = Convert.ToInt32(низ);
U slučaju da znakovni niz nije moguće pretvoriti u određeni brojni tip, nastaće izuzetak tipa FormatException.
Ostalo
uredi- Jezik je Case sensitive, razlikuje mala i velika slova.
Ključne reči
urediKljučne reči C# (verzija 2.0) su: abstract, as, base, bool, break, byte, case, catch, char, checked, class, const, continue, decimal, default, delegate, do, double, else, enum, event, explicit, extern, false, finally, fixed, float, for, foreach, goto, if, implicit, in, int, interface, internal, is, lock, long, namespace, new, null, object, operator, out, override, params, private, protected, public, readonly, ref, return, sbyte, sealed, short, sizeof, stackalloc, static, string, struct, switch, this, throw, true, try, typeof, uint, ulong, unchecked, unsafe, ushort, using, virtual, volatile, void и while.[11]
Primeri izvornog koda
urediPrimeri se izvršavaju na konzoli.
Primer 1
urediNa konzoli se ispisuje tekst ”Zdravo svete!”.
using System;
namespace HelloNameSpace
{
public class HelloWorld
{
static void Main()
{
Console.WriteLine("Здраво свете!");
}
}
}
Primer 2
urediNa konzoli se ispisuje tekst ”Unesite svoje ime:” i očekuje se unos teksta, koji se smešta u promenljivu ime. Nakon toga na konzoli se ispisuje tekst ”Zdravo ” i tekst koji je uneo korisnik preko konzole.
using System;
namespace HelloNameSpace
{
public class HelloWorld
{
static void Main()
{
Console.WriteLine("Унесите своје име:");
String име = Console.ReadLine();
Console.WriteLine("Здраво " + име);
}
}
}
Tipovi podataka
urediSvaki programski jezik ima elemente koji ga karakterišu i to su :
- azbuka
- rezervisane reči
- konstante
- promenljive
Azbuku programskog jezika C# čine mala i velika slova, cifre, specijalni znaci (npr. za aritmetičke operacije, relacije, itd.) i razdelnici (tačka, dvotačka, tačka zarez, itd.).
Programski jezik C# spada u grupu tipiziranih jezika. Svaka promenljiva mora da se deklariše pre upotrebe. Deklaracijom promenljive definiše se : naziv, tip, opciono njena početna vrednost i vidljivost tj. prava pristupa (ako je promenljiva članica neke klase). U okviru jedne linije koda može se deklarisati jedna ili pak, više promenljivih. Svaka promenljiva kao karakteristiku ima:
- ime
- tip
Ime promenljive je niz alfanumeričkih karaktera, pri čemu prvi znak ne može biti cifra. Specijalni znaci ne mogu biti deo imena osim znaka _ (donja crta) koji može biti i prvi znak. Mogu se koristiti mala i velika slova pri čemu se pravi razlika između malih i velikih slova.
Tip određuje: skup vrednosti, način predstavljanja u memoriji računara i skup operatora koji se mogu primenjivati.
Primer Jedan od celobrojnih tipova je tip bajt (eng. byte). Skup vrednosti koji može imati jedan podatak tipa bajt je skup celih brojeva u opsegu od -128 do 127. Za memorisanje jednog podatka tipa bajt potrebno je 8 bita. Za memorisanje jednog podatka tipa int (eng. int) potrebno je 4 bajta, odnosno 32 bita. Operacije koje su dozvoljene nad podacima tipa int su aritmetičke operacije (sabiranje, oduzimanje, množenje i deljenje).
Tipovi podataka se mogu podeliti na dve velike grupe:
- Vrednosni tipovi:
- Strukture
- Numerički tipovi podataka predstavljaju .
- cele brojeve
- sbyte — neoznačeni bajt
- byte — označeni bajt
- char — unikod znak
- short — kratak ceo broj
- ushort — neoznačeni kratak ceo broj
- int — osnovni celobrojni tip
- uint — neoznačeni celobrojni tip
- long — označeni duži celobrojni tip
- ulong — neoznačeni duži celobrojni tip
- Tipovi sa pokretnim zarezom predstavljaju realne brojeve.
- float
- double dvostruke preciznosti
- Realni broj zadate preciznosti
- decimal - obično se koristi u računskim operacijama nad novčanim vrednostima
- cele brojeve
- Logički tipovi imaju samo dve vrednosti:logička istina tj.tačno i logička neistina, odnosno netačno.
- bool
- Korisnički definisani tipovi
- Numerički tipovi podataka predstavljaju .
- Nabrojivi tipovi - enumeratori
- Strukture
- Referentni tipovi:
- class
- interface
- delegate
- object
- string[12]
Celobrojni podaci
ureditip | imenski prostor.klasa | dozvoljene vrednosti |
---|---|---|
sbyte | System.SByte | celobrojna od –128 do 127 |
byte | System.Byte | celobrojna od 0 do 255 |
short | System.Int16 | celobrojna od –32.768 do 32.767 |
ushort | System.UInt16 | celobrojna od 0 do 65.535 |
int | System.Int32 | celobrojna od –2.147.483.648 do 2.147.483.647 |
uint | System.UInt32 | celobrojna od 0 do 4.294.967.295 |
long | System.Int64 | celobrojna od –9223372036854775808 do 9223372036854775807 |
ulong | System.UInt64 | celobrojna od 0 do 18.446.744.073.709.551.615 |
Latinično slovo u je skraćenica od engleskog unsigned i odnosi se na brojeve koji se pišu bez znaka (neoznačeni tip), odnosno na pozitivne brojeve.
Podaci sa pokretnim zarezom
ureditip | imenski prostor.klasa | format | min m | maks m | min e | maks e |
---|---|---|---|---|---|---|
float | System.Single | +/−m × 2e | 0 | 224 | -149 | 104 |
double | System.Double | +/−m × 2e | 0 | 224 | -1075 | 970 |
decimal | System.Decimal | +/−m × 10e | 0 | 224 | -28 | 0 |
Nabrojive vrednosti
urediNabrojive vrednosti mogu da se odnose na samo jednu vrednost ili na skup vrednosti. Kada se napravi nabrojiva lista, onda vrednosti nije potrebno pamtiti, već se njima pristupa po imenu. Nabrojive liste nije moguće menjati nakon dodele vrednosti.
Deklarišu se pomoću rezervisane reči enum iza koje sledi identifikator za nabrojivu listu, na koju se nadovezuju dvotačka (:) i tip. Identifikatori se unutar vitičastih zagrada i razdvojeni su zarezima. Dozvoljeni tipovi za nabrojive liste su byte, sbyte, short, ushort, int, uint, long o ulong. Primer:
Sledeća deklaracija definiše nabrojivu listu koja počinje sa Brojevi.nula koja ima vrednost 0, a završava se sa Brojevi.tri koja ima vrednost 3, i svi imaju format long.
enum Бројеви : long
{
нула, један, два, три
}
Nabrojive vrednosti standardno počinju nulom i uvećavaju se za jedan, ali postoji mogućnost i dodele bilo kom članu bilo koje druge vrednosti, dok uvećanje članova za jedan ostaje:
enum Бројеви : long
{
нула, три = 3, десет = 10, једанаест, двадесет = 20
}
Mada se nabrojivoj listi pridružuje osnovni tip, elementi liste pripadaju novom tipu podataka, zbog čega je upotrebljene vrednosti neophodno eksplicitno konvertovati u osnovni tip:
int и = (int) Бројеви.три;
Nabrojivi tip se može deklarisati unutar ili van klase, ali u svakom slučaju lista postaje javna i može je koristiti bilo koja klasa koja ima pristup njenom imenskom prostoru. Pristup nabrojivim listama je isti kao i pristup promenljivama i funkcijama. Ako klasa sadrži nabrojivi tip, sve klase koje su izvedene iz nje nasleđuju nabrojivu listu, koju mogu redefinisati i menjati pomoću rezervisane reči new. Redefinisanje nabrojive liste ne menja listu osnovne klase, niti njen kod ili kod bilo koje izvedene klase.
Strukture
urediStrukture (engl. structure) su jedan od najstarijih i najpoznatijih mehanizama za rad s podacima u modernom programiranju. Postojale se u i pre nego što se pojavilo objektno orijentisano programiranje. Podržava ih većina programskih jezika, a pojavljivale su se i pod drugim imenima, na primer kao slogovi (engl. record) ili kao blokovi (engl. block).
Strukture predstavljaju kolekciju polja podataka različitih tipova, kojima se može pristupiti pojedinačno ili na nivou grupe. Strukture omogućavaju da se jednim potezom sačuva grupa međusobno povezanih podataka ili prenese kao argument prilikom pozivanja funkcije.
Struktura može da sadrži konstruktor, pri čemu lista parametara konstruktora ne može biti prazna, ali ne i destruktor, s obzirom da ga nasleđuje i ne može biti redefinisan.
Koristi se kao alternativa klasama kada objekat sadrži uglavnom podatke. Nad njima je moguće primeniti operatore dodele, koji direktno kopiraju polja u strukturi, za razliku od klasa kojima se dodeljuje referenca, ali ne i sadržaj. Kada se u strukturama jedna promenljiva dodeljuje drugoj, vrednost prve se kopira u druge, posle čega oni postaju nezavisni i izmena sadržaja jedne strukture, ne utiče na vrednost druge. Kod klasa promenljive ukazuju na isti objekat, tako da izmena vrednosti jedne utiče na drugu.
Strukture se de finišu uz pomoć rezervisane reči struct, kojoj se prethodno mogu dodeliti rezervisana reč internal, kojom se pristup definiciji strukture ograničava na tekući model. Ako je struktura definisana u klasi, može se dodeliti bilo koja rezervisana reč za pristup. Iza rezervisane reči struct piše se ime identifikatora. U principu ne postoji konvencija za ime, ali programeri obično ime strukture pišu velikim slovima, kako bi se razlikovale od klasa. Iza imena strukture mogu se dodati ime identifikatori za interfejs, razdvojenih zarezima u slučaju da ih ima više. Telo strukture se piše između vitičastih zagrada, između kojih se deklarišu njeni članovi.
S obzirom da je struktura tip podataka, ona može biti deklarisana i kao povratni tip funkcije. Strukture su posebno pogodne kada funkcija treba da vrati više vrednosti.
Struktura može da sadrži i instance drugih struktura, pa čak i klasa, ali ne i sopstvenu instancu jer bi to dovelo do beskonačno rekurzivne definicije.
Primer:
Sledeća struktura definiše strukturu TAČKA koja bi se mogla upotrebiti u drugoj strukturi PRAVOUGAONIK, gde se definišu njegova naspramna temena, čime je pravougaonik potpuno definisan:
struct ТАЧКА
{
int осаИкс;
int осаИпсилон;
}
struct ПРАВОУГАОНИК
{
ТАЧКА ГорњиЛеви;
ТАЧКА ДоњиДесни;
}
Instanca strukture je objekat vrednosnog tipa i sa njom se radi kao i sa bilo kojom drugom promenljivom vrednosnog tipa. Ako se struktura upotrebi kao povratni tip za funkciju program kopira ceo sadržaj strukture.
Kada se struktura koristi u promenljivama referentnog tipa neophodno je izvršiti njenu inicijalizaciju, prilikom formiranja instance. Za promenljive vrednosnog tipa postoji podrazumevani konstruktor koji svim članovima dodeljuje vrednost 0. Ako se instanca strukture deklariše pomoću operatora new, poziva se ovaj konstruktor. Podrazumevani konstruktor je uvek dostupan za sve vrednosne tipove i ne može se redefinisati kod struktura, ali je strukturi moguće dodati druge konstruktore.
static public void Main()
{
ТАЧКА т = new ТАЧКА();
УпотребиСтруктуру(ref т);
}
static public void УпотребиСруктуру(ref ТАЧКА т)
{
т.осаИкс = 10;
т.осаИпсилон = 20;
}
Iz jedne strukture nije moguće izvoditi drugu strukturu, niti struktura može da nasleđuje druge strukture. Strukture su izvedene iz klase Object i nasleđuju njene metode, čiji podrazumevani konstruktor ne može da biti redefinisan, ali su drugi konstruktori mogu redefinisati.
Redefinisanje neke funkcije podrazumeva pisanje nove funkcije koja nosi isto ime i istu listu parametara kao i natklasa. Redefinisanje se vrši uz pomoć rezervisane reči override u definiciji objekta, dok funkcija u natklasi mora biti deklarisana kao virtuelna.
Klasa Object sadrži metodu ToString(), koja ispisuje puno ime objekta, ova funkcija spada u funkcije koje se mogu redefinisati, tako da se može izmeniti način na koji se dobija ime strukture.
Da bi se pristupilo poljima strukture, ona se moraju označiti kao javna (public). Podrazumevani pristup poljima je inače privatan, što znači da im mogu pristupiti metode članice strukture. Nad vrednostima polja moguće je definisati jednu ili više operacija nad vrednostima polja. U tom slučaju se strukturi dodaju nova svojstva (engl. property). Svojstva se ponašaju isto kao i polja, s tom razlikom što se za rad s njima koriste posebne funkcije get i set. Njima se obezbeđuje bezbedan pristup privatnom polju.
Operatori
urediTipom podataka je između ostalog određen i skup operatora koji mogu da se koriste nad podacima datog tipa. Operatori se mogu klasifikovati po više kriterijuma. Najčešće se koristi klasifikacija na osnovu broja operanada i klasifikacija u odnosu na vrstu izraza u kojima se koriste. Po prvoj klasifikaciji operatori mogu biti :
- unarni,
- binarni,
- ternarni.
Unarni operatori su operatori koji imaju samo jedan operand. Takav je na primer operator negacije.
Binarni operatori se primenjuju nad dva operanda i oni su najčešći. Primer binarnih operatora su operatori za sabiranje, oduzimanje, množenje itd.
Ternarni operator ima tri operanda i u programskom jeziku C# postoji samo jedan takav operator (taj operator je operator „?:” koji će naknadno biti opisan).
Po drugoj klasifikaciji operatori se mogu podeliti na:
- aritmetičke(numeričke),
- logičke,
- relacijske,
- operatore za rad sa tekstualnim podacima.
Aritmetički operatori
urediAritmetički operatori su :
- +(sabiranje)
- -(oduzimanje)
- *(množenje)
- /(deljenje)
- %(ostatak celobrojnog deljenja — moduo)
Logički operatori
urediLogički operatori su:
- ! -negacija
- ||-logičko "ili"
- &&-logičko "i"
Operatori poređenja
urediOperatori poređenja ili relacijski operatori su:
- == — ekvivalencija, odnosno jednakost
- != — neekvivalencija, odnosno različito ili nejednakost
- < — manje
- > — veće
- <= — manje ili jednako
- >= — veće ili jednako
Rezultat je logičkog tipa i može imati vrednosti tačno (engl. true) ili netačno (engl. false).
Uslovni operatori
urediUslovni operatori na C# jeziku vrše poređenje isključivo dve vrednosti logičkog tipa. Za razliku od nekih drugih programskih jezika, nije moguće porediti bilo kakve brojne vrednosti, osim logičkih.
Primer
urediNa C++ moguće je porediti brojne vrednosti a i b:
if (а && б)
исказ;
dok će takav iskaz na C# prijaviti grešku. Zbog toga je za operande koji nisu logičkog tipa, neophodno napisati kod koji će se prilagoditi logičkom tipu:
if ((а!=0) && (б!=0))
исказ
Ternarni uslovni operator ?:
urediNa C# ima samo jedan ternarni uslovni operator, koji dodeljuje promenljivoj jednu od zadatih vrednosti, zavisno od uslova. Ovaj ternarni operator dodeljuj uslov iza kojeg sledi znak pitanja, a zatim izraz koji se izvršava u slučaju da je rezultat rezultat tačan, pa potom izraz koji se izvršava u slučaju da uslov nije tačan:
променљива = услов ? : израз1 : израз2;
U prethodnom iskazu, promenljiva dobija vrednost prvog izraza (izraz1) u slučaju da je uslov tačan, a ako je uslov netačan, dodeljuje se vrednost drugog izraza (izraz2). Osim toga tip promenljive i tip rezultata koji se dobija iz jednog i drugog izraza moraju biti isti.
Operator ??
uredi(engl. null-coalescing) operator ispituje uslov gde je vrednost prazna, odnosno jednaka null. Izraz vraća vrednost levog operanda u slučaju da ona nije prazna, u suprotnom vraća desni operand. Da bi se mogao koristiti ovaj operator potrebno je pretpostaviti da vrednost operanda može biti prazna.
Primer:
могућаПразнаВредност ?? вредностАкоЈестеПразна
Operator je moguće upotrebiti i više puta u istom izrazu.
Primer:
return вредност1 ?? вредност2 ?? вредност3;
Operacija se završava čim se dodali neka vrednost koja nije prazna ili ako se dođe do poslednje vrednosti, koja može ali ne mora biti prazna.
Bit operatori
urediOperatori za rad sa bitovima su:
- ~ — negacija na nivou bita
- & — I na nivou bita
- | — Ili na nivou bita
- ^ — ekskluzivno ili na nivou bita
- << — pomeranje ulevo
- >> — pomeranje udesno
Tekstualni operatori
urediTekstualni operator je konkatenacija u oznaci + i predstavlja nadovezivanje drugog operanda na prvi operand.
Operator dodeljivanja
urediPored prethodno navedenih operatora koji se najčešće koriste, postoje i drugi operatori kao što su operatori dodele, operatori za inkrementiranje, operatori za dekrementiranje, ternarni operator itd.
Osnovni operator dodele je =. U opštem slučaju operator dodele se koristi na sledeći način:
promenljiva=izraz
Najpre se izračunava izraz, a zatim se izračunata vrednost izraza dodeljuje promenljivoj, pri čemu tipovi izraza i promenljive moraju da se slože.
Pored osnovnog operatora dodele postoje i složeni oblici operatora dodele koji imaju opšti oblik
operator= gde je operator bilo koji aritmetički operator.
Operator | primer | rezultat |
---|---|---|
= | a = b | promenljivoj a se dodeljuje vrednost promenljive b |
+= | a += b | promenljivoj a se dodeljuje suma vrednosti promenljivih a i b (a = a + b) |
-= | a -= b | promenljivoj a se dodeljuje razlika vrednosti promenljivih a i b (a = a - b) |
*= | a *= b | promenljivoj a se dodeljuje vrednost množenja promenljivih a i b (a = a * b) |
/= | a /= b | promenljivoj a se dodeljuje vrednost deljenja promenljive a sa b (a = a / b) |
%= | a %= b | promenljivoj a se dodeljuje vrednost ostatka pri deljenju a sa b (a = a % b) |
Napomena : operatori dodeljivanja = i += se mogu koristiti i kod tekstualnih promenljivih, a operator %= je dozvoljeni isključivo nad celobrojnim operandima.
I pored toga što se u sledećim iskazima:
а = а + 12;
а += 12;
dobija isti rezultat, između njih postoji velika razlika. U prvom iskazu, program će dva puta učitati promenljivu, prvi put pre izvršavanja prvog izraza, pri čemu će napraviti njegovu privremenu kopiju, a drugi put neposredno pre izvođenja dodele kada će sabiranje izvršiti nad kopijom, dok će u drugom slučaju učitavanje promenljive izvršiti samo jednom.
Mada razlika izgleda nebitna, ona se posebno može primetiti u sledećem primeru;
int и = 0;
int [] низ = new int [10];
while (и < 10)
{
низ[и++] += 50;
}
Ako bi umesto:
низ[и++] += 50;
napisali:
низ[и++] = низ [и++] + 50;
vrednost brojača i bi se uvećao dva puta.
Nad bitovima celobrojnih operanda moguće je primeniti i sledeće složene operatore dodeljivanja:
Operator | primer | operacija |
---|---|---|
&= | a &= b | konjukcija nad bitovima vrednosti promenljive a i promenljive b |
= | a != b | disjunkcija nad bitovima vrednosti promenljive a i promenljive b |
^= | a ^= b | isključiva disjunkcija nad bitovima vrednosti promenljive a i promenljive b |
>>= | a >>= b | pomera bit u vrednosti promenljive a udesno b puta |
<<= | a <<= b | pomera bit u vrednosti promenljive a ulevo b puta |
Operatori inkrementiranja i dekrementiranja
urediOperatori inkrementiranja u oznaci ++ i dekrementiranja u oznaci -- mogu biti prefiksni i postfiksni. Operator inkrementiranja povećava vrednost operanda za jedan, a operator dekrementiranja smanjuje vrednost operanda za jedan i to bez obzira da li su prefiksni ili postfiksni. Razlika se uočava jedino kada su ovi operatori deo nekog složenijeg izraza. U tom slučaju se operatori inkrementiranja i dekrementiranja, ako su u prefiksnom obliku izvršavaju pre računanja vrednosti izraza, za razliku od slučaja kada se javljaju u postfiksnom obliku kada se izvršavaju tek nakon izračunatog izraza. Jednostavno rečeno, ako se u nekom izrazu operatori inkrementiranja i dekrementiranja javljaju u prefiksnom obliku vrednost izraza se izračunava sa novim vrednostima operanada nad kojim se primenjuju ovi operatori, odnosno u slučaju postfiksnih operatora izraz se računa sa starim vrednostima operanada.
Operator | izraz | rezultat |
---|---|---|
++ | ++a | promenljiva a se uvećava za 1 (a = a + 1). |
-- | --a | promenljiva a se umanjuje za 1 (a = a - 1). |
++ | a++ | promenljiva a se uvećava za 1 (a = a + 1). |
-- | a-- | promenljiva a se umanjuje za 1 (a = a - 1). |
++ | a = ++b | promenljivoj a se dodeljuje vrednost b + 1. Promenljiva b se uvećava za 1 (b = b + 1). |
-- | a = --b | promenljivoj a se dodeljuje vrednost b - 1. Promenljiva b se umanjuje za 1 (b = b - 1). |
++ | a = b++ | promenljivoj a se dodeljuje vrednost b, nakon čega se promenljiva b uvećava za 1 (b = b + 1). |
-- | a = b-- | promenljivoj a se dodeljuje vrednost b, nakon čega se promenljiva b umanjuje za 1 (b = b - 1). |
Primer 1
urediNakon obavljenih operacija:
int а, б = 5, в = 6;
а = б++ * --в;
promenljive će imati sledeće vrednosti:
а = 25 б = 6 в = 5
Primer 2
urediI pored toga što prevodilac C# ignoriše višak razmaka, u slučaju složenih operatora, razdvajanje simbola razmacima može dovesti do prijave greške ili pogrešnog tumačenja, sa neželjenim rezultatima. Kada su upitanju operatori inkrementiranja i dekrementiranja, u prefiksnom obliku, prevodilac neće prijaviti grešku, ali će ih protumačiti kao dvostruku primenu unarnog operatora
int а, б = 5;
а = + +б;
Rezultat:
а = 5; б = 5;
U slučaju sufiksnog oblika sa razmacima prevodilac će prijaviti grešku zbog nedostatka operanda na desnoj strani.
int а, б = 5;
а = б+ +;
Rezultat:
нема резултата пријављује се грешка
Operatori nad tipovima
urediKako je C# jezik sa strogom proverom tipova, u njemu je pomoću refleksije, tokom izvršavanja programa moguće odrediti stvarni tip podataka. Operacije za određivanje tipova omogućene su zahvaljujući klasi System.Type.
Operator tipeof vraća tip objekta kao promenljivu te klase, a informacije o članovima objekta moguće je dobiti bez instanciranja te klase.
Operator is proverava da li je moguće neki objekat konvertovati u određeni tip, što može biti posebno korisno u metodama za obradu događaja, kao što su Vindousove kontrole, kod kojih je pošiljalac (engl. sender) najčešće tipa object.
Operator sizeof
urediKoristi se za čitanje veličina podataka u bajtovima isključivo vrednosnih tipova podataka. Može se primeniti i kod struktura, ukoliko ne sadrže članove referentnog tipa, odnosno ne sadrže promenljivo tipa string ili niz.
Primer:
namespace Величине
{
using System;
struct Тестирање
{
int и;
double д;
char к;
};
class ГлавнаКласа
{
static public unsafe void Main()
{
Console.WriteLine("Величина булеановог типа " + sizeof(bool));
Console.WriteLine("Величина карактера је " + sizeof(char));
Console.WriteLine("Величина целобројног типа је " + sizeof(int));
Console.WriteLine("Величина означеног целобројног типа је " + sizeof(long));
Console.WriteLine("Величина типа двоструке прецизности је " + sizeof(double);
Console.WriteLine("Величина структуре за тестирање је " + sizeof(Тестирање));
}
}
}
Izrazi
urediSintaksno ispravna kombinacija operanada i operatora predstavlja jedan izraz. Izraz, tačnije rečeno vrednost izraza, takođe ima svoj tip koji može da bude jedan od standardnih tipova (celobrojni, realni, logički,...).
Primer izraza: alfa - 3 * pom + beta Ako se u jednom izrazu pojavi više operatora postavlja se pitanje kojim redosledom će oni biti primenjivani, odnosno izvršavani. Svaki operator ima svoj prioritet. Redosled primene operatora zavisi od prioriteta operatora koji se sreću u jednom izrazu. Ako imamo više operatora istog prioriteta onda se u nekim slučajevima oni primenjuju sleva udesno tj. onako kako se pojavljuju u izrazu. Pored poznavanja načina funkcionisanja operatora treba znati i prioritet operatora i redosled izvršavanja ako se javi više njih uzastopno.
Ako eksplicitno želimo odgovarajući redosled izvršavanja operatora, onda koristimo zagrade. U opštem slučaju se najpre primenjuju oni operatori koji se nalaze u zagradama. Ako imamo slučaj ugnježdenih zagrada onda se najpre primenjuju najdublje zagrade.
Prioritet operatora
urediSvi operatori imaju svoj prioritet. Kompajler izvršava neki izraz u kome postoji više operatora u redosledu koji se određuje na osnovu prioriteta operatora i mesta njihovog pojavljivanja u izrazu. Neki operatori imaju isti prioritet, odnosno svi operatori se mogu svrstati u kategorije. Prioritet ovih kategorija (od najvišeg ka najnižem) je sledeći :
- osnovni operatori (pristup polju, poziv metode, pristup indeksu, postinkrementiranje, postdekrementiranje,"new","typeof","sizeof")
- unarni operatori
- aritmetički (množenje, deljenje, ostatak pri deljenju)
- sabiranje i oduzimanje
- pomeranje na nivou bita(pomeranje ulevo i pomeranje udesno)
- relacioni operatori
- jednakost (jednako ili različito)
- I na nivou bita
- ekskluzivno ILI na nivou bita
- ILI na nivou bita
- logičko I
- logičko ILI
- ternarni operator
- operator dodeljivanja
Iskazi
urediIskaz je najmanja jedinica programskog jezika. Iskazi mogu biti prosti ili složeni. Prost iskaz se završava tačkom i zarezom ”;”, dok se složeni iskazi pišu unutar vitičastih zagrada između kojih može stajati proizvoljan broj iskaza. Složeni iskazi se često koriste u petljama ili uslovnim izrazima.
Iskazi mogu da se pišu u više redova pri čemu se oznake za kraj reda ignorišu. Takođe je moguće napisati više iskaza u istom redu.
Deklarisanje i korišćenje promenljivih
urediPromenljiva u programiranju označava imenovanu memorijsku lokaciju koja je podobna za skladištenje određenog podatka. U svakom trenutku izvršenja programa ona sadrži tačno određenu vrednost koja se u svakom trenutku može zameniti drugom vrednošću. Smeštanje vrednosti i operacije nad promenljivama njima zavisi od tipa. C# je jezik sa strogom proverom tipova podataka, što znači da se promenljivoj mora dodeliti tip pre nego što se upotrebi u programu, jer je prevodiocu neophodno da zna koliko će memorije zauzeti za svaku promenljivu. Osim toga, da bi se promenljiva upotrebila u programu, neophodno je da joj bude dodeljena neka vrednost, a deklarisanje tipa i dodela vrednosti mogu se izvršiti u istom koraku.
U sledećem primeru se koristi promenljiva „naslov” koja se deklariše kao referentni tip string i kojoj se istovremeno dodeljuje vrednost ”Uvod”:
string наслов = "Увод”
Console.WriteLine("Прво поглавље књиге гласи " + наслов);
Uz pomoć operatora + su spojene niske tipa konstante i tipa promenljive, koje se štampaju na izlaznoj konzoli štampaju sledeći rezultat:
Прво поглавље књиге гласи Увод
Isti rezultat se može dobiti korišćenjem metodom interpolacije, odnosno korišćenjem specijalnog simbola dolar $ ispred navodnika i umetanjem promenljive između vitičastih zagrada {}, kako bi interpretator (računarstvo) u tekstu na izlazu zamenio naziv promenljive njenom vrednošću:
string наслов = "Увод”
Console.WriteLine($"Прво поглавље књиге гласи {наслов}”);
Interpolacija niski je karakteristika C# od verzije 6. i omogućava čitljiviju i udobniju sintaksu za rad sa niskama.
Referentni tipovi podataka
urediReference omogućavaju indirektan pristup objektu, često se nazivaju i alijasi, jer se uvek odnose na na postojeći objekat. Referenca se mora inicijalizovati prilikom deklarisanja, a objekat koji referencira se ne može promeniti.
Promenljive referentnog tipa čuvaju reference na objekte klasa, nizove, delegate i interfejse. Članovima objekata se pristupa uz pomoć operatora (.) tačka.
Klase
urediOsnovni mehanizam putem kojeg C# ostvaruje principe objektivno orijentisanog programiranja su klase. Kao objektivno orijentisan programski jezik, zahteva se postojanje makar jednog objekta, odnosno klase, koja sadrži kod programa. Klasa služi kao kontejner za podatke (kao što su polja i konstante) i funkcije.
Klasu definiše rezervisana reč class, iza koje sledi identifikator, odnosno ime klase iza kojeg slede vitičaste zagrade. Unutar klase se definišu promenljive i funkcije koji predstavljaju njene članove.
class имеКласе
{
//следе променљиве и методе који су чланови класе
}
Većina bibliotečkih klasa se nalazi u imenskom prostoru System. Da bi se moglo pristupiti objektu u tom imenskom prostoru potrebno je napisati kompletno ime objekta. Tako na primer, da bi se pristupilo klasi Console u imenskom prostoru System, potrebno je koristiti ime System.Conslole. Primer pozivanja funkcije WriteLine() u klasi Console:
class clsMain
{
static public void Main()
{
System.Console.WriteLine("Здраво свете");
}
}
Ova sintaksa se može skratiti upotrebom rezervisane reči using, kojom se prevodiocu ukazuje na pristup određenom imenskom prostoru u kome treba da pronađe određeni identifikator. Primer:
using System;
class clsMain
{
static public void Main()
{
System.Console.WriteLine("Здраво свете");
}
}
Rezervisana reč using mora stajati van klase, u suprotnom će prevodilac prijaviti grešku.
Nizovi
urediNiz je grupa promenljivih istog tipa, kojima se pristupa pomoću indeksnog broja. Deklarisanjem i prijavljivanjem nizova se zapravo stvara instanca klase System.Array, koja se bavi dodeljivanjem memorije za članove niza. Njen konstruktor je zaštićen, nije moguće instancirati je, već se to čini prilikom deklaracije u skladu sa različitim pravilima.
Niz se deklariše tako što se prvo napiše tip podatka, iza koga slede uglaste zagrade, pa identifikator niza. Instanca niza se pravi pomoću operatora new, iza koga sledi tip podatka i veličina niza smeštena između uglastih zagrada.
int [] низ;
низ = new int [5];
Postoji mogućnost da se niz deklariše i formira u istom programskom redu;
int [] низ = new int [5];
Indeks prvog elementa niza je uvek 0 (i ne postoji mogućnost indeksiranja koji počinje od broja 1), a broj indeksa poslednjeg elementa je za jedan manji od broja članova niza. Opseg niza se proverava i u slučaju pristupa nepostojećem članu niza nastaje izuzetak IndexOutOfFange.
Klasa System.Array ima nekoliko metoda za sortiranje i pretraživanje niza. Za pretraživanje određene vrednosti elementa niza koristi se metoda Indexof(), koja vraća indeks prvog elementa zadate vrednosti, dok metoda LastIndexOf() vraća indeks poslednjeg elementa u kome se pojavljuje zadata vrednost. Obe metode su statičke i vraćaju vrednost -1 u slučaju da tražena vrednost ne postoji u nizu. Postoji mogućnost zadavanja početne pozicije.
Za sortiranje se koristi metoda Sort(), koja elemente niza uređuje od najmanje do najveće vrednosti, odnosno rastućem redosledu. Postoji i metoda za obrtanje redosleda elemenata Reverse(), koja elemente niza ređa po opadajućem redosledu, nakon što su oni prethodno poređani po rastućem redosledu. Primer:
int [] низ = new int [5]{30, 5, 8, 21, 6};
Array.Sort(низ);
foreach (int члан in низ)
{
Console.Write(члан + " ");
}
Array.Reverse(низ);
foreach (int члан in низ)
{
Console.Write(члан + " ");
}
Rezultat:
5 6 8 21 30 30 21 8 6 5
Nizovi se mogu kopirati pomoću metode Copy(), pri čemu kopiraju elementi jednog niza u drugi. Moguća je i implicitna konverzija tipova, na primer niz tipa int u niz tipa double. Ako se pokuša kopiranje niza tipa double u niz tipa int, prevodilac neće prijaviti grešku, ali će prilikom izvršavanja programa nastati izuzetak tipa ArrayTypeMismatchException.
Prilikom kopiranja nije neophodno kopirati ceo niz, već samo određen broj elemenata. Postoje dve verzije metode kopiranja:
Array.Copy(извор, одредиште, број);
gde je potrebno navesti izvorišni i odredišni niz, kao i broj elementa koji se kopiraju, počevši od prvog elementa niza. Drugi oblik je
Array.Copy(извор, почетакИзвора, одредиште, почетакОдредишта, број);
u kome se navode početne pozicije za kopiranje. Niz je moguće napraviti od bilo kog tipa podataka, uključujući strukture i klase. To znači da niz može sadržati metode, svojstva i polja. Primer:
класа [] низ = new класа[10];
Međutim, da bi se mogli urediti nizovi u rastuće i opadajuće, neophodno je realizovati interfejs IComparable koji će sadržati metodu CompareTo(). U slučaju da se ne realizuje IComparable sa metodom za poređenje, metoda Sort() izaziva izuzetak tipa InvalidOperationException.
Indekseri
urediOsim što klase mogu da formiraju deo niza, one mogu da se koriste za upravljanje nizom. U tom slučaju se koriste indekseri, koji omogućavaju da objekat klase sadrži druge objekte koji mogu biti indeksirani, tako da se tretira kao da je niz, mada on to nije. Na primer, kod klasa za baze podataka objekat upravlja redovima u tabelama i omogućuje učitavanje njihovih kolona.
Indekseri se deklarišu na isti način kao i svojstva, upotrebom sintakse this [], zbog čega su indekseri uvek članovi instance. Potreban im je najmanje jedan parametar, a mogu ih imati i više i mora imati povratni tip. Deklaracija počinje zadavanjem nivoa pristupa, zatim povratnog tipa, koji ne može biti void, iza kojeg sledi rezervisana reč this, a za njom parametri između uglastih zagrada. Nakon uglastih slede vitičaste zagrade, a između njih obavezno moraju da stoje metode get ili set ili obe.
Primer:
public int this[int индекс]
{
get
{
//код за реализацију методе за приступ get
}
set
{
//код за реализацију методе за приступ set
}
}
Indeksere je u Vizaul Studiju moguće kreirati uz pomoć čarobnjaka za indeksere (engl. Indexer Wizard).
Interfejsi
urediInterfejs je potpuno apstraktna klasa i svi njegovi članovi su implicitno apstraktni i javni. Interfejs ne može da sadrži polja. Nije moguće direktno napraviti instancu interfejsa.
Interfejsom se definiše određeno ponašanje koje klasa treba da ima. Koristi se samo kao osnova iz koje se izvode klase ili drugi interfejsi. Svaka klasa koja nasleđuje interfejs mora da realizuje svaku metodu ili svojstvo koji su definisani u interfejsu. Interfejs ne može da sadrži konstruktore. U slučaju da prevodilac u interfejsku naiđe na upotrebu rezervisane reči static primenjenu na članove, on javlja grešku. Interfejs se definiše isto kao i klasa, ime interfejsa se navodi nakon rezervisane reči interface. Ime se prema nepisanom pravilom piše velikim latiničnim slovom I. U slučaju da se definiše neko svojstvo, ono mora da sadrži najmanje jednu od metoda get ili set za pristup.
Primer:
interface IМојИнтефејс
{
void Метода();
int Својство
{
get;
}
}
Prilikom realizovanja ovog interfejsa, izvedena klasa mora da definiše najmanje jednu metodu i get ili set za njen pristup:
class Класа : IМојИнтерфејс
{
public void Метода()
{
//реализација методе
}
public int Својство
{
get {return (0);}
}
}
Ispred metode i svojstva stoji rezervisana reč public.
class Класа : IМојИнтерфејс
{
public void Метода()
{
//реализација методе
}
public int Својство
{
get {return (0);}
}
}
Interfejs postaje osobina klase, koja se može ispisati operatorom is.
public void некаМетода()
{
Класа објекат = new Класа();
if (објекат is IМојИнтерфејс)
{
//код у зависност од IМојИнтерфејс
}
}
Interfejsi su obično kratki i definišu tek nekoliko elemenata koje bi klasa trebalo da realizuje. Njihova prednost u odnosu na apstraktne klase je tome što kod klasa nije obavezno nijedan apstraktni član, dok interfejs osigurava da će bilo koje definisano svojstvo svojstvo ili metoda biti realizovani u izvedenoj klasi.
Delegati
urediDelegat je sličan interfejsu, s tom razlikom što delegat deklariše samo jednu metodu. Ostvaruje se kroz klasu System.Delegate, koja može da sadrži i adresu instance klase i pokazivač na metodu.
Postoje dve vrste delegata:
- jednosmerni (engl. single-cast). Poziva samo jednu metodu i može da vrati vrednost bilo kog tipa.
- višesmerni (engl. multi-cast). Dozvoljava dodelu više metoda, pri čemu ne postoji mogućnost vraćanja vrednosti, odnosno njen povratni tip je void.
Delegati se obično koriste kod događaja (engl. events). Objekat koristi događaj da bi obavestio drugi objekat da se nešto dogodilo, gde više objekata može da osluškuje isti događaj, a njihove metode će biti pozvane onim redosledom kojim su registrovane. Delegati za sistemske događaje su uvek višesmerni.
Oblik metoda koja reaguju na događaje mora odgovarati obliku deklarisanog delegata.
Imenski prostor
urediImenski prostor deklariše oblast važenja klasa i pomaže organizovanju programskog koda. Kako bi se izbeglo ponavljanje imena, programski sklopovi jezika C# štite klasu pomoću skupa imenskih prostora. Imenski prostor definiše logički prostor za identifikatore. Identifikatori, odnosno imena klasa moraju biti jedinstveni u okviru jednog imenskog prostora, ali je dovoljno da se poklapaju sa imenima klasa u drugim imenskim prostorima.
Imenski prostor se deklariše uz pomoć rezervisane reči namespace, nakon čega se piše njegovo ime i zatim članovi između vitičastih zagrada. Članovi imenskog prostora mogu biti klase, interfejsi, delegati, nabrojivi tipovi i strukture. Isti imenski prostor može se koristiti u više datoteka. Imenski prostori mogu biti definisani i sami, ravnopravno sa sistemskim imenskim prostorima okruženja.
.NET sa kojim se isporučuje C# sadrži dva osnovna imenska prostora. Prvi imenski prostor je System, koji definiše osnovne klase i servise. Između ostalih, System sadrži klasu Console.
Drugi imenski prostor .NET okruženja je Microsoft, koja sadrži klase za prevođenje i pravljenje koda u jezicima koje podržava .NET, kao i klase koje se odnose na sistemske događaje i korišćenje baze Registry.
Imenski prostori mogu da sadrže druge imenske prostore. Spoljni imenski prostor se naziva osnovni ili imenski prostor prvog nivoa. Ugnježdeni imenski prostor se zove potprostor, ili prostor drugog nivoa. Imenski prostori se mogu ugnježđivati do neograničene dubine, ali se retko koristi više od dva nivoa.
Primer ugnježdenih imenskih prostora:
namespace ИП1 // ИП1
{
class К1 // ИП1.К1
{
class К2 // ИП1.К1.К2
{
}
}
namespace ИП2 // ИП1.ИП2
{
class К2 // ИП1.ИП2.К2
{
}
}
}
Imenski prostor IP1 je član globalnog imenskog prostora. IP2 je član imenskog prostora IP1, njegovo puno ime (engl. fully qualified name) glasi IP1.IP2. Puno ime imenskog prostora u programu mora biti jedinstveno. Klasa K1 je član imenskog prostora IP1, a njeno puno ime je IP2.K1. Klasa K2 se koristi dva puta u programu, ali su u pitanju dva jedinstvena puna naziva. Prva instanca klase K2 je definisana u okviru klase K1, gde njeno puno ime glasi IP1.K1.K2, a druga instanca klase K2 je deklarisana u okviru imenskog prostora IP2 i njeno puno ime je IP1.IP2.K2.
Da bi se izbeglo korišćenje punog imena za svaku klasu u programu objektima imenskog prostora je moguće prići korišćenjem rezervisane reči using. Na primer, ako da bi se koristili članovi klase Console imenskog prostora System možemo može se napisati ovako:
System.Console.Write("Текст");
Umesto punog imena može se deklarisati korišćenje imenskog prostora System i zatim koristiti direktno imena njegovih klasa, kao u sledećem primeru:
using System
class МојаКласа
{
Console.Write("Текст");
}
U ovom slučaju rezervisana reč using je upotrebljena kao komanda i ona mora biti korišćena van bilo koje definicije klase. Uz pomoć rezervisane reči using moguće je napraviti i alternativno ime, odnosno alijas (računarstvo), za klasu ili za imenski prostor. Upotreba alijasa posebno je korisno kada se ista imena klasa pojavljuju u različitim imenskim prostorima.
Rezervisanu reč using moguće je koristiti i kao iskaz.
Funkcije
urediU celom programu, najmanje jedna klasa sadrži funkciju Main() i ona predstavlja polaznu tačku programa. Operativni sistem pokreće program, tako što pokreće upravo ovu funkciju. Program redom izvršava iskaze funkcije Main(), a po izvršavanju poslednjeg, program vraća kontrolu operativnom sistemu.
Prilikom definisanja funkcije, neophodno je definisati njen povratni tip. Funkcije obično vraćaju određeni tip, a ako funkcija ne treba da vrati nikakvu vrednost, onda je njen povratni tip void. Povratni tip funkcije Main() mora biti ili void ili int. Ako se odredi da funkcija Main() bude tipa int, ona mora da se završi iskazom return, kojom se vraća neka celobrojna vrednost operativnom sistemu. Nakon definisanja povratnog tipa funkcije, nalazi se ime funkcije, koje mora počinjati nekim velikim ili malim slovom ili donjom crtom. Ime funkcije ne može sadržati operatore. Definicija funkcije može sadržati listu parametara, koji se pišu unutar zagrada. Lista sadrži tipove podataka i imena parametara, međusobno razdvojene zarezima. Nakon zatvorene zagrade pišu se iskazi koje funkcija izvršava. Svaki program mora sadržati najmanje jednu klasu i jednu funkciju. Funkcija Main() takođe može sadržati listu parametara, gde se obično koristi samo jedan parametar u obliku niza tipa string:
static int Main(string [ ] аргументи)
{
//искази
return (0);
}
Komentari
urediJednolinijski komentari se pišu iza dve kose crte //. Sav tekst koji dolazi iza njih do kraja linije smatra se komentarom. Višelinijski komentari se pišu između kosih crta i zvezdice, odnosno između /* i */.
Primer
urediusing System;
namespace РадниПростор
{
public class Програм
{
static void Main()
{
//једнолинијски коментар
/* Вишелинијски
коментар */
Console.ReadLine();
}
}
}
Niti
urediNit (engl. thread) je izolovana putanja izvršavanja u programu. Ona ima sopstveni prostor na steku i može da izvršava metode i pravi objekte istovremeno sa glavnom putanjom izvršavanja (glavnom niti) u programu. Niti omogućavaju izvršavanje dela programa odvojeno od glavne putanje izvršavanja programa. Obično se koriste za dugotrajne obrade podataka u pozadini, dok glavna nit i dalje sarađuje sa korisnikom.
Niti su prestavljene klasom Thread u imenskom prostoru System.Threading. Pokretanje niti se vrši zadavanjem početne metode objektom klase ThreadStart. Klasa Thread sadrži nekoliko statičkih metoda koje se pozivaju bez instanciranja klase, kao što su metoda Start() koja pokreće nit, metoda Sleep(), kojom se tekuća nit zaustavlja za određeni broj milisekundi i metoda Join() koja čeka da se nit završi.
using System;
using System.Threading;
namespace нити
{
class главнаКласа
{
static public void Main()
{
//Објекат типа нити
Thread нит = new Thread(new ThreadStart(Старт));
//Покреће нит
нит.Start();
//Чека да се нит заврши
нит.Join();
}
static void Старт()
{
Console.WriteLine("Инстанцирана нит");
}
}
}
Pisanje konzolnih programa
urediKonzolni programi su najjednostavniji oblik C# programa. Izvorni program je moguće napisati u običnom programu za obradu teksta, kao na primer u Noutpedu. C# prevodilac ne uzima u obzir ekstenziju datoteke, ali se za datoteke u izvornom kodu u C# preporučuje nastavak cs.
Funkcija Console.Write() je najsličnija funkciji printf() iz jezika C++. Ispisuje izlaznu sekvencu. Izlazne sekvence mogu sadržati:
Izlazna sekvenca | Značenje |
---|---|
\a | zvono, proizvodi kratak zvučni signal |
\b | pomera za jedno mesto ulevo |
\f | pomera izlaz na početak sledeće strane na štampaču, a na ekranu ispisuje kontrolni znak |
\n | pomera kursor na početak sledećeg reda |
\r | tekst koji se ispisuje na ekranu posle ovog znaka, pojavljuje se preko tekućeg sadržaja reda |
\t | znak za tabulator |
\v | vertikalni tabulator. Na ekranu daje kontrolni znak |
\" | navodnici. koristi se kao graničnik za znakovne nizove. u kombinaciji sa kosom crtom prevodilac ga tumači kao običan znak |
\\ | ispisuje obrnutu kosu crtu |
Funkcija Console.WriteLine() ispisuje tekstualnu predstavu određenog objekta, iza koje sledi izlazna sekvenca za završetak reda, čija je predodređena vrednost „\r\n”. Ovu vrednost je moguće promeniti, promenom karakteristike NewLine, klase TextWriter iz imenskog prostora System.IO.
Primeri
urediPrimer 1:
string ниска1 = "Ниска 1", ниска2 = "Ниска 2";
Console.Write(ниска1);
Console.Write(ниска2);
Rezultat:
Ниска 1Ниска 2
Primer 2:
string ниска1 = "Ниска 1", ниска2 = "Ниска 2", ниска3 = "Ниска 3",
ниска4 = "Ниска 4", ниска5 = "Ниска 5";
Console.Write(ниска1 + "\t" + ниска2 + "\n" +
"\"" + ниска3 + "\"" + "\r\n" +
ниска4 + "\\" + ниска5);
Rezultat:
Ниска 1 Ниска 2 "Ниска 3" Ниска 4\Ниска 5
Primer 3:
string ниска1 = "Ниска 1", ниска2 = "Ниска 2";
Console.WriteLine(ниска1);
Console.WriteLine(ниска2);
Rezultat:
Ниска 1 Ниска 2
Pisanje petlji
urediProgramske petlje predstavljaju jedan od temelja programiranja. Omogućavaju programu da ponavlja iskaz ili blok iskaza do ispunjenja određenog uslova.
U C# postoje četiri različita iskaza za petlje:
Iskaz | Primena |
---|---|
while | iskaz ili blok iskaza se izvršavaju dok vrednost uslova ne false. Ukoliko uslov pre ulaska u petlju ima vrednost false, petlja se neće izvršavati |
do ... while | vrednost uslova računa se posle izvršavanja bloka iskaza, koji će se izvršiti barem jednom |
for | petlje sa zadatim brojem ciklusa. Kontrolni iskaz petlje sadrži i inicijalnu vrednost i vrednost testa |
foreach | petlja se izvodi samo jednom za svaki član niza. |
Osnovni oblik while petlje je sledeći:
while (израз == true)
{
//искази
}
Umesto izraza može se upotrebiti samo konstanta true, u kojem slučaju . A do while petlja ima sledeći oblik.
do
{
//искази
} while (израз == true);
Razlika između njih je u tome što se kod do while petlje osigurava najmanje jedno izvršavanje iskaza, pre računanja uslova i osim toga uvek se završava tačkom i zarezom (;).
For petlja je korisna kada blok iskaza treba izvršiti određeni broj puta. Njen kontrolni izraz se sastoji iz trodelnog iskaza:
for (почетни исказ; контролни израз; израз увећања)
{
//искази
}
Prvi iskaz je početni (engl. initializing statement). U njemu se zadaju početne vrednosti kontrolnih promenljivih, a mogu se i deklarisati. Drugi iskaz je kontrolni (engl. test expression). On se izračunava pre svakog ciklusa petlje. Treći je iskaz uvećanja (engl. increment expression), u kome se najčešće menja vrednost kontrolne promenljive.
Forič petlja se koristi za obradu elemenata niza. U kontrolisanom izrazu mora biti jedinstvena promenljiva čiji tip odgovara elementima niza, kojoj se pri svakom prolaskom kroz petlju dodeljuje vrednost jednog od elemenata niza i tako od prvog do poslednjeg elementa.
foreach (тип променљиве in низ)
{
//искази
}
Promenljiva koja se deklariše u kontrolnom izrazu može se samo čitati, ne može se upotrebiti za menjanja vredsnosti elementa niza, što ograničava upotrebljivost ovog tipa petlje. Primer:
int [] низ = new int [3] {10, 20, 30};
foreach (int број in низ)
{
Console.WriteLine(број);
}
U okviru sva četiri tipa petlji mogu se koristiti dva specijalna iskaza:
- iskaz continue koji trenutno zaustavlja petlju i vraća izvršavanje programa na početak petlje, tako da se svi iskazi nakon ovog iskaza koji postoje do kraja petlje se ignorišu. Petlja nastavlja da se izvršava sve dok je kontrolni iskaz tačan
- iskaz break, koji zaustavlja petlju i program nastavlja da izvršava iskaz nakon petlje.
Kontrolni iskazi
urediUobičajeno je da program izvršava iskaze redom. Većina jezika raspolaže metodama kojim se upravlja tokom programa, ispitivanjem određenih uslova i u zavisnosti od rezultata odlučuje o tome šta će se izvršiti.
Uslovni iskaz - if
urediKontrolni iskaz if može da ispituje samo logičke uslove smeštene u zagrade. Iza uslova koji može biti tačan ili netačan sledi iskaz, koji može biti smešten i u složen izraz između vitičastih zagrada. Pomoću rezervisane reči else može se uvesti iskaz ili blok iskaza koji se izvršavaju ako je vrednost uslova false. Konstrukcijom else if može se proveriti više uslova, a broj iskaza koji se pomoću njih može vezati u lanac nije ograničen:
if (условни израз1)
{
//исказ
}
else if (условни израз2)
{
//исказ
}
else if (условни израз2)
{
//исказ
}
else
//исказ
Poslednji else u lancu nema odgovarajuće if. Ovaj poslednji else nije obavezan, ali ako se upotrebi, mora biti poslednji u lancu. Vrednost svih uslova mora biti logička, vrednosti tačan ili netačan. Program ispituje redom svaki uslov dok ne dobije rezultat tačno, nakon čega će se izvršiti dati iskaz ili blok iskaza i ostatak lanca se ignoriše, čak iako je neki od preostalih uslova tačan. Ako baš nijedan uslov nije tačan, izvršiće se iskaz koji dolazi posle else. U svakom slučaju, uvek se izvršava samo jedan iskaz ili blok iskaza u lancu, dok se ostali ignorišu.
Uslovni iskaz switch
urediAko se u okviru lanca uslova ispituju celobrojne vrednosti, može se iskoristiti iskaz switch. On izračunava izraz i upućuje program na blok iskaza koji odgovara rezultatu:
Prilikom korišćenja iskaza switch treba poštovati sledeća pravila:
- vrednost kontrolnog izraza mora da bude celobrojna, odnosno tipa bool, int, long ili short int
- za obeležavanje blokovi koda se koristi rezervisana reč case, a vrednost iza nje mora biti konstanta istog tipa kao i vrednost u kontrolnom izraz i nikako ne može da stoji promenljiva. Blok iza iskaza case se izvršava ako se zadata vrednost podudara sa rezultatom uslova
- iskaz case uvek se smešta u vitičaste zagrade
- svaki blok case mora da se završi iskazom koji će preusmeriti program ka drugom iskazu. Taj iskaz mogu biti iskazi break, goto, return ili continue, ovaj poslednji samo u slučaju da se iskaz switch nalazi u okviru neke petlje.
Postoji i mogućnost da ukoliko se rezultat ne poklapa ni sa jednom zadatom vrednošću u bloku switch izvrši poseban slučaj default.
switch(израз)
{
case 1:
искази;
break;
case 2:
искази;
break;
default:
искази;
break;
}
Reference
uredi- ^ Hamilton, Naomi (1. 10. 2008). „The A-Z of Programming Languages: C#”. Computerworld. Pristupljeno 1. 10. 2017.
- ^ Wylie Wong (2002). „Why Microsoft's C# isn't”. CNET: CBS Interactive. Pristupljeno 19. 10. 2017.
- ^ Joy, Bill (7. 2. 2002). „Microsoft's blind spot”. cnet.com. Pristupljeno 12. 1. 2010.
- ^ Klaus Kreft and Angelika Langer (2003). „After Java and C# - what is next?”. Pristupljeno 29. 6. 2017.
- ^ Klaus Kreft; Angelika Langer (3. 7. 2003). „After Java and C# - what is next?”. artima.com. Pristupljeno 12. 10. 2017.
- ^ Osborn, John (1. 8. 2000). „Deep Inside C#: An Interview with Microsoft Chief Architect Anders Hejlsberg”. O'Reilly Media. Pristupljeno 29. 11. 2017.
- ^ „Generics (C# Programming Guide)”. Microsoft. 18. 3. 2022. Pristupljeno 21. 3. 2011.
- ^ Mercer, Ian (15. 4. 2010). „Why functional programming and LINQ is often better than procedural code”. abodit.com. Arhivirano iz originala 11. 07. 2011. g. Pristupljeno 27. 10. 2017.
- ^ Karli Watson (2002). „Od pocetka..C#” (PDF). CET Computer Equipment and Trade. Pristupljeno 28. 11. 2017.
- ^ Karli Watson (2002). „Od pocetka..C#” (PDF). CET Computer Equipment and Trade. Pristupljeno 28. 11. 2017.
- ^ Ključne reči jezika C# Arhivirano na sajtu Wayback Machine (8. april 2008) — sa sajta Majkrosofta
- ^ Tipovi podataka jezika C# — sa sajta Majkrosofta
Vidi još
urediSpoljašnje veze
uredi- Zvanična stranica C# na sajtu Majkrosofta
- Programski jezik C# na sajtu Majkrosofta
- Specifikacija C# verzija 3.0
- C# ECMA specifikacija
- "Od početka...C#" Karli Votson