Code-it! C# knjiga

C# je objektno-orijentiran programski jezik razvijen od Microsofta. Baziran je na C++-u i Java-i. Dizajniran je da bi izbalansirao brzi razvoj s kvalitetom.

1. Uvod u .NET Framework

.NET (čitaj: dot net) je naziv za najnoviju Microsoftovu viziju budućnosti računalstva u kojoj se aplikacije izvršavaju distribuirano putem Interneta. Da bi to ostvarili, bilo je potrebno ispuniti neke uvjete.

Kao prvo, distribuirano računalstvo je konceptualno poput objektno orijentiranog programiranja, što se najbolje vidi u sposobnosti da programski kod za određenu operaciju smještava u jedan blok, umjesto da ga se prepisuje gdje god je to potrebno. Upravo prelazak na distribuirani model donio je toliko potrebnu efikasnost u razvoju aplikacija.

Drugo, smještanjem specijaliziranog koda na jedno mjesto i otvaranjem javno dostupnog sučelja, različiti su uređaji (telefoni, dlanovnici, stolna računala itd.) podržani istim programskim kodom. Odavde vuče korijene Microsoftova «pokreći svagdje» filozofija.

I kao treće, kontrolom pristupa u realnom vremenu distribuiranim resursima, tvrtke poput Microsofta dobivaju mogućnost bolje kontrole izvršavanja aplikacija. Na taj način aplikacije prelaze iz razmišljanja «posjedujem objekt» u razmišljanje «podržavam servis». Zanimljivo je da je Microsoft prelaskom na .NET odustao od strogog patentiranja svojeg vlasništva (sve tehnologije koje zahvati nastoji prilagoditi Windows operativnom sustavu). Kako budućnost vidi u pružanju softverskih servisa putem distribuiranih aplikacija, .NET Framework je napravljen tako da aplikacije na drugim platformama mogu pristupiti tim servisima. Na primjer, .NET je izgrađen na standardiziranim tehnologijama poput XML-a i SOAP-a.

U aspektu razvoja aplikacija, .NET se oslanja na .NET Framework. .NET Framework se sastoji od Common Language Runtime, .NET Framework standardne biblioteke klasa i specijaliziranih klasa poput onih koje podržavaju ASP.NET (sljedeća generacija ASP serverske tehnologije) te Windows Forms (za razvoj klasičnih desktop aplikacija).

Common Language Runtime (CLR) upravlja izvršavanjem koda kompiliranog za .NET platformu. CLR ima dvije zanimljive mogućnosti. Prva je ta da mu je specifikacija otvorena što omogućuje portiranje na newindows operativne sustave. Drugo, za pisanje aplikacija koje koriste standardne klase može se koristiti bilo koji programski jezik kojeg podržava CLR.

Jedan od jezika koji se savršeno uklapa u .NET Framework jest C#. Taj novi jezik, nasljednik C++, objavljen je zajedno s .NET Frameworkom, te je zato logično da bude primarni programski jezik za pisanje .NET aplikacija.

2. Usporedba s C++ i Javom

U ovom ćemo se poglavlju osvrnuti na razlike između C# i njegova dva najbliža rođaka (C++ i Java). Ponegdje u tekstu navedene su reference na web sjedišta koja dublje obrađuju određenu problematiku te je vrlo korisno posjetiti ih.

[b]C# vs. Java[/b]

C# i Java su jezici najnovije generacije čiji su izravni prethodnici C++ i C. Svaki od njih sadrži napredna svojstva poput Garbage Collection (skupljanje smeća) čime se smanjuje potreba za intervencijama izravno u programskom kodu. Navedeni jezici su sintaktički gotovo isti.

C# i Java izvorne datoteke kompiliraju se u prijelazni jezik: C# u Microsoft Intermediate Language (MSIL), a Java u Java bytecode. U svakom od ovih slučajeva prijelazni jezik se može izvoditi; bilo interpreterom, bilo just-in-time kompilacijom na odgovarajućem virtualnom stroju. Valja naglasiti da je u C# dodatna pozornost posvećena kompilaciji prijelaznog jezika u binarni kod.

C# podržava primitivnije tipove podataka od onih u Javi (poglavlje 4), a omogućuje i stvaranje vlastitih tipova podataka. Na primjer, C# podržava pobrojenja (enumerations), tipski sigurni vrijednosni tipovi podataka koji mogu sadržavati samo konstante, te strukture koje su korisnički definirani tipovi podataka. (poglavlje 11). (Java ne podržava pobrojenja ali ih može simulirati).

Za razliku od Jave, C# ima mogućnost preopterećivanja različitih operatora. Poput Jave, C# ne koristi nasljeđivanje više klasa u korist nasljeđivanja jedne klase što je prošireno nasljeđivanjem više sučelja. Polimorfizam je podržan pomoću nasljeđenih metoda te preopterećenja ili skrivanja metoda bazne klase. C# koristi delegate. To su tipski sigurni pokazivači na metode, a osnovna ima je namjena implementacija upravljanja događajima.

U Javi su višedimenzionalna polja implementirana preko jednodimenzionalnih (polja mogu biti članovi drugih polja). C# pak podržava i takva (zupčasta), ali i pravokutna polja.

Za detaljniju usporedbu C# i Java-e kliknite.
Komparativan pregled C#-a
Microsoft .NET vs. J2EE.

[b]C# vs. C++[/b]

Iako posjeduje neke elemente nasljeđene od Visual Basica i Jave, najbliži rođak C#-a je C++.

Najvažnija razlika između ta dva jezika je to što C# ne sadrži poziv datoteke zaglavlja, što znači da je sav kod «umetnut» u datoteku.

Kao što smo već spomenuli, .NET izvršni sustav u kojem se izvodi C# kod upravlja memorijom te preuzima brigu o zadaćama poput skupljanja smeća (Garbage Collection). Zbog toga je potreba za pokazivačima u C#-u puno manja nego u C++. Pokazivači se mogu doduše koristiti i u C#-u, ali samo u pisanju nesigurnog koda. Preporuča ih se ondje gdje su karakteristike performansi od krucijalne važnosti.

Razumijevanje tipova podataka u C# je znatno kompleksnije od razumijevanja C++ tipova podataka. Svi tipovi podataka u C#-u izvedeni su iz 'object' tipa. Također postoje i razlike u načinu kako se određeni tipovi podataka mogu koristiti. Polja u C#-u su limitirana te stoga nije moguće dodavati elemente nakon što je polje popunjeno.

