Académique Documents
Professionnel Documents
Culture Documents
Cesar
.NET Okruenje
Vjeba 2: Uvod u C#
Sadraj
Osnove C# jezika................................................................................................... 3
Solution i projekti................................................................................................ 3
Klase i objekti, svojstva u klasi............................................................................4
Odnos klasa..................................................................................................... 4
Svojstva i polja, konstruktori i metode.............................................................5
Iznimke................................................................................................................ 7
Suelja (interface)............................................................................................... 8
Kolekcije (generics)............................................................................................. 8
Petlje i enumeriranje kolekcije.........................................................................8
C# - napredni koncepti........................................................................................... 9
Lambda izrazi i LINQ............................................................................................ 9
Lambda izrazi................................................................................................... 9
LINQ naredba where...................................................................................... 9
LINQ naredba ToList..................................................................................... 10
LINQ naredbe First, Single, FirstOrDefault i SingleOrDefault........................10
LINQ naredba OrderBy i OrderByDescending..............................................10
LINQ naredba Count.................................................................................... 11
LINQ podupiti............................................................................................... 11
Func, Predicate i Action objekti.........................................................................12
Osnove C# jezika
U ovom e se poglavlju prezentirati osnovni pojmovi i koncepti koji e biti
koriteni na kolegiju.
Solution i projekti
U pravilu se svaka ozbiljnija aplikacija dijeli na nekoliko slojeva. Ti slojevi su
najee prezentacijski sloj, model/business/services sloj i sloj za pristup bazi
podataka (Data Access Layer ili krae DAL sloj). Kod razvoja vieslojnih aplikacija,
potrebno je uvesti i nezavisnosti izmeu slojeva u smjeru prema gore, to znai
da prezentacijski sloj moe biti ovisan o DAL ili model sloju, ali DAL ili model sloj
ne smiju biti ovisni o prezentacijskom sloju. U .NET okruenju se takva raspodjela
najelegantnije postie raspodjelom slojeva na projekte unutar rjeenja
(solutiona). Po uzoru na tu ideju, napravit emo novi projekt i nazvati ga
Vjezba.Model. Novi projekt se dodaje odabirom opcije File -> Add -> New Project
u izborniku:
Odnos klasa
Klase mogu implementirati nasljeivanje, to znai da izvedena klasa nasljeuje
svojstva i funkcije iz bazne klase. Klase takoer mogu biti u odnosu u kojem neka
4
Pri kreiranju objekta, prva funkcija koja se poziva unutar klase je konstruktor. Da
bi klasa funkcionirala, nije potrebno napraviti konstruktor osnovni (default)
konstruktor e biti dodan automatski. Meutim, u nekim sluajevima je dobro
dodati konstruktor za osiguravanje incijalizacije, kao to je to primjer u sljedeem
kodu:
Funkcija je definirana:
Iznimke
Kao i u drugim programskim jezicima, C# ima razvijen mehanizam rukovanja
iznimkama. Iznimka se moe dogoditi uslijed nepredvienih ulaznih parametara,
pogreke u kodu i sl. Iznimke se mogu baciti i uloviti, ali svaka iznimka koju
moemo baciti ili uloviti nasljeuje iz bazne klase Exception. U samom .NET
radnom okviru ima niz ve postojeih iznimki koje se mogu iskorititi u nizu
situacija (kao u zadatku 2.1), ali mogue je i kreirati vlastitu iznimku to je ni
manje ni vie nego nova klasa koja nasljeuje iz klase Exception ili iz bilo koje njoj
izvedene klase. Za bacanje iznimki koristimo kljunu rije throw, dok za hvatanje
iznimki koristimo kombinaciju try-catch-(finally) 4.
Zadatak 2.1
Dodati u projekt Vjezba.Model klase Osoba, Profesor, Student i Fakultet.
Ispravno implementirati nasljeivanje te odnose izmeu tih klasa. Za spremanje
1-N veze koristiti List<> objekt. Gdje god je mogue, koristiti automatska getter i
setter svojstva. Dodatno, potrebno je ispotovati sljedea poslovna pravila
1. Osoba treba sadravati informacije: Ime, Prezime, OIB, JMBG. OIB ima 11
znakova, i sve moraju biti znamenke, dok JMBG ima tono 13 znakova,
takoer sve moraju biti znamenke. Ukoliko prilikom postavljanja svojstva
OIB ili JMBG gornje pravilo nije ispotivano, potrebno je baciti iznimku
InvalidOperationException.
a. Iz JMBG broja je mogue izvui datum roenja, te osoba takoer
treba imati readonly polje tipa DateTime i naziva DatumRodjenja.
2. Profesor treba uz ime, prezime, oib i jmbg, imati i podatak o nazivu odjela
(Odjel), zvanju (enumeracija5 Zvanje) i datumu izbora u zvanje
Suelja (interface)
Suelje je skup pravila kojim definiramo kako izgleda ili koja ponaanja sadri
neka klasa koja ga implementira. Primjerice, klasa koja implementira suelje
IDisposable sigurno sadri metodu Dispose. Ovo suelje takoer indicira da klasa
koristi resurse koje bi trebalo osloboditi nakon to smo zavrili s koritenjem te
klase. Preutni dogovor u C# je da suelja poinju slovom I (od Interface), te ih
je na taj nain lako uoiti i razlikovati od obinih klasa 6.
Kolekcije (generics)
Gotovo svaka poslovna aplikacija e morati voditi evidenciju (pamtiti) informacije
o nizu razliitih podataka - primjerice, niz rauna, narudbenica, studenata,
brodova, ili kao u prolom zadatku profesora i studenata. U tu svrhu koriste se
razne kolekcije koje nam omoguavaju niz funkcionalnosti za rukovanje ovisno o
konkretnoj potrebi i kontekstu. U C# najee se koriste strogo tipizirane kolekcije
(generics) - to su kolekcije koje mogu pamtiti samo odreene tipove podataka, tj.
objekte neke specifine klase. Evo nekoliko primjera kolekcija i tipiziranih
kolekcija uz pojanjenje:
List - kolekcija u koju se moe spremiti bilo kakav objekt. Ovo je primjer
netipizirane kolekcije. Elementima liste (tipiziranim i netipiziranim) se
Zadatak 2.2
U klasi Fakultet potrebno je dodati funkciju DohvatiProfesore koja vraa popis
svih profesora (povratni tip je IEnumerable<Profesor>), poredanih po datumu
izbora u zvanje poevi od najstarijeg datuma.
C# - napredni koncepti
U narednom poglavlju bit e obraeni napredni koncepti u C# jeziku konkretnije
lambda izrazi i LINQ mehanizam. Stabla izraza (expression trees) su posebne
strukture u C# jeziku koje omoguavaju definiranje koda koji e tek kasnije biti
izvren. LINQ koristi stabla izraza za manipulaciju kolekcijama, gdje se pomou
stabla izraza definira upit koji e tek naknadno biti izveden (ako se radi o upitu na
bazu podataka kroz Entity Framework ili slian ORM alat). U ovom poglavlju bit e
obraene osnove LINQ izraza za manipulacije kolekcijama te Func<>,
Predicate<> i Action<> objekti kojima se definira funkcija u obliku varijable.
Zadatak 2.3
Napisati funkciju u klasi Fakultet koja pomou where naredbe dohvaa samo
studente roene 1991. godine. Funkcija se treba zvati DohvatiStudente91, a
povratna vrijednost treba biti IEnumerable<Student>.
1. Izdvojiti iste objekte, ali bez
DohvatiStudente91NoLinq.
koritenja
LINQ
naredbi,
funkciji
Zadatak 2.4
Zadatak 2.5
Kreirati funkciju DohvatiStudente91List koja, kao u zadatku 2.3 dohvaa
studente roene '91, ali ih vraa u obliku List objekta.
LINQ naredbe First, Single, FirstOrDefault i SingleOrDefault
Gore navedene naredbe slue za izdvajanje samo jednog elementa iz kolekcije.
Metode imaju sljedee razlike:
Zadatak 2.6
Kreirati funkciju NajboljiProsjek92 u klasi Fakultet koja dohvaa studenta s
najboljim prosjekom roenog 1992. godine. Ukoliko student ne postoji, funkcija
treba vratiti null.
Zadatak 2.7
Kreirati funkciju Studenti91Ordered u klasi Fakultet koja dohvaa studente
roene 1991. poredano po prosjeku silazno.
Zadatak 2.8
Kreirati funkciju SviProfesori u klasi Fakultet koja dohvaa sve profesore
poredano abecedno po prezimenu zatim po imenu.
11
Zadatak 2.9
Kreirati funkciju KolikoProfesoraUZvanju u klasi Fakultet koja vraa ukupan
broj profesora u zadanom zvanju. Funkcija prima kao parametar traeno zvanje.
LINQ podupiti
est je sluaj da je potrebno izdvojiti elemente kolekcije na temelju kolekcija koje
sadre. Unutar bilo kojeg LINQ upita, moe se postaviti dodatni upit nad bilo
kojom kolekcijom definiranom nekim svojstvom.
Zadatak 2.10
Kako bi mogli testirati podupite, potrebno je uz ve postojee klase, dodati i klasu
Predmet, te u klasi Profesor omoguiti spremanje popisa svih predmeta koje
profesor predaje (svojstvo nazvati Predmeti). Klasa Predmet treba imati ifru
predmeta (int Sifra), broj ECTS bodova (int ECTS), naziv predmeta (Naziv).
Zadatak 2.11
Kreirati funkciju NeaktivniProfesori u klasi Fakultet koja vraa profesore koji su
u zvanju Predava ili Vii Predava a koji imaju manje od 2 predmeta na kojima
dre nastavu.
Zadatak 2.12
Kreirati funkciju AktivniAsistenti u klasi Fakultet koja vraa profesore koji su u
zvanju Asistent a koji imaju vie od 2 predmeta s barem 5 ECTS bodova na kojima
dre nastavu.
12
namespace LINQHelperApp.Console
{
class Program
{
static void Main(string[] args)
{
var calc = new Calculator();
Func<int,int,int> fOp = calc.GetRandomOperation();
int x = 10, y = 5;
int rez = fOp(x, y);
}
}
System.Console.WriteLine(rez);
System.Console.ReadKey();
Varijabla fOp je upravo objekt koji tretiramo kao funkciju, vidimo u nastavku poziv
fOp(x,y) gdje se pravimo da je fOp zapravo neka funkcija. Pogledajmo kako
izgleda kod Calculator klase (u nastavku):
13
namespace LINQHelperApp.Console
{
public class Calculator
{
public Func<int, int, int> GetRandomOperation()
{
var rand = new Random();
switch (rand.Next() % 3)
{
case 0:
return Summation;
case 1:
return Substraction;
case 2:
return Multiplication;
}
return null;
}
public int Summation(int a, int b)
{
return a + b;
}
public int Substraction(int a, int b)
{
return a - b;
}
public int Multiplication(int a, int b)
{
return a * b;
}
}
14
namespace LINQHelperApp.Console
{
public class Calculator
{
public Func<int, int, int> GetRandomOperation()
{
var rand = new Random();
switch (rand.Next() % 3)
{
case 0:
return (a, b) => {
return a + b;
};
case 1:
return ((a,b) => a - b);
case 2:
return (a,b) => a * b;
}
return null;
}
}
}
15
namespace LINQHelperApp.Console
{
class Program
{
static void PrintOperation(int x, int y, Func<int, int, int> op)
{
int rez = op(x, y);
System.Console.WriteLine(rez);
}
static void Main(string[] args)
{
var calc = new Calculator();
Func<int,int,int> fOp = calc.GetRandomOperation();
PrintOperation(10, 5, fOp);
System.Console.ReadKey();
}
Zadatak 2.13
U klasi Fakultet potrebno je kreirati funkciju IzmjeniProfesore koja kao
parametar prima Action objekt kojem je jedini parametar tipa Profesor. Funkcija
mora proi po svim profesorima u fakultetu, i izvriti akciju nad svima njima.
16