C# naredbe vrlo su slične C++ naredbama. Spomenut ću samo jednu razliku: naredba switch je promijenjena tako da je zabranjeno nastavljanje slučaja.

Kao što je već spomenuto, C# ne koristi nasljeđivanje više klasa. Ostale razlike kod upotreba klasa su: dodana je podrška svojstvima klasa što je preuzeto iz Visual Basica, a metode se pozivaju pomoću operatora . (točka) umjesto operatora :: (dvije dvotočke).

Za detaljniju usporedbu C# i C++ pogledajte:
C++ & C#: sve što trebate znati za prelazak na C#.
C# iznutra: intervju s Microsoft Chief Architect Anders Hejlsberg.

3. Prvi C# program

Da bi programirali u C#-u i koristili .NET Framework klase morate na računalo instalirati .NET Framework SDK ili Visual Studio .NET.

Kroz ovo poglavlje upoznat ću vas sa strukturom najjednostavnijeg C# programa, što će biti popraćeno linkovima na detaljnija objašnjenja pojedinih dijelova.

Prvi C# program: 'Hello World'

Počnimo na najprirodniji način, proučavanjem koda Hello World programa.

using System; 
 
public class HelloWorld  
{
 
  public static void Main()  
  {
     // ovaj je komentar kroz jednu liniju  
 
     /* ovo je komentar  
    kroz  
    više linija */  
 
    Console.WriteLine ("Hello World"); 
  }
}

Prva stvar koja se uočava jest da C# pravi razliku između velikih i malih slova. To znači da će kompajler prijaviti pogrešku ako umjesto 'Console' napišete 'console'. Druga stvar je da svaka linija završava znakom točka zarez (;) ili vitičstim zagradama koje označavaju početak i kraj bloka naredbi.

C# je objektno orijentiran jezik, što znači da C# programi moraju biti smješteni u klase (klase se obrađuju u poglavlju 11, ali ako ste početnik u programiranju moj savjet je da prije toga proučite neke dodatne materijale). Linija 2 deklarira klasu pod imenom HelloWorld.

Linija 1 nam govori da program koristi 'System' imenički prostor (imenički prostori su također obrađeni u poglavlju 11). Svrha te deklaracije je da uštedi vrijeme potrebno za tipkanje. Objekt 'Console' koji je korišten u liniji 10 zapravo pripada 'System' imeničkom prostoru te mu puno ime glasi 'System.Console'. U kodu možemo izostaviti dio 'System' zato što u liniji 1 deklariramo da program koristi 'System' imenički prostor. Prilikom pokretanja, program će izvoditi metodu Main deklariranu u liniji 4. Uočimo da ime metode nije 'main' nego 'Main'.

Linije od 6 do 9 su ignorirane od strane kompajlera, zato jer sadrže komentare programskog koda. Linija 6 predstavlja jednolinijski komentar, u kojem se do kraja linije ignorira sve što piše nakon dvije kose crtice. Linije 7-9 predstavljaju višelinijski komentar. Njime se ignorira sve što je između početnog i završnog znaka. Naredba u liniji 10 poziva metodu 'WriteLine' klase 'Console' u 'System' imeničkom prostoru. Jasno je što ona radi – ispisuje određeni string na konzolu. ( u Windowsima je to DOS Prompt). Za primjere naprednije upotrebe WriteLine metode, pogledati poglavlje 7.

Da bi program mogli pokrenuti, najprije ga moramo spremiti u datoteku. Za razliku od Jave, ime klase i ime datoteke u koju spremamo program ne moraju biti iste. Ime ekstenzije datoteke može biti po volji, premda je najprirodnije da koristite ekstenziju '.cs'.

Pretpostavimo da smo datoteku spremili kao 'HelloWorld.cs'. Da bi program kompilirali iz komandne linije, trebamo upisati naredbu :

csc HelloWorld.cs

(za korisnike Visual Studija .NET: kompilirate pritiskom tipki Ctrl+Shift+B)

ta naredba generira izvršnu datoteku HelloWorld.exe, koja se pokreće upisivanjem HelloWorld.

(za korisnike Visual Studija .NET: pokrenite program pritiskom na Ctrl+F5)

Ako je sve u redu program će na ekranu ispisati: Hello World!

4. Referenični i vrijednosni ...

C# je tipski siguran jezik. Varijable su deklarirane tako da im je pridružen određeni tip podataka te je svakoj varijabli unaprijed određeno koje vrijednosti smije primati.

Varijable mogu sadržavati reference i vrijednosne tipove, ili pak pokazivače na druge varijable. U ovom ćemo poglavlju govoriti o prvim dvama vrstama varijabli; a pokazivače ćemo obraditi u sljedećem poglavlju.

Evo kratkog pregleda razlika između vrijednosnih tipova podataka i referenci:

ako varijabla v sadrži vrijednosni tip, ona predstavlja objekt s nekom vrijednošću. Niti jedna druga varijabla ne sadrži isti objekt koji sadrži varijabla v (premda bilo koja varijabla može sadržavati istu vrijednost objekta)

ako varijabla v sadrži referencu, koja predstavlja nešto što se odnosi na neki objekt, bilo koja varijabla može sadržavati referencu na isti objekt koji sadrži i varijabla v.

Vrijednosni tipovi

U C#-u je moguće definirati vlastite vrijednosne tipove podataka deklaracijom enumeracija (lekcija 7) ili struktura (lekcija 11). Kompilator korisnički definirane tipove podataka tretira na isti način kao i ugrađene tipove iako su optimizirani za potonje. Sljedeća tablica popisuje i daje informacije o predefiniranim vrijednosnim tipovima. U C#-u su naizgled osnovni tipovi podataka izgrađeni iz tipa 'object'. U tablici se također može uočiti koji sistemski tipovi u .NET Frameworku odgovaraju predefiniranim tipovima.

C# tip podataka [tab].NET Framework sistemski tip podataka [tab]Signed?[tab]Bajtova[tab]Raspon vrijednosti

sbyte		System.Sbyte		Da	1	-128 do 127 
short		System.Int16		Da	2	-32768 do 32767 
int		System.Int32		Da	4	-2147483648 do 2147483647 
long		System.64		Da	8	-9223372036854775808 do 9223372036854775807
byte		System.Byte		Ne	1	0 do 255 
ushort		System.Uint16		Ne	2	0 do 65535 
uint		System.Uint32		Ne	4	0 do 4294967295 
ulong		System.Uint64		Ne	8	0 do 18446744073709551615 
float		System.Single		Da	4	Približno ±1.5x10-45 do ± 3.4x1038 sa 
							7 ili 8 znacajnih znamenki 
double		System.Double		Da	8	Približno ± 5.0x10-324 do ± 1.7x10 308 sa
							15 ili 16 znacajnih znamenki
decimal		System.Decimal		Da	12	Približno ± 1.0x10-28 do ±7.9x1028 sa
							28 ili 29 znacajnih znamenki
char		System.Char		N/A	2	Bilo koji Unicode znak (16 bitni) 
bool		System.Boolean		N/A	1/2	Istina ili Laž

U sljedećem isječku koda deklarirane su i inicijalizirane dvije cjelobrojne varijable.

int x = 10; 
int y = x; 
y = 20; //poslije ove naredbe x sadrži vrijednost 10, a y vrijednost 20 

Referenični tipovi

Predefinirani referenični tipovi su tipovi object i string, gdje je objekt ultimativna klasa za sve ostale tipove podataka. Nova referenca može se definirati upotrebom 'class', 'interface' i 'delegate' deklaracije (objašnjeno u tutorijalu 12).

Referenični tipovi zapravo sadrže memorijsku adresu u kojoj je objekt na kojeg varijabla referencira. Uzmimo za primjer sljedeći isječak koda, gdje se dvjema varijablama referencira na isti objekt.

object x = new object(); 
x.myValue = 10; 
object y = x; 
y.myValue = 20; // vrijednosti x.myValue i y.myValue sadrže vrijednost 20 

Ovaj kod ilustrira kako se promjenom svojstva objekta korištenjem reference na taj objekt reflektira na ostale reference. Treba uočiti da iako su stringovi reference, ponašaju se kao vrijednosni tipovi. Kada je jednom stringu pridružena vrijednost drugog, na primjer:

string s1 = "hello!";
string s2 = s1; 

Tada s1 referencira na isti objekt kako i string s1. S druge strane; kada promijenimo vrijednost varijable s1 sa:

s1 = "goodbye";

Stvara se novi string objekt za varijablu s1. Nakon ove promjene, s1 sadrži "goodbye", a s2 je još uvijek jednako "hello!".

Razlog tome je to što su string objekti nepromjenjivi. To znači da se svojstva tih objekata ne mogu promijeniti. Dakle, da bi na što referencira string varijabla, potrebno je stvoriti string objekt.

Escape sekvence i verbatim stringovi

Kada se deklarira string, određeni znakovi se ne mogu napisati na uobičajen način. C# podržava dva različita načina koji rješavaju taj problem:

Prvi način je korištenjem escape sekvenci. Na primjer, pretpostavimo da želimo postaviti ovu vrijednost u varijablu:

"Hello World
How are you"

Varijablu bismo mobli deklarirati sa sljedećom naredbom, koja sadrži escape sekvence te znak prijelaza u nove red:

string a = "\"Hello World\\n How are you\"";

Sljedeća tablica prikazuje listu escape sekvenci za znakove koji mogu biti zapisani na prikazani način:

Znak		Ecsape sekvenca
'		\'
"		\"
\		\\
Alert		\a
Backspace	\b
Form Feed	\f
New Line	\n
Carriage Return	\r
Horizontal Tab	\t
Vertical Tab	\v
Unicode znak specificiran svojim brojem npr.	\u200	\u
Unicode znak specificiran svojom heksadecimalnom vrijednošću npr.	\xc8	\x
null		\o (zero)

Drugi način je korištenjem 'verbatim' string literala. Verbatim stringovi se definiraju zatvaranjem određenog stringa unutar znakova @" i ". Kako bi ovu mogućnost ilustrirali, postavite varijablu 'putanja' na sljedeću vrijednost:

E:\Documents and Settings\Zoran.MINOTAUR\

Mogli bismo koristiti backslash znakove:

string putanja = "E:\\Documents and Settings\\Zoran.MINOTAUR\\"

ili bismo mogli koristiti verbatim stringove:

string putanja = @"E:\Documents and Settings\Zoran.MINOTAUR\"

Kod verbatim stringova se javlja vrlo korisna mogućnost. Stringovi zapisani pomoću verbatim string sintakse mogu biti u nekoliko linija, imati praznine i to bez mijenjanja izvornog sadržaja stringa.

Znak za koji je potreban escaping je dvostruki navodnik, prikaz dvostrukog navodnixka je omogućen tek kad su dva dvostruka navodnika zajedno. Na primjer, pretpostavmo da želimo postaviti vrijednost varijable 'text' na sljedeću vrijednost:

Riječ "velik" sadrži tri slova.

Korištenjem verbatim string sintakse, naredba bi ivako izgledala:

sting text = @"Riječ ""velik"" sadrži tri slova."

Boxing

C# vam omogućava da konvertirate bilo koji vrijednosni tip u odgovarajući referenični tip, i tada konvertirati 'boxed' tip. Sljedeći dio koda demonstrira boxing. Kada se druga linija izvršava, objekt je instanciran kao vrijednost 'box', i vrijednost koju sadrži i je kopirana preko tog objekta. Zanimljivo je primjetiti kako je tip podatka box vraćen kao vrijednosni tip; operator 'is' mijenja vrijednosni tip box-a u 'int'.

int i = 123; 
object box = i;
if (box is int) 
{Console.WriteLine("Box sadržava int");} // Ova linija se ispisuje na ekranu 

5. Pokazivači

Ova lekcija prikazuje kratki opis pokazivača i njihove upotrebe u C#-u. Lekcija samo dotiče površinu komplicirane teme, međutim, ako se prvi put susrećete s pokazivačima preporučam vam da prije pročitate cijeli tutorijal i zatim isprobate primjere. Na sreću, pokazivači su u C#-u potrebni samo ondje gdje su brzina i performanse programa od velike važnosti.

Notacija pokazivača

Pokazivač je varijabla koja sadrži memorijsku adresu drugog tipa. U C#-u, pokazivači mogu biti deklarirani da sadrže memorijsku adresu vrijednosnog tipa (izuzev slučaj polja - pogledaj dolje).

Pokazivači se deklariraju inplicitno, korištenjem simbola dereferenciranja *, kao što je prikazano u sljedećem primjeru:

int *p;

(Primjetite kako neko developeri postavljaju simbol dereferenciranja odmah poslije naziva tipa, npr:

int* p;

Ova varijacija radi isto tako kao i ona prethodna.)

Ovom deklaracijom smo stvorili pokazivač p, koji će držati memorijsku lokaciju veličine integer-a (zapisan u 4 bitova).

Kombinirani sintaktički element *p ('p' prefiksiran sa simbolom dereferenciranja '*') je korišten za referiranje tipa lociranog u memorijskoj lokaciji koju sadrži pokazivač p. Pokazivaču se može dodati vrijednost kao npr:

*p = 5;

Ovaj kod daje vrijednost 5 integer pokazivaču koji je instanciran u deklaraciju gore. Vrlo je važno, međutim, ovo dodjeljivanje sa dodjeljivanjem bez simbola dereferenciranja, kao npr:

p = 5;

Rezultat ovakvog dodjeljivanja je promjena memorijske lokacije koju sadrži p. Time se ne mijenja vrijednost integera instanciranog sa originalnom deklaracijom; to samo znači da p ne pokazuje na taj integer. U stvari, p će sada pokazivati na početak od 4 bajtova u memorijskoj lokaciji 5.

Drugi vrlo važni simbol za korištenje indeksera je operator &, koji u kontekstu vraća memorijsku lokaciju varijable. Primjer djelovanja ovog simbola:

int i = 5; 
int* i; 
p = &i; 

Dodan u primjer gore, kod

*p = 10;

mijenja vrijednost varijable i u 10, budući da se '*p' može shvatiti kao 'integer lociran u memoriji vrijednost drži u p'.

Postoji još jedan vrlo važan dio notacije pokazivača. Pokazivači se mogu deklarirati za strukture (pogledajte lekciju 11), kao u sljedećem primjeru (koji koristi strukturu 'Koordinate' definiranu dalje u tutorijalu):

Koordinate x = new Koordinate(); 
Koordinate *y = &x; 

Kad smo već deklarirali javni pokazivač y možemo pristupati vrijednsti polja x (preko z). To se može postići korištenjem sljedeće deklaracije.

(*y).z

ili zapisivanjem ekvivalentnog izraza, koji koristi oznaku -> :

y -> z

Nesiguran kod

Velik problem kod korištenja pokazivača u C#-u je taj da C# operira u pozadini proces sakupljanja smeća. U nakani oslobađanja memorije, taj sakupljač smeća je u mogućnosti da promijeni memorijsku lokaciju trenutnog objekta bez upozorenja. Stoga će bilo koji pokazivač koji pokazuje na neki objekt prestati funkcionirati. Taj scenarij dovodi do dva potencijalna problema. Prvi se sastoji u tome što se može kompriitirati izvođenje C# programa. A drugi je da može utjecati na integritet drugih programa.

Zbog ovih programa, korisnost pokazivača je strogo ograničena na kod koji je eksplicitno označen, sa strane programera, kao 'unsafe'. Zbog velikog rizika od malicioznog korištenja nesigurnog koda, programi koji sadrže nesiguran kod će se pokretati samo ako im je dana potpuna kontrola.

Kako bi pojasnili problem kod sakupljanja smeća, zamislimo da smo deklarirali pokazivač unutar 'fiksnog' izraza. Time memorijska lokacija tipa ostaje statična, sigurna od sakupljača smeća. Primjetite kako fiksne izjave mogu biti korištene unutar konteksta nesigurnog koda.

Bilo koje vrijednosti deklarirane unutar nesigurng koda su automatski 'fiksne' te će generirati greške tijekom kompiliranja ako su korištene izvan fiksnog izraza.

Sljedeći kod demonstrira primjer metode koja je označena kao 'unsafe'. Iz prijašnjeg paragrafa slijedi da pokazivač p ne može biti deklariran unutar fiksne izjave na liniji 9, jer je p postavljen na strukturu c koja je deklarirana izvan nesigurnog koda.

using System;
public struct Koordinate 
{
	int x; 
	int y; 
	unsafe public static void Main() 
	{
   		Koordinate c = new Koordinate(); 
   		Koordinate *p = &c; 
  		{
    	 		p->y = 6; 
     			(*p).x = 5; 
   		}
   		Console.WriteLine(c.y);
   		Console.WriteLine(c.x);
  	}
}

Usporedite prethodni sa sljedećim kodom, u kojem će pokazivač na liniji 8 biti deklariran kao 'fixed', jer je postavljen da pokazuje na tip koji nije deklariran unutar nesigurnog bloka koda:

using System;
public struct Koordinate 
{
   int x; 
   int y; 
   unsafe public static void notMain(ref Koordinate c) 
   {
     fixed (Koordinate *p = &c){
             p->y = 6; 
            (*p).x = 5; 
     }
    Console.WriteLine(c.y);
    Console.WriteLine(c.x);
   }
}

U primjerima danim gore, 'unsafe' je uključeno kod modifikatra metode. Međutim, može se koristiti i kod bloka koda, kao kod sljedećeg koda:

using System; 
public static void Main() 
{
  unsafe
  {
     Koordinate c = new Koordinate; 
     //...
  }
}

Pokazivači, metode i polja

Pokazivači se mogu osim kod vrijednostnih tpova korisiti i kod polja.

Pokazivač se može deklarirati u vezu s poljem, kao u sljedećem primjeru:

int[] a = {4, 5};
int* b = a; 

Ono što se događa u ovom kodu jest da je memorijska lokacija koju drži b, lokacija prvog tipa kojeg drži a. Prvi tip mora biti vrijednosni tip. Kod dolje prikazuje kako je moguće prijeći preko vrijednosti polja korištenjem pokazivača, ali objašnjavanje ovog izlazi iz granica ovo tutorijala.

using System; 
public class Tester
{
   public static void Main() 
   {
      int[] a = {4, 5}; 
      changeVal(a);
      Console.WriteLine(a[0]);
      Console.WriteLine(a[1]);
}
 
public unsafe static void changeVal(int[] a) 
{
   fixed (int *b = a) 
  {
      *b = 5; 
      *(b + 1) = 7; 
   }
}
}

6. Polja

Jednodimenzionalna polja

Polja su klase zbirki koje pružaju višedimenzionalnu podršku organiziranja. Jednodimenzionalna polja pružaju mogućnost pohrane i rukovanja nizom varijabli smještenih u lančanom nizu u memoriji. Jednodimenzionalna polja imaju jednu dimenziju (ili su polja prvog ranga). Polja su u C#-u deklarirana korištenjem uglatih zagrada poslije tipa polja (a ne iza modifikatora kao kod C-a), kao npr. int[] i = new int[100];

Ova linija koda deklarira varijablu i koja će postati polje tipa int veličine do 100 elemenata. Sadrži prostor za najviše 100 elemenata, rangiranih od i[0] do i[99].

Kako bi dodali vrijednosti elementima polja, možemo dodijeliti vrijednosti svakom elementu zasebno, kao što je prikazano u sljedećem primjeru:

int[] i = new int[2]; 
i[0] = 1;
i[1] = 2;

Također, možemo deklarirati polje i dodati svim elementima vrijednosti odmah u deklaraciji polja (inicijalizirati polje):

int[] i = new int[] {1,2};

ili skraćenijim zapisom:

int[] i = {1,2};

Kao opće pravilo, indeksi svih elementa polja započinju sa 0 kao početnim indeksom prvog elementa polja. Ostali elementi polja imaju indekse veće za jedan od prethodnog. Međutim, korištenjem .NET framework System.Array klase moguće je kreirati i manipulirati poljima ako je potrebna dinamička promjena veličine polja.

Svojstvo polja Length sadrži potpuni zbroj svih elemenata polja neovisno o dimenzijama. Za jednodimenzionalna polja, koja imaju samo jednu dimenziju, svojstvo Length sadrži duljinu tog jednodimenzionalnog polja. Na primjer, ovo svojstvo primjenjeno na prethodni primjer bi dalo broj 2.

Pravokutna polja

C# pruža dva tipa višedimenzionalnih polja: pravokutna i zupčasta. Pravokutno je polje s više od jedne dimenzije, gdje je dimenzija zapisana na deklaraciji polja. Za svaku novu dimenziju potrebno je dodati zarez unutar zagrada deklaracije polja. Sljedeći primjer kreira polje dimenzija 2x3:

int[,] polje = new int[2,3];

Kao i u jednodimenzionalnim poljima, pravokutna polja se mogu inicijalizirati, odnosno dodati im neke vrijednosti odmah pri deklaraciji polja. Na primjer, sljedeći kod:

int[,] polje = {{1, 2, 3}, {4, 5, 6}};

kreira polje dimenzija 2x3 sa upisanim podacima. Važno je da vrijednosti koje se žele spremiti u polje ne prelaze granice polja jer se u tom slučaju javlja greška.

Klasa System.Array sadrži nekoliko metoda za utvrđivanje veličine i granice polja. To uključuje metode GetUpperBound(int i) i GetLowerBound(int i) koje vraćaju gornji i donji indeks dimenzije i tog polja (primjetite da je i zero-based što znači da je prvi indeks 0).

Na primjer, budući da je duljina druge dimenzije polja polja 3, izraz

polje.GetLowerBound(1)

vraća 0, i izraz

polje.GetUpperBound(1)

vraća 2.

System.Array uključuje i metodu GetLength(int i), koja vraća broj elemenata određene dimenzije.

Sljedeći dio koda pomoću dvije petlje ispisuje vrijednosti svih elemenata polja polje (petlje su pobliže opisane u lekciji 9).

for (i=0; i<polje.GetLength(O); i++) 
  for (j=0; j<polje.GetLength(1); j++)
     Console.WriteLine(polje[i][j]);

Foreach petlja se također može koristiti za pristupanje elementima polja, no ona nema istu kontrolu kod pristupa vrijednostima po određenom rasporedu kao što je slučaj kod polja.

Zupčasta polja

Korištenjem zupčastih polja, možete kreirati multidimenzionalna polja s neregularnim dimenzijama. Fleksibilnost potječe iz činjenice da su multidimenzionalna polja implementirana kao polja od polja. Sljedeći primjer demonstrira kako se može deklarirati polje sastavljeno od grupe od 4 i od grupe od 6 elemenata:

int[][] polje = new int[2][];
polje[0] = new int [4];
polje[1] = new int [6];

Kod prikazuje da elementi polje[0] i polje[1] drže referencu na jednodimenzionalno polje tip int. Ilustracija kako se pristupa int vrijednostima: naredba polje[0][1] omogućava pristup drugom elementu prve grupe.

Kako bi inicijalizirali zupčasto polje pri deklaraciji, možemo koristiti kod sličan sljedećem:

int[][] polje = new int[][] {new int[] {1, 2, 3, 4}, new int[] {5, 6, 7, 8, 9, 10}};

Budite oprezni kod korištenja metoda poput GetLowerBound, GetUpperBound, GetLength, itd. kod zupčastih polja. Budući da su zupčasta polja konstruirana preko jednodimenzionalnih, ona se nebi smjela imati višedimenzionalna polja na način na koji imaju pravokutna polja.

Kako bi prešli preko svih elemenata zupčastog polja možemo koristiti kod sličan sljedećem:

for (i=0; i<polje.GetLength(O); i++) 
for (j=0; j<polje[i].GetLength(0); j++)
Console.WriteLine(polje[i][j]);

ili

for (i=O; i<polje.GetLength(0); i++) 
for (j=0; j<polje[i].Lenght; j++) 
Console.WriteLine(polje[i][j]);

7. Enumeracije

Enum tip je poseban popis konstantnih vrijednosti i elementi enum tipa (ili pobrojenog tipa) zapisuju se samo riječima, a ne brojevima.Vrijednosti elemenata su cijeli brojevi, ali mogu biti i realni brojevi, bitovi itd (bilo koje numeričke vrijednosti osim znakova) kao što će biti prikazano u lekciji.

Kada definirate enumeraciju tada zapisujete elemente koji će se koristiti kao konstante sa svojim odgovarajućim vrijednostima. Sljedeći kod prikazuje primjer takve deklaracije.

public enum DANI
{
  Ponedjeljak,
  Utorak,
  Srijeda,
  Cetvrtak,
  Petak,
  Subota,
  Nedjelja
}

Važno je uočiti kako ne postoje nikakve numeričke vrijednosti definirane za pojedine elemente enumeracije DANI. Umjesto toga, sve numeričke vrijednosti su dodane elementima po sljedećim pravilima:

1. Za prvi elemenat : ako je unassigned, vrijednost mu je 0.

2. Za svaki ostali elemenat : ako je unassigned, tada mu je vrijednost za jedan veća od vrijednosti njemu prethodnog elementa.

Iz tih dva pravila možemo vidjeti da će elemenat DANI.Ponedjeljak imati vrijednost 0, i da će se vrijednosti elemenata povećavati za jedan pa će tako elemenat DANI.Nedjelja imati vrijednost 6. Primjetite kako se dodavaju vrijednosti elementima enumeracije – vrijednosti dodane elemenatima enumeracije su statične, stoga ih pozivamo u kodu koristeći naziv enumeracije s elementom: "DANI.Ponedjeljak" umjesto samo elementom "Ponedjeljak". Nadalje, te vrijednosti su konstantne – ne možete im mijenjati vrijednosti tijekom izvođenja programa.

Sljedeći kod demonstrira kako elementi enumeracije mogu biti i tipa različitog od int. U sljedećem primjeru svi elementi enumeracije imaju vrijednosti bit tipa.

enum byteEnum: byte 
{
  A,
  B
}

Također, enumeracije nam omogućuju da i neki elementi odstupaju od pravila po kojem elementi enumeracije imaju vrijednosti od 0 do broja elemenata enumeracije. Ako se želi iskoristiti ova mogućnost, mora se dodati određeni broj elementu enumeracije (u ovom primjeru prvi elemenat ima vrijednost 1). Ostali elementi će imati vrijednosti po drugom pravilu enumeracije, pa će elemenat DANI.Nedjelja imati vrijednost 7.

public enum DANI
{
  Ponedjeljak = 1,
  Utorak,
  Srijeda,
  Cetvrtak,
  Petak,
  Subota,
  Nedjelja
}

U ovim dvama primjerima gore, vrijednosti svakog elementa je jedinstvena ovisno o enumeraciji. Enumeraciju možete prilagoditi vašoj želji, ali elementi mogu biti i istih vrijednosti. U sljedećem primjeru vrijednost elementa DANI.Četvrtak je jednaka 1. Vrijednosti elemenata koji slijede poslije njega će imati vrijednosti po drugom pravilu enumeracije, pa će DANI.Utorak i DANI.Petak imati vrijednost 2, itd.

public enum DANI
{
 Ponedjeljak = 1,
 Utorak,
 Srijeda,
 Četvrtak = 1,
 Petak,
 Subota,
 Nedjelja
}

U C# enumeracije su type-safe, a to znači da će kompajler zaustaviti izvođenje programa ako ste u programu elementima enumeracije dodali nedopuštene vrijednosti. Kao primjer, sljedeći kod se neće kompajlirati:

int i = DANI.Ponedjeljak; 
DANI d = i; 

Ako želite da se ovaj kod ipak izvrši, trebat ćete izvršiti pretvorbu elementa enumeracije u int i varijable i korištenjem explicit cast, kao što je prikazano:

int i = (int)DANI.Ponedjeljak;
DANI d = (DANI)i;

Sada se vjerojatno pitate što se bi se dogodilo ako ćete castati int u vrijednost enumeracije gdje je ta vrijednost definirana samo za dva elementa u okviru enumeracije. Odgovor je: jedan od elemenata je dobio 'prima

using System; 
public class EnumTest
{
     public enum DANI: byte {Ponedjeljak, Utorak, Srijeda, Cetvrtak, Petak, Subota, Nedjelja}
     public static void Main() 
     {
           Array daniArray = Enum.GetValues(typeof(EnumTest.DANI)); 
           foreach (DANI dani in daniArray) 
              Console.WriteLine("Broj {1} iz EnumTest.DANI je {0}", dani, dani.ToString("d");
      }
}

Budući da nije odmah jasno što se dogodilo u main metodi ovog programa, proći ćemo kroz ovaj program.

Na liniji 9 koristili smo statičnu GetValues metodu za Enum klasu. Kada se toj klasi dodijeli enumeracijski tip – u ovom slučaju, EnumTest.DANI – vraća polje svih vrijednosti elemenata unutar enumeracije. Primjetite kako klasa Enum također sadrži metodu GetNames koja vraća nazive elemenata kao stringove..

Na liniji 10 postavili samo foreach petlju, kako bi svaku vrijednost pojedinog elementa u polju daniArray pripremili za ispis. Primjetite kako je ova vrijednost od tipa DANI.

Na liniji 11 koristili samo znakove formatiranja kao dio metode Console.WriteLine. Ova metoda omogućava korištenje String.Format metode, pa je ekvivalentna:

Console.WriteLine(String.Format("Broj {1} iz EnumTest.DANI je {0}", dani, dani.ToString("d")));

I što metoda String.Format čini je da uzima 'tekstualni prikaz' objekata koji su navedeni kao parametri te ih postavlja na odgovarajuća mjesta u okviru 'formata stringa'. Stoga je ova linija ekvivalentna sa sljedećom:

Console.WriteLine("Broj " + dani.ToString("d").ToString() + " iz EnumTest.DANI je " + dani.ToString());

Sada, kada znamo da će dani.ToString() vratiti niz elementa, što je sa metodom dani.ToString("d")? Čvrsto smo ovo prije objasnili, no objašnjenje je bilo preoštro. U biti napravili smo grešku. Stoga se nadamo da će sljedeće biti bolje.

ToString metoda može primiti jedan parametar IFormatProvider koji indicira kako će se konverzija u string provesti. Vrijednosti za taj parametar mogu biti riječi poput "g", "d", "x", "f", itd. Prva implikacija koju smo korisitili i u našem programu je "d", međutim, ona je namijenjema decimalnom formatu. I kada koristimo ovo kod enumeracijskog člana, omogućuje prikaz elementa enumeracije kao stringa preko numeričke vrijednosti. Stoga, kada pokrećemo kod iznad, dobivamo sljedeći izlaz:

Broj 0 iz EnumTest.DANI je Ponedjeljak
Broj 1 iz EnumTest.DANI je Utorak
Broj 2 iz EnumTest.DANI je Srijeda
Broj 3 iz EnumTest.DANI je Četvrtak
Broj 4 iz EnumTest.DANI je Petak
Broj 5 iz EnumTest.DANI je Subota
Broj 6 iz EnumTest.DANI je Nedjelja

8. Operatori

C# ima popriličan broj operatora koji su preuzeti iz C-a, C++-a i Jave.

Tablica dolje prikazuje listu standardnih operatora.Primjetite da je prilikom pisanja klasa moguće promijeniti defaultno djelovanje nekih operatora (preopteretiti operatore). Sljedeća tablica prikazuje i koji se operatori mogu preopteretiti.

Kategorija		Naziv			Primjer sintakse		Preopterećenje?
Primarni operatori   
			Grupiranje		(a+b)					Ne
			Član			A.B					Ne
 
Dohvaćanje elementa  
			strukture		A->B					Ne
			Poziv metode		f(x)					Ne
			Povećavanje na kraju	c++					Da
			Smanjivanje na kraju	c--					Da
			Konstruktorski poziv	c = new Coord();			Ne
			Alokacija stoga polja	int* c = stackalloc int[10]		Ne
			Veličina tipa		sizeof (int)				Ne
			Operator checked()	checked {byte c = (byte) d;}		Ne
			Operator unchecked()	unchecked {byte c = (byte) d;}		Ne
 
Unarni operatori       
			Operator plus		+10					Da
			Operator minus		-10					Da
			Logička negacija	!(c==d)					Da
			Bitovne komplementacije	~(int x)				Da
			Povećavanje na početku	++c					Da
			Smanjivanje na početku	--c					Da
			Cast tip		(tip_cast)c				Ne
			Vrijednost na adresi	int* c = d;				Ne
			Adresa vrijednosti	int* c = &d;				Ne
 
Operatori tipa          
			Jednakost tipa / 
			Podudarnost		a is String			Ne
			Dohvaćanje tipa		typeof (int)			Ne
 
Aritmetički op.  
			Množenje		c*d				Da
			Dijeljenje		c/d				Da
			Ostatak			c%d				Da
			Zbrajanja		c+d				Da
			Oduzimanja		c-d				Da
			Pomak udesno		c>>3				Da
			Pomak ulijevo		c<<3				Da
 
Relacijski i logički op.
			Manje od		c<d				Da
			Veće od			c>d				Da
			Manje ili jednako	c<=d				Da
			Veće ili jednako	c>=d				Da
			Jednakost		c==d				Da
			Ne jednakost		c!=d				Da
			Bitovni operator AND	c&d				Da
			Bitovni inkluzivni OR	c|d				Da
			Logički i		c&&d				Ne
			Logički ili		c||d				Ne
			Uvjetni op.		int c=(d<10) ? 5:15		Ne

Preopterećenje operatora

Kako bi preopteretili operator u klasi, možemo korisititi ključnu riječ operatora. Na primjer, sljedeći kod preopterećuje operator jednakosti (pogledaj lekciju 13 za detalje o ovoj metodi).

public static bool operator == (vrijednost a, vrijednost b)
{return a.Int == b.Int}

Gdje je operator jedan od logičkih, oba operatora bi trebali biti preopterećani kao i samo jedan. Ti parovi su sljedeći:

== and !=
< and >
<= and >=

9. Petlje

C# pruža sljedeće petlje:
while
do-while
for
foreach

while petlje

sintaksa: while (izraz) naredba[e]
While petlje izvršavaju naredbe dok je izraz while petlje istinit, ili blokiraju izvođenje petlje ako je izraz false. Na primjer, sljedeći kod:

int a = 0;
while (a < 3)
{
	System.Console.WriteLine(a);
	a++;
}

daje sljedeći ispis na ekranu:
0
1
2

do-while petlje

sintaksa: do naredba[e] while (izraz);
Do-while petlje su jednake while petljama, ali je razlika u tome što se naredbe u tijelu petlje najprije izvedu pa se onda ispituje izraz do-while petlje. Ako je izraz do-while petlje negativan ova petlja omogućuje najmanje jedno izvršavanje naredaba unutar petlje i po tome je specifična ova petlja.

Na primjer, sljedeći kod ispisuje broj '4':

int a = 4;
do
{
	System.Console.WriteLine(a);
	a++;
} while (a < 3);

for petlje

sintaksa: for (inicijalizator; Booleov izraz; modifikator) naredba[e]
For petlja je najbolja za slučajeve kad je poznato koliko puta treba ponoviti izvršavanje naredbi. Sastoji se od tri dijela. Inicijalizatora koji se izvršava samo jednom i to kada for petlja počne. Booleov izraz se izračunava nakom izvršavanja inicijalizatora.
Petlja koja se tada izvršava jednaka je while petlji:
naredba 1
while (izraz) {naredba[e]3; naredba2}

Kad se naredbe unutar petlje izvrše, za njima se izvršava modifikator, a tada se opet počinje izračunavati Booleov izraz. Petlja će se izvršavati sve dok Booleov izraz ne vrati false (vrijednost veću od dane u Booleovom izrazu). Sljedeći primjer prikazuje primjenu for petlje.

for (int a =0; a<5; a++)
{
	System.Console.WriteLine(a);
}

foreach petlje

sintaksa: foreach (indentifikator tipa u zbirci) naredba[e]
Foreach petlje se koriste kako bi ispisali vrijednosti neke c kolekcije objakata. Kad se foreach petlja počne izvoditi, varijabli identifikatora tipa u zbirci se dodjeljuje stavka zbirke. Ovaj tip petlje je vrlo dobar za pristupanje vrijednstima polja. Stoga, mogli bismo prikazati kako radi ova petlja preko sljedećeg primjera sa poljem:

int[] a = new int[]{1,2,3};
foreach (int b in a)
	System.Console.WriteLine(b);

Najvažija opcija ove petlje je da program ne može biti opterećeniji ako se koristi ova petlja, te da će se svi elementi polja učitati i nad njima izvesti određene naredbe bez ikakve

10. Naredbe preskakanja i selekcije

Naredbe preskakanja su:

break
continue
goto
return
throw

break naredba

Break naredba omogućuje izlaz iz while i for petlji objašnjenih u lekciji 9, i switch naredbe objašnjene dalje u ovoj lekciji. Kad se zaustavi izvođenje petlji korištenjem break naredbe, break naredba usmjerava izvršavanje programa na prvu liniju poslije petlje u kojoj se nalazi. Sljedeći kod pruža primjer kako se može koristiti break naredba. Izlaz petlje su brojevi od 0 do 4.

int a = 0; 
while (true)
{
	System.Console.WriteLine(a);
	a++;
	if (a==5)
	break;
}

continue naredba

Continue naredbe se mogu koristiti u bilo kojoj petlji. Kad se pokrene, omogućava trenutni skok na Booleov izraz petlje. Sljedeći kod prikazuje korištenje continue naredbe za dobivanje broja vrijednosti između 0 i 100 koji se ne mogu podijeliti sa 7. I na kraju petlje varijabla y sadrži zahtijevanu vrijednost.

int y = 0; 
for (int x=1; x<101; x++) 
{
	if ((x%7) == 0)
		continue;
	y++;
}

goto naredbe

Goto naredba se koristi kako bi se preusmjerilo izvođenje programa na posebno označeni dio programskog koda. Također se koristi u switch naredbama opisanim dolje. Možemo koristiti goto naredbe kako bi konstruirali petlju, kao u sljedećem primjeru (ali opet, takvo korištenje nije preporučljivo):

	int a = 0; 
start:
	System.Console.WriteLine(a);
	a++;
	if (a<5) 
		goto start;

Selekcijske naredbe

C# pruža samo dvije selekcijske naredbe:

if - else
switch – default

if naredba

Jednostavna if naredba omogućuje izvršavanje samo ako je Booleov izraz true, a ako je false izvode se naredbe koje slijede nakon if naredbe.Vitičaste zagrade se moraju koristiti kad je unutar if naredbe više linija koda, ali se mogu i koristiti kad imate i samo jednu liniju koda ili jednu naredbu.

int a = 5; 
if (a == 5){
	System.Console.WriteLine("a je 5"); 
}

if - else

If-else naredbe se koriste za izvođenje određenih akcija, ako je uvjet istinit – true, ali i ako je uvjet neistinit – false. Ova se naredba ponaša kao i jednaostavna if naredba osim kada Booleov izraz vraća nulu. Tada se izvršavaju naredbe koje slijede unutar else bloka.

if (a == 5)
	System.Console.WriteLine("a je 5");
else
	System.Console.WriteLine("a nije 5");

If-else naredbe se mogu efikasno zamijeniti sa uvjetnim operatorom. Uvijetni operator vraća jednu od dvije vrijednosti, ovisno o brijednosti Boolean izraza. Sljedeći primjer prikazuje uvjetni operator koji

int i = (Boolean) ? 1 : 0 ;

dodaje broj 1 ako je vrijednost Boolean izraza true ili dodaje broj 0 ako je brijednost Boolean false. If naredbu bi mogli napisati i u sljedećem obliku

System.Console.WriteLine (a==5 ? "a je 5" : "a nije 5");

switch naredbe

Switch naredbe omogućuju da na lakši način preskočimo zapisivanje puno if-else naredaba. Switch naredba omogućuje ispitivanje svih vrijednosti na temelju integralne vrijednosti ili stringa izraza. U sljedećem primjeru varijabla čija je vrijednost 'pitanje' je 'a'. Ako je jednaka 1 tada se ispisuje 'a>0', ako je jednaka 2 tada se ispisuje 'a>1 i a>0'. Ako a nije ni 1, ni 2 izvršava se default, tj. ispisuje se 'a ne zadovoljava'.

switch(a) // a je integralni izraz 
{
	case 2:
		Console.WriteLine("a>1 i a>0"); 
		goto case 1; 
	case 1: 
		Console.WriteLine("a>0");
		break;
	default:
		Console.WriteLine("a ne zadovoljava"); 
		break;
}

Svaki case (pa i 'default' case) može imati ali i ne mora imati.Gdje case ima naredbe, naredbe moraju sadržavati barem jednu od sljedećih naredaba:

break;
goto case k; // (gdje je k određeni case)
goto default;

Iz dolje navedenog primjera možete vidjeti kako C# switch naredbe ispisuju naredbe ako nema striktno naredaba koje su vezane uz određeni case, što je preuzeto iz C++ i Jave. Sljedeći primjer prikazuje ovu mogućnost; ispisuje se 'a>0' ako je varijabla a ili 1 ili 2.

switch (a) 
{
	case 1: 
	case 2: 
		Console.WriteLine("a>0");
		break;
	default:
		Console.WriteLine("a ne pripada"); 
		break;
}

11. Klase

Na klase se može gledati kao na predloške za objekte. One opisuju funkcionalnost koje če pojedini objekti imati i podatke koje če sadržavati,no neće se raditi o konkretnom objektu. Primjer koji se koristi u večini knjiga je primjer Automobila, pa ču i ja navesti taj primjer. Ima li netko ovdje nazočni bolji primjer neka ubaci. Klasa-Auto može sadržavati opis objekta, njegove metode (na primjer: Ubrzaj i Uspori) te svojstva (MaksimalnaBrzina, KoličinaGoriva itd.). Želimo li stvoriti konkretni objekt kiji če imati svoju vrijednost za maksimalnu brzinu i količinu goriva te koji če doista i obavljti akcije ubrzavanja i usporavanja moramo stvoriti novi objekt iz klase Auto.

Evo kako se definira klasa auto:

public class Auto
 {
	//Implementacija klase
 }

Za definiranje klase koristi se ključna riječ class i ime klase, a unutar vitičastih zagrada se navodi njena implementacija. U implementaciji klase definiraju se članovi klase. To su sve metode i svojstva koje klasa ima. Klase su zasebni objekti koji u potpunosti sadržavaju svu svoju funkcionalnost i neovisni su o okolini. Krenimo sad definirati nekoliko osnovnih svojstva klase Auto:

public class Auto
   { 
      public int TrenutnaBrzina; //Cjelobrojno svojstvo za pračenje trenutne brzine
 
      public void Ubrzaj()	//metoda za ubrzanje
      {
	TrenutnaBrzina += 10;
      }
 
      public void Uspori()	//metoda za usporavanje
      {
	TrenutnaBrzina -= 10;
      }
      public void Kreni()	//metoda za kretanje
      {
        while (TrenutnaBrzina != 50) Ubrzaj(); 
      }
 
      public void Stani()	//metoda za zaustavljanje
      {
	while (TrenutnaBrzina != 0) Uspori();	
      }
 
   }

Klase služe kao predlošci za stvaranje objekata.Koriste se kao i svaki drugi
tip podataka a za deklariranje koristimo samo ime klase.

 
	//U koliko navedemo samo :
 
	Auto mojAuto;
 
	//Objekt klase auto još nije moguče koristiti iz razloga
	//jer nije još stvoren u memoriji da bismo ga stvorili koristimo
	//naredbu new pa to izgleda ovako:
 
	 mojAuto = new Auto();
 
	//e da to inače pišemo krače u jednom redu:
 
	Auto mojAuto = new Auto;
 
	//sada možemo koristiti vrijednosti svih varijabli iz objekta.
 
	Auto mojAuto = new Auto();
	mojAuto.Kreni();
	mojAuto.Ubrzaj();
	mojAuto.Stani();
	//itd.

Evo jednostavnog primjera kojim simuliramo vožnju:

 
	Auto mojAuto = new Auto();
	mojAuto.Kreni();
	mojAuto.Ubrzaj();
	Conzole.WriteLine(mojAuto.TrenutnaBrzina); //60
 	mojAuto.Stani();

Dakle šta smo to gore nadrobili? Prvo smo stvorili objekt klase Auto,pa smo
zatim pozvali njegove metode.Sve metode su definirane u samoj klasi,
pa ih zato može koristiti svaki objekt te klase.