You are on page 1of 134

C# programiranje

1
C# - kratka istorija
• Programski jezik B (Ken Thompson 1970. - Bell Labs)
• Programski jezik C napravljen 1972 za potrebe UNIX operativnog
Sistema, kreator je Dennis Ritchie, takođe Bell Labs
• 1978 objavljena knjiga "The C Programming Language", autori Brian
Kernighan & Dennis Ritchie
• 1983 American National Standards Institute (ANSI) sastavio komitet
za standardizaciju jezika C
• 1988 definisan ANSI standard, tj. "ANSI C"
• ...
• 2000 Microsoft .NET, prva pojava jezika C#.
• Glavni arhitekta C# jezika je Anders Hejlsberg (Turbo Pascal, Delphi)
• Jedan od "just in time" kompajlera – prevodi se u Intermediate
Language (IL)

2
Prikaz radnog okru ženja i virtuelne mašine

3
Osnovni tipovi C# projekata
• Console App
• Windows Forms App
• Class library
• Windows Service
• WPF
• ASP.NET Web (Web Forms, MVC (Model View Controller))
• Office
• Test, Install, Custom control lib, SQL Server, BI
•…

4
.NET Framework
• Ver 1.0, 1.1
• Ver 2.0
•…
• Ver 4.6.1

• Uz operativni sistem se automatski instalira i odgovarajuća verzija .NET


Frameworka. Kompletna lista verzija i ostalih informacija na:
https://docs.microsoft.com/en-us/dotnet/framework/migration-
guide/versions-and-dependencies

5
Konzolna aplikacija
• klasa System.Console
• korisne metode:
◦ Write (...)
◦ WriteLine (...)
◦ ReadKey()
◦ ReadLine()
◦ Beep(...)
◦ Clear()
• konverzije tipova
◦ int.Parse (value)
◦ int.TryParse(value, out variable)
◦ value.ToString()

6
C# Solution
• Struktura
• Projekti
• Source code fajlovi
• Svojstva (properties) projekta
• Reference projekta
• Šta je Namespace?
• Struktura direktorijuma, debug i release folderi

7
Primer konzolne aplikacije
• Kreiranje novog rešenja sa inicijalnim projektom
• Pregled strukture rešenja
• Korišćenje metoda konzolne aplikacije
• Pregled source code fajlova i izvršne datoteke
• Dekompajliranje izvršne datoteke u alatu ILDASM
(Intermediate Language Diassembler)
• Šta je Assembly (sklop) i njegov manifest

8
Tipovi podataka i deklaracija
varijabli

9
C# primitivni tipovi 1/2
Tip podatka Opseg

byte 0 .. 255

sbyte -128 .. 127

short -32,768 .. 32,767

ushort 0 .. 65,535

int -2,147,483,648 .. 2,147,483,647

uint 0 .. 4,294,967,295

long -9,223,372,036,854,775,808 ..
9,223,372,036,854,775,807

ulong 0 .. 18,446,744,073,709,551,615

10
C# primitivni tipovi 2/2
float -3.402823e38 .. 3.402823e38

double -1.79769313486232e308 ..
1.79769313486232e308

decimal -79228162514264337593543950335 ..
79228162514264337593543950335

char Jedan Unicode karakter

string Unicode string (niska karaktera)

bool True ili False.

object Referenca na generički objekt

11
Deklaracija i dodela vrednosti
varijabli
• C# je strogo tipiziran jezik
• Svaka varijabla se mora deklarisati pre upotrebe
• Sintaksa deklaracije:
TipVarijable NazivVarijable
npr: string ImeStudenta;
• Opciono se prilikom deklaracija dodeljuje vrednost varijabli:
TipVarijable NazivVarijable = InicijalnaVrednost
npr: string ImeStudenta = "Petar Petrović";
• U programskom kodu, jednostavno:
NazivVarijable = { konstanta | izraz }

12
Područja važenja (scope)
varijabli
• metode u okviru klase mogu biti private ili public – zavisno od toga
kako je kreirana klasa (o tome uskoro kada budemo radili klase)
• varijable deklarisane u okviru tela metode su privatne i vidljive samo u
okviru tela metode.
• varijabla deklarisana u okviru programske strukture (npr. for) je vidljiva
samo u okviru te strukture:
for (int i=1; i<10; i++)
{
Console.WriteLine (i);
}
i = 10;  ERROR – nedeklarisana varijabla
• Preklapanje područja važenja – primer sa for

13
Demo & vežbe
• Konzolna aplikacija i rad sa varijablama
• Jednostavni izrazi i proračuni
• Konverzija tipova podataka:
◦ Implicitne konverzije (primeri)
◦ Eksplicitne konverzije
Varijabla = System.Convert.ToInt16 ("123");
Varijabla1 = Varijabla2.ToString ();
Varijabla1 = (int)Varijabla2;

Convert: https://msdn.microsoft.com/en-us/library/system.convert(v=vs.110).aspx

14
Prva grafička aplikacija - uvod
• Uvod u Windows desktop aplikacije
• Forme
• Standardne kontrole korisničkog interfejsa
• Svojstva, metode i događaji
• Koncept programiranja vođenog događajima
(event driven programming)
• Inicijalni demo

Vežba

15
WinForms
• Application objekt
◦ metoda Exit
◦ svojstvo ExecutablePath
• Form objekat
◦ svojstvo AcceptButton
◦ svojstvo CancelButton
◦ referenca this
•kotrola ListBox
◦ items kolekcija
◦ Clear() metoda
◦ Add (object) metoda Items kolekcije
◦ SelectedIndex svojstvo
◦ SelectedItem svojstvo

16
WebForms aplikacija - uvod
• postback
• Response, Request
• kotrole
• <asp:ControlType> tag
• redirekcija (Response.Redirect)
• development web server (IIS Express)
• Internet Information Server (IIS)

17
Logički operatori
• ==
• !=
• >
• <
• <=
• >
• >=
• && operator AND
• || operator OR

18
Operatori dodele
• var = var * num var *= num
• var = var / num var /= num
• var = var % num var %= num
• var = var + num var += num
• var = var – num var -= num
• var = var + 1 var++ ili ++var
• var = var – 1 var-- ili --var

19
Operatori dodele
int a, b;
a = 5;
b = a++;
vs
b = ++a;

20
Naredbe odlučivanja

21
IF iskaz odlučivanja
SINTAKSA:
if (logički izraz 1)
naredba1
else if (logički izraz 2)
nareba2
... else if i else su opcioni
else if (logički izraz N)
naredba N
else
naredba

22
Grupisanje naredbi
Grupisanje naredbi se koristi u if strukturi, petljama i mnogim drugim
segmentima koda.
Npr:
if (logički izraz)
{
naredba1 Sve naredbe u vitičastim zagradama
će se izvršiti ako je logički izraz
naredba2 tačan.

}

23
SWITCH iskaz odlučivanja
SINTAKSA:
switch (kontrolni izraz)
{
case KonstantniIzraz1:
naredbe
break;
case KonstantniIzraz2:
naredbe
break;
...
default :
naredbe
break;
}

24
Vežba
Pomoću SWITCH naredbe napisati program koji za uneti broj u intervalu
[1-7] ispisuje naziv dana u nedelji: 1-ponedeljak ... 7-nedelja
Ako je uneta vrednost van intervala [1-7] ili uopste nije broj ispisati
poruku "Pogresna vrednost"
Program uraditi u dve varijante:
• Konzolna aplikacija
• Win form aplikacija

25
Petlje (iteracije)

26
FOR…
Sintaksa:
for (inicijalizacija; bool uslov; azuriranje kontrolne varijable)
{
naredbe;

}

27
Vežba
Unos:
Početna vrednost
Krajnja vrednost
Korak (increment)

Pomoću for petlje ispisati sve brojeve od početne do krajnje vrednosti


uključujući početnu i krajnju vrednost za zadati korak.
Program uraditi u dve varijante:
• Konzolna aplikacija
• Win form aplikacija (ispisati brojeve u list box kontroli)

28
BREAK & CONTINUE
BREAK – bezuslovni izlaz iz petlje, ali obično pod IF uslovom
CONTINUE – povratak na početak petlje

29
Vežba
Prikaz prvih n brojeva Fibonačijevog niza počev od 0 pomoću for petlje.
Za izlaz iz petlje koristiti BREAK
Unos:
(int) koliko prvih brojeva treba prikazati
Fibonačijev niz: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34,...

Program uraditi u dve varijante:


• Konzolna aplikacija
• Win form aplikacija (ispisati Fibonači brojeve u list box kontroli)

30
WHILE…
while (uslov)
{
naredbe


}
Ako uslov nije tačan, petlja se neće ni jednom izvršiti.

31
DO & WHILE…
do
{
naredbe


} while (uslov);

Ovakva petlja će se uvek izvršiti bar jednom jer se uslov ispituje na kraju

32
OpenFileDialog kontrola
• Otvara standardni Windows "Open File" prozor
• Metoda: ShowDialog() – otvara dijalog
Ako korisnik pritisne Cancel dugme na dijalogu, ova metoda vraća
DialogResult.Cancel čija je vrednost 2 (DailogResult enumeracija)
• Svojstvo Filter postavlja filter za ekstenzije fajlova koje će biti prikazane
• Svojstvo FileName vraća kompletnu putanju i ime fajla koji je odabran u
dijalogu.

33
Čitanje tekstualne datoteke
• Namespace System.IO
• Klasa StreamReader
• Prilikom instanciranja u konstruktoru je argument (string) putanja do
tekstualne datoteke.
System.IO.StreamReader fajl = new System.IO.StreamReader (path);
• Metode:
◦ ReadToEnd() – čita kompletan fajl i vraća string
◦ ReadLine() – čita sledeću liniju iz fajla i vraća string.
Ako je nema jer smo došli do kraja fajla, vraća null
◦ Close() – zatvara fajl

34
Vežba
• Napraviti tekstualni fajl sa više redova (koristiti Notepad) i snimiti ga
pod proizvoljnim nazivom
• Napisati program koji će pomoću while petlje čitati taj fajl red po red i
ispisati svaku pročitani red
Program uraditi u dve varijante:
• Konzolna aplikacija
• Win form aplikacija (na dva načina):
a) ispisati svaku pročitanu liniju kao stavku (item) u list box kontroli
b) ispisati kompletan tekst u TextBox kontroli
(postaviti Multiline svojstvo TextBox kontrole na True)

Otvoriti fajl pomoću OpenFileDialog kontrole u WinForms aplikaciji

35
Rukovanje izuzecima

36
Tipovi grešaka

• SINTAKSNE
• RUN-TIME
• LOGIČKE

37
Try – Catch – Finally
try
{
naredbe koje treba izvršiti..
}
catch (TipIzuzetka1 var2)
{
// rukovanje izuzecima1 Design time
} vs
catch (TipIzuzetka2 var2) Run time
{ izveštavanje o greškama –
// rukovanje izuzecima1 kratki prikaz
}…
finaly
{
// deo koji se uvek izvršava
}

38
Tipovi izuzetaka
• Generalni Eception koji "hvata" bilo koji izuzetak
• Specijalizovani
◦ DivideByZeroException
◦ AccessViolationException
◦ ArgumentException
◦ OverflowException
◦ ...

• Svojstva:
◦ Message – tekst poruke o grešci
◦ Source – Izvor greške (ime aplikacije, servise, dll-a)

• ToString() – kompletan tekst o grešci (tekst greške, modul, linija)

39
Pisanje u datoteku
• Namespace System.IO
• Klasa StreamWriter
• Prilikom instanciranja u konstruktoru je argument (string) putanja do
tekstualne datoteke.
System.IO. StreamWriter fajl = new System.IO.StreamWriter (path);
• Opciono: … = new System.IO. StreamWriter (path, append);
append: {true|false}
• Metode:
◦ Write(…) – upisuje zadatu vrednost u fajl i ne dodaje novi red
◦ WriteLine(…) – upisuje zadatu vrednost u fajl i dodaje novi red.
Close() – zatvara fajl

40
Vežba
Konzolna aplikacija:
Uneti dva broja i ispisati njihov količnik
• Sve konverzije raditi sa Single.Parse (value)
• Koristiti try...catch za obradu grešaka
• U catch bloku ispisati poruku o gresci, a kompletan opis greške upisati u
error log fajl (C:\Test\error.txt) – nadovezati na postojeci sadrzaj.
Pre upisa kompletnog opisa greške u log fajl upisati datum i vreme
nastanka greške: koristiti DateTime.Now.ToString()
• Ako je sve u redu, ispisati količnik dva uneta broja

41
Funkcije (metode)

42
Upotreba
• Metoda je imenovani niz naredbi
• Drugi nazivi: funkcije, subroutine, potprogram…

Funkcija:
• Bolja struktura programskog koda
• Višestruka upotrebljivost koda (multiuse)
• Na višem nivou, bibiloteka ili kolekcija funkcija kreirana kao DLL
(Dynamic Link Library) nudi multiuse upotrebu na nivou jednog
računara ili lokalne mreže (Distributed DLL)

43
Sintaksa deklaracije
TipRezultata nazivMetode (lista parametara)
{
// naredbe koje čine "telo" metode
}
• TipRezultata – tip povratne vrednosti metode ili void ako metoda ne
vraća ništa
• nazivMetode – standardne smernice za zadavanje naziva u C#.
Koristiti Pascal Case, Cammel Case,...
• Lista parametara je opciona. Za svaki parametar je potrebno navesti tip
i naziv.
•Ako nema parametara svejedno moramo pisati otvorenu i zatvorenu
zagradu i u deklaraciji i u pozivu metode.

44
Primer sintakse metode
Metoda koja vraća vrednost tipa int
int izracunajZbir (int a, int b)
{
int rezultat;
rezultat = a + b;
return rezultat;
}

Kakvu grešku može generisati ova jednostavna metoda?

45
void metoda
Metoda koja ne vraća nikakvu vrednost, primer:
void kalkulacijaPoreza (string maticniBrojFirme)
{
// konekcija ka bazi podataka
// prosleđivanje maticnog broja firme
// kalkulacija se izvršava u skriptu koji je u bazi podataka
return;
}

46
Pozivanje metode
Ako metoda vraća vrednost određenog tipa (npr. int):
int rezultat;
rezultat = nazivMetode (argumenti);
Možemo ignorisati povratnu vrednost metode i pozvati je samo po
imenu i proslediti argumente.

Ako metoda ne vraća vrednost (tip je void):


nazivMetode (argumenti);

47
Metode
Postoje dve kategorije proizvoda:
kategorija 1 za koju je pdv 10% //kategorija je int tipa
kategorija 2 za koju je pdv 18%
Napisati metodu koja za zadatu vrednost proizvoda i zadatu kategoriju
vraća cenu proizvoda sa uračunatim PDV-om zavisno od kategorije.
Testirati metodu.
Program uraditi u dve varijante:
• Konzolna aplikacija -> throw demo
• Win form aplikacija

48
Enumeracije
• Enumeracija je grupa imenovanih parova naziv - vrednost.
enum Dani
{
Ponedeljak = 1,
Utorak = 2,
...
Nedelja = 6
}
• by default enumeracije su tipa int, ali to se može izmeniti:
enum Dani : byte
{
Ponedeljak = 1

}

49
korišćenje enumeracija
int x = Dani.Utorak;
Identično kao int x = 2; ali imamo razumljiviji kod

• Validni tipovi za enumeracije su:


int, byte, sbyte, short, ushort, int, uint, long,
ulong

• Nazivi elemenata u enumeraciji ne mogu imati razmak

50
Metode
Projekt nazvati "ReplaceDemo" i sačuvati na default lokaciji

Napisati void metodu ZamenaTeksta koja otvara tekstualni fajl na zadatoj putanji.

Potom svaku pojavu reči u tekstu zamenjuje sa zadatim tekstom.

Na kraju snima izmenjeni fajl preko originalnog

Koristiti metod Replace (string OldValue, string NewValue) koja vraća izmenjeni tekst.

Parametri metode:
◦ putanja do tekstualnog fajla koji se otvara
◦ tekst koji se traži
◦ tekst koji se zamenjuje

Uraditi kroz WinForms tip aplikacije sa odgovarajućim interfejsom

51
Breakpoints
• Postavljanje prekidne tačke u kodu
◦ bezuslovne
◦ uslovne

• Pregled vrednosti varijabli (tool tip u kodu)


• Kretanje step-by-step po kodu (F11)
• Ulazak i izlazak iz metoda (Shift + F11)

52
Korišćenje prekidnih
tačaka
• Autos, Locals i Watch window
• Output Window
• Immediate window

53
Prosleđivanje argumenata po
vrednosti i po referenci
• prosleđivanje po vrednosti pravi kopiju prosleđene varijable koja ima
scope u okviru metode
• izmene kopije varijable ne utiču na varijablu koja je prosleđena u pozivu
funkcije.

• prosleđivanje po referenci prosleđuje referencu (pointer) na varijablu


koja se koristi u pozivu.
• izmene varijable u telu metode utiču na originalnu varijablu koja je
prosleđenja prilikom poziva metoda

54
C# sintaksa
void NazivMetode (int a, int b)
{
...
}

void NazivMetode (ref int a, ref int b, int c)


{

}

Demo:
• prosledjivanje primitivnih tipova po vrednosti i referenci
• prosledjivanje kontrola po referenci u WinForms app.

55
Nizovi (Arrays)
• .NET klasa System.Array je bazna klasa za sve nizove
• implementira sve potrebne metode za rad sa nizovima
◦ kreiranje, pretraživanje, sortiranje,...

• C# nizovi počinju od nule


• za iteraciju kroz članove niza se koriste for ili foreach petlje
• Lenght svojstvo niza daje broj članova niza (ReadOnly svojstvo)

56
Deklaracija nizova
// niz bilo koje dužine,
// moramo ga kasnije definisati
int[] brojevi;
brojevi = new int[20];

// deklaracija i kreiranje
int[] brojevi = new int[10]

// deklaracija, kreiranje i inicijalizacija


int[] brojevi = new int[3] {2, 3, 5};
int[] brojevi = {2, 4, 5, 6};

57
Višedimenzionalni nizovi
• matrice, 3D prostor, ...
• deklaracija:
int [ , ] matrica = new int [5,6];

int[,] matrica = new int[4, 2]


{ { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

int[,] matrica = new int[,]


{ { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

58
foreach petlja
int[] a = { 2, 4, 6}
foreach (int x in a)
{
Console.WriteLine (x);
}

59
Random klasa
• Generisanje slučajnih brojeva
• Namespace System
Random rnd = new Random();
rnd.Next(); // vraća int tip
// random iz opsega
rnd.Next (DonjaGranica, GornjaGranica)
Granice mogu biti pozitivne ili negativne

60
Prosleđivanje parametara
po referenci & nizovi
• Potrebno je pronaći najveći i najmanji član niza tipa int koji se sastoji od
50 članova.
• Članove niza generisati pomoću slučajnog broja (Random klasa) u for
petlji u opsegu od -10000 do 10000
• Sve generisane članove niza upisati u ListBox kontrolu na formi
• Napisati void funkciju koja radi traženo sa sledećim parametrima:
◦ int niz
◦ int minVrednost (ref)
◦ int maxVrednost (ref)
• Koristiti WinForm tip aplikacije.
• Minimalne i maksimalne vrednosti upisati u dve TextBox kontrole.

61
Preklapanje metoda
• Moguće je u okviru istog opsega važenja imati metode istog
naziva, ali one moraju da imaju različit potpis.

Potpis uključuje:
◦ tip povratne vrednosti metode
◦ broj ulaznih parametara
◦ tip ulaznih parametara
◦ da li se parametar prosleđuje po vrednosti ili po referenci

62
Preklapanje metoda
• Windows forms tip C# aplikacije
• Kreirati tri metode pod nazivom Povrsina za izračunavanje površine:
◦ kvadrat -> P = a * a
◦ pravougaonik -> P = a * b
◦ trapez -> P = ½ * h * (a+b)

• U aplikaciji testirati poziv svake od


tri verzije metode Povrsina

63
Stack vs Heap
• Stack
◦ memorija dodeljena thread-u kao radni prostor
◦ koristi se za lokalne varijable, povratne vrednosti funkcija, povratne adrese
prilikom poziva funkcija, ...
◦ kada se funkcija koja koristi stack završi, taj deo memorije se oslobađa
◦ LIFO (Last In – First Out)
•Heap
◦ deo memorije odvojen za dinamičko alociranje
◦ nema neki definisani sistem (kao LIFO kod stack memorije).
Memorija se dodeljuje i oslobađa po potrebi programera/OS
◦ Može dinamički rasti zavisno od potrebe konkretne aplikacije
◦ Komplikovaniji za manipulisanje, fragmentacija memorije, Garbage Collector
– tipično sporija od Stack memorije

64
Value vs Reference tip
Value tip:
• prenos po vrednosti pravi kopiju value tipa i sa tom kopijom se operiše
u metodi
• dodela vrednosti drugoj varijabli takođe pravi kopiju value tipa

Reference tip:
• prenos po vrednosti prenosti pokazivač (referencu) na tip tako da se u
metodi radi sa istom instancom reference tipa
• dodela vrednosti drugoj varijabli samo označava da druga varijabli
pokazuje na istu instancu objekta u memoriji

65
Struktura
• Value tip u C#
• Tipično se koristi za enkapsulaciju grupe varijabli istog domena:

public struct Student


{
public string Ime;
public string BrojIndeksa;

}

66
Struktura može da sadrži:
• konstruktore*
• konstante
• polja
• metode
• svojstva
• događaje

67
Klasa
• Reference tip u C#
• Može da sadrži:
◦ Konstruktore (Constructors) ◦ Indeksere (Indexers)
◦ Konstante (Constants) ◦ Događaje (Events)
◦ Polja (Fields) ◦ Delegate (Delegates)
◦ Destruktore (Finalizer ili ◦ Klase (Classes)
Destructor) ◦ Interfejse (Interfaces)
◦ Metode (Methods) ◦ Strukture (Structs)
◦ Svojstva (Properties)

68
...
• Klasa je konstrukt koja definiše referentni tip i grupiše varijable,
metode, događaje, ... u okviru jednog domena
• Klasa je tip koji sadrži i podatke i ponašanje (behavior)
• Klasa je nacrt za objekat na osnovu koga se kreira (instancira) objekat
• Da bi se klasa koristila mora da se predhodno instancira (osim ako je
deklarisana kao static)
• Static klase postoje kao samo jedinstvena kopija u memoriji i klijentski
kod joj pristupa direktno, a ne preko referentne varijable.
• Za razliku od struktura klase podržavaju nasleđivanje

69
Upotreba klase na različitim
nivoima arhitekture projekta

70
Klasa - sintaksa
Deklaracija:
public class Student
{
// konstruktori, svojstva, metode,
// dogadjaji,…
}

Kreiranje objekta na osnovu klase:


Student ImeVarijable = new Student();

71
Klasa u aplikaciji
• Koristi se i vidi samo u aplikaciji (Windows, Web,...) gde je kreirana
• Omogućava pisanje strukturanog koda
• Tipično razdvaja interfejs i radni deo aplikacije (kalkulacije, pristup
podacima,...)

➢ Pristup podacima direktno za click događaj bez klase


➢ Kreiranje i upotreba klase u aplikaciji sa istom funkcijom

72
Klasa u Class Library projektu
• klasa (ili više njih), sa svim svojim sadržajima je izdvojena u posebnu
biblioteku
• Biblioteka klasa ne može samostalno da se izvršava već mora da postoji
host proces koji će je dinamički (run time) pozvati i koristiti
• Dynamic Link Library – DLL podržava isti standard za komunikaciju sa
host aplikacijom (exe) pa se može pozvati iz više tipova aplikacije
• Podržan COM (Component Object Model) interoperability
• Podržano remote aktiviranje

➢ Kreiranje Class Library projekta i korišćenje


u Win i Web aplikaciji

73
Klasa u Web Servisu
• Hostuje se na Web serveru (Internet Information Server)
• Funkcioniše u Intranet i Internet okruženju i ima jedinstveni url za pristup
• Moguće je postaviti različite bezbednosne mehanizme (open, user/pass,
sertifikati, kriptografija,...) na web serveru, ruterima, firewall softveru i
hardveru,...
• Koristi standardni TCP/IP web port 80
• Komunikacioni protokol je SOAP (Simple Object Access Protocol)
• Komunikacije se ostvaruje preko XML formata po sistemu request/response
• Najčešće se koristi u B2B scenariju gde komuniciraju
dva sistema
➢ Kreiranje Web servisa i korišćenje
u Win aplikaciji

74
Elementi klase

75
Polja u klasi
• Polje je varijabla bilo kog tipa deklarisana direktno u klasi
• Polje može biti na nivou instance (instance type) ili statička (static type)
◦ instance type je na nivou instance klase i jedinstveno je za datu instancu
◦ static type je deljeno polje koje koriste sve instance klase

public class Osoba


{
public string Ime;
public string Prezime;
private double Plata;
...
}

76
Access Modifiers
• public
javni član klase kome se može pristupiti van klase
• private
privatni član klase kome može pristupiti samo kod u okviru iste klase
• protected
isto kao private + može mu pristupiti kod iz klase koja je nasledila ovu
klasu
• internal
članu može pristupiti bilo koji kod iz istog sklopa (assembly -> exe, dll)
ali ne iz drugih sklopova
• protected internal
protected + internal

77
Konstruktor klase
• Konstruktor klase ima isti naziv kao klasa
• Default konstruktor klase je bez parametara i ako ga mi ne napišemo, kompajler ga
automatski kreira.
MyClass x = new MyClass();
• Možemo imati više konstruktora po pravilu preklapanja metoda
public class Osoba
{
public Osoba (string Ime, string Prezime)
{ … }
public Osoba (string Ime, string Prezime, int Pol)
{ … }
// kod klase
}

78
C# i konstante
const double Pi = 3.14;
• Nisu varijable i ne mogu se menjati
• Mogu se inicijalizovati samo prilikom deklaracije
• Koriste se u drugim izrazima
• Static nije dozvoljen u deklaraciji konstante
readonly int godina = 2018;
• Takođe se mogu inicijalizovati u deklaraciji, ali...
... vrednost im se može dodeljivati i u konstruktorima klase gde su
deklarisane.

79
Finalizer (destruktor) klase...
• Finalizer klase ima isti naziv kao klasa sa znakom ~ ispred naziva
class Osoba
{

~Osoba()
{
// kod finalizera
}
}
• koristi se za oslobađanje resursa prilikom uništavanja objekta
(konekcija ka bazi, memorije, zatvaranje otvorenih fajlova,...)

80
...finalizer (destruktor) klase
• može biti deklarisan samo u klasi, ne i u strukturi
• klasa ima samo jedan finalizer
• ne mogu se naslediti ni overload-ovati
• ne mogu se direktno zvati - izvršavaju se automatski
• nema access modifikator
• nema parametre

Destruktor -> System.Diagnostics.Trace.WriteLine

81
System.Math
• klasa Math u okviru System imenovanog prostora
• klasa je deklarisana kao statička
• sadrži više matematičkih funkcija
• funkcije su implementirane kao metode sa odgovarajućim brojem
argumenata, npr:
double a = Math.Pow (b, 3)
• detaljno na:
https://msdn.microsoft.com/en-us/library/system.math(v=vs.110).aspx

82
Jednostavna klasa
1. Napraviti novi WinForms projekt
2. Dodati klasu pod nazivom Krug
3. Klasa treba da ima jedno public polje Precnik tipa double
4. Klasa treba da ima konstruktor u kome se prosleđuje Precnik
5. Klasa treba da ima dve public metode tipa double bez argumenata:
PovrsinaKruga ()
ObimKruga ()
6. Vrednost za broj Pi deklarisati kao privatnu konstantu u klasi:
private const double Pi = 3.14; ili = Math.Pi;
7. Napisati Destruktor klase i u njemu samo pomoću
System.Diagnostics.Trace.WriteLine ispisati "Klasa dealocirana"
8. Iz WinForms aplikacije testirati klasu

83
Svojstva klase
• Svojstvo klase predstavlja interfejs ka privatnoj varijabli u klasi
• Omogućava proveru/transformaciju vrednosti pre postavljanja (set) ili
čitanja (get)
• Svojstva mogu biti:
◦ Read/Write (i set i get);
◦ Read only (samo get);
◦ Write only (samo set)

• Svojstva mogu biti postavljena kao public, private, protected, internal


• Svojstvo može biti deklarisano kao static

84
Svojstvo klase - sintaksa
public class Test
{
private int p_mesec // privatna varijabla
public int Mesec // svojstvo vidljivo korisniku klase
{
get
{
return p_mesec;
}
set
{
if ( value < 1 || value > 12)
{
throw new Exception ("Pogresan mesec");
}
else
{
p_mesec = value;
}
}
}
}

85
Parcijalne klase
• Klasa podeljena na više fajlova
• Takvu podelu možemo uraditi i za metod, strukturu i interfejs
• Koristi se kod velikih klasa, kada više programera radi na istoj klasi,...
• ključna reč partial
• svi delovi moraju imati ključnu reč partial i isti pristupni modifikator
(public, private,...)

public partial class Student public partial class Student


{ {
public string Index; public void SpemiIspit(…);
public string Ime; public void UpisiOcenu(…); …
… …
} }

86
Static polja u klasi
• varijable u klasi koje su zajedničke za sve instance klase

Instanca 1
a
class Primer b
{
int a;
Instanca 2 Primer
double b;
a x
static int x;
b y
static single y;

} Instanca 3
a
b

87
Static klase
• Static na nivou klase označava da sva polja u klasi moraju biti static
• Nije dozvoljena deklaracije instance članova (polja, metoda, svojstva),
svi moraju biti takođe static
• Ne mogu se instancirati
• Ne mogu se nasleđivati
• Ne mogu imati konstruktore i destruktora
• Koriste se najčešće kao "utility" segment u projektu (System.Math)

88
Vežba
• Napraviti klasu clsDokument koja treba da predstavlja jedan dokument
u DMS-u
• Razdvojiti svojstva i metode klase u dve fizičke datoteke
• Svojstva:
◦ Naziv (string) – max dužina 100 karaktera
◦ Autor (string) – max dužina 50 karaktera
◦ GodinaIzdanja (int) – mora biti između 1900 i aktivne godine
◦ Sadrzaj (string) – max dužina 1000 karaktera

• Metode:
◦ void PosaljiSadrzajNaEmail (string email, string subjekt)
Koristiti klase MailMessage i SmtpClient (name space System.Net.Mail)

89
Anonimni tipovi (klase)
• Direktno nasleđeni od klase System.Object
• Kompajler dodeljuje ime anonimnom tipu
• Referentni tip
• Može imati samo read-only članove i ništa više
• Način da se deklariše set članova bez potrebe da se deklariše tip
var prodaja = new {Artikal = "Tablet", Cena = 100,
Kolicina = 15}
• Najčešće se koristi u SELECT klauzuli LINQ query izraza

90
System.Object klasa
• Najvažniji reference tip
• Sve klase su nasleđene od System.Object
• Sinonim za System.Object je object
• object može referisati na bilo koji referentni tip (heap), ali i na value tip
(stack) – proces po nazivu Boxing:
◦ pravi se kopija value tipa (koji je u stack memoriji)
◦ kopija se prebacije u heap (referentni tipovi postoje samo na heap-u
◦ Ne postoji sinhronizacija između te dve kopije
• korisne metode object klase:
◦ GetType()
◦ ToString() Prikaz sa dve TextBox kontrole na formi
◦ Equals(Object, Object)

91
Metode klase
• Metod je blok koda u klasi koji ima određenu funkcionalnost
• Može da ima ulazne parametre
• Parametar može da se prosledi po vrednosti i po referenci
• Metod pod nazivom Main je ulazna tačka za sve C# aplikacija i CLR ga
automatski poziva kada se startuje C# program
• Metod može da ima povratnu vrednost ili da bude void WinForm Main

• Povratna vrednost može da bude primitivni tip, niz, struktura,


objekat,...

92
Metode – opcioni argumenti
• Opcioni argumenti su oni kojima je u deklaraciji metode dodeljena
inicijalna vrednost
• Moraju da se nalaze na kraju liste argumenata posle obaveznih
• Posle opcionih parametara ne mogu postojati obavezni
• IntelliSense koristi uglaste zagrade kako bi prikazao opcione argumente

primer:
public void TestMethod
(int obavezan, string opcioniStr = "vrednost",
int opcioniInt = 10) { … }

93
Metode – poziv sa
imenovanim argumentima
• Prosleđivanje argumenata po poziciji
• Prosleđivanje argumenata po imenu
◦ nije bitan redosled argumenata
◦ čitljivi kod
◦ mogu se kombinovati pozivi po poziciji i po imenu, ali se onda pozivi po
imenu moraju nalaziti na kraju

public void Test (int a, int b, string c) { … }


//pozivi
Test (b: 4, a: 3, c: "Test")
Test (3, c: "Test", b: 4)

94
Kreirati klasu student sa sledećom specifikacijom
• Naziv klase clsStudent
• Svojstva klase:
◦ BrojIndeksa (int u rasponu od [1 – 999])
◦ Ime (string)
◦ Prezime (string)
◦ UpisanaGodina (int u rasponu od [1-5])
◦ GodinaRodjenja (int – student mora imati najmanje 18 godina)
(koristiti DateTime.Now.Year)
◦ Napisati dva konstruktora sa sledećim ulaznim parametrima:
- BrojIndeksa
- BrojIndeksa, Ime, Prezime
◦ Napisati finalizer sa ispisom "Dealociran objekt" pomoću
System.Diagnostics.Trace.WriteLine
◦ Napisati metod SnimiNaDisk koji upisane informacije o studentu snima na disk kao tekstualni fajl.
Ime fajla je BrojIndeksa.txt

• U slučaju da su narušena pravila vrednosti svojstava uraditi


throw new Exception ("odgovarajuća poruka")

• Vežbu uraditi kao WinForms tip aplikacije.


- Klasu napisati u dva odvojena fajla – u prvom svojstva, u drugom metoda
- Na formi kreirati kontrole za unos podataka i komandno dugme gde se radi
instanciranje klase i postavljanje svojstava na osnovu upisanih podataka na
formi i na kraju snimanje na disk pomoću metode SnimiNaDisk

95
Nasleđivanje
• Ključni koncept u objektnom programiranju
• Koristi se kada dve ili više klasa imaju zajedničke elemente
• Izbegavamo ponavljanje
• Pravimo relaciju između klasa
• Termini:
◦ Bazna klasa (base class) -> klasa od koje se nasleđuje
◦ Nasleđena/izvedena klasa (inherited/derived class) -> klasa naslednik

96
Nasledjivanje: primer Osoba
JMBG
Ime
Adresa
Mesto
...

Student Zaposleni
Osoba+ Osoba+
Index Firma
Fakultet Pozicija
Smer DatumZaposlenja
... ...

Penzioner
Zaposleni+
DatumPenzionisanja
RadniStaž
...

97
Sintaksa
class NasledjenaKlasa : BaznaKlasa
{
...
}
• Klasa može da se nasledi od samo jedne bazne klase
• Od nasleđene klase može da se dalje nasleđuje
class Klasa2 : NasledjenaKlasa
{
...
}

98
Reference na bazne i
nasleđene klase
Zaposleni refZaposleni = new Zaposleni;
Ne može – različiti tipovi
Student refStudent = refZaposleni;

Zaposleni refZaposleni = new Zaposleni;


OK, svi zaposleni su osobe
Osoba refOsoba = refZaposleni;
Ali dostupna su polja,
svojstva i metode samo iz
klase Osoba

99
Prevozna sredstva
• početi od bazne klase vozilo koja treba da ima svojstva i metode
zajedničke za sva prevozna sredstva
• naslediti od nje klase specifične za različite tipove prevoza i dodati
svojstva i metode specifične za njih:
◦ automobil
◦ kamion
◦ voz
◦ avion
◦ brod

100
Metode u izvedenoj klasi
• Bazna i izvedena klasa mogu da imaju iste metode (po signaturi)
• Tada metoda iz izvedene klase maskira (sakriva) metodu iz bazne
klase uz upozorenje kompajlera
class Osoba
{
public void Test(…) { … }
}
class Student : Osoba
{
public void Test (…) { … }
}
new (da bi izbegli upozorenje)

101
Poziv konstruktora iz izvedene
klase
• prilikom instanciranja izvedene klase uvek se poziva default konstruktor
bazne klase
◦ ovo uključuje i default konstruktore koje za nas napravi kompajler
• ako izvedena klasa ima dodatne konstruktore sa različitim argumentima
opet će prilikom takvog instanciranja izvedene klase biti pozvan default
konstruktor bazne klase
• ovo default ponašanje možemo izmeniti ako se u konstruktoru izvedene
klase referišemo na konstruktora bazne klase sa prosleđenim
vrednostima:
class Student : Osoba
{
public Student(int index) : base (index)
{…}

}

102
Virtuelne metode - polimorfizam
• metod koji može da se nadjača (override) u izvedenoj klasi
class Osoba
{
public virtual string Test (…) { … }
}
class Student
{
public override string Test (…) { … }

base.Test (…) // poziva metodu iz bazne klase
}

103
Virtuelne metode : pravila
• ne može biti private
• signature virtualne i override metode mora biti identičan
• ako izvedena klasa ne deklariše metod sa ključnom reči override,
onda ona zapravo maskira/sakriva metodu iz bazne klase
• override metod u izvedenoj klasi je implicitno takođe virtual

104
Extension metode
• moguće je proširiti postojeći tip (klasu ili strukturu) sa dodatnim
metodama – extension metode
• extension metode moraju biti static
Sintaksa:
public static int Negacija (this int i)
{
return -i;
}

105
Extension metode – vežba
• Napraviti extension metodu koja replicira string zadati broj puta
• Metodu nazvati Replicate
• Vezati je za tip string
• Demonstrirati metodu u konzolnoj aplikaciji

106
Protected članovi klase
•Ako klasu A nasledi klasa B (B : A)
◦ klasa B može pristupiti protected članovima klase A
◦ za klasu B oni su efektivno public

• Ako klasa B nije naslednik klase A


◦ klasa B ne može pristupiti protected članovima klase A
◦ za klasu B oni su efektivno private

107
Apstraktne klase i članovi
• abstract modifikator znači da klasa ne može da se instancira – nije
kompletna i na osnovu nje ne može da se napravi objekat
• abstraktne klase se nasleđuju u ne-abstraktnim klasama i onda se
prave objekti na osnovu te nasleđene klase
• nije dozvoljeni imati apstrakna polja

Apstraktne metode
• Apstraktna klasa može imati apstraktne metode
• Slične kao virtualne metode, samo nemaju telo metode već samo
deklaraciju
• sve apstraktne metode moraju biti public

108
Sealed klase
• klasa koja ima sealed modifikator ne može da se nasleđuje
• apstrakne klase ne mogu biti i sealed
• omogućava kompajleru dodatne optimizacije jer zna da se ta klasa
nikada neće nasleđivati

Sealed metode
• moguće deklarisati sealed metod u non-sealed klasama
• takve metode nije moguće nadjačati u izvedenim klasama (override)

109
Sealed metode u non sealed klasama
class A
{
public virtual void test () { return; }
}

class B : A
{
public sealed override void test()
{
return;
}
}

class C : B
{
public override void test() Ne može jer je metod sealed
{
return;
}
}

110
Interfejs klase
• interfejs definiše šta treba napraviti, ali ne i na koji način
• razdvaja "šta" i "kako"
• definiše pravila kojih mora da se pridržava klasa ili struktura koja
implementira taj interfejs
• sadrži definiciju metoda, svojstava,... koje treba da implementira klasa
ili struktura
• ne može da sadrži varijable (fields)
• interfejs nema modifikatore pristupa (private, public,...)
već je public by default
• jedna klasa može da implementira više interfejsa

111
Definicija interfejsa
• Slična definiciji klase, osim što sadrži ključnu reč interface umesto class
interface Istudent
{
// definicija metoda, svojstava…
}
• praksa je da ime interfejsa počinje velikim slovom I

112
Definicija članova interfejsa
• Metode:
interface Istudent
{
int NekaMetoda (int a, int b);
}

• Svojstva
string Name // read i write svojstvo
{
get;
set;
}
int Counter // read only svojstvo
{
get;
}

113
Implementacija interfejsa
• klasa mora da implementira sve definicije u interfejsu

class clsA : Ix1

• klasa može da nasleđuje baznu klasu i implementira jedan ili više


interfejsa:

class clsB : clsA, Ix1, Ix2,...

114
Implementacija interfejsa
Sintaksa:
interface ITest
{
void metoda1 (int a, int b);
string metoda2 (int x, string s, int y);
}

class clsTest : Itest


{
void metoda1 (int a, int b)
{
//kod metode1
}
string metoda2 (int a, string b, int c)
{
//kod metode2
}
}

115
Vežba – interfejs
• Napraviti interfejs Iautomobil sa sledecim svojstvima:
◦ proizvodjac (string)
◦ model (string)
◦ godinaProizvodnje (int)

•Metode
◦ void Kreni (…)
◦ void Stani (…)
◦ void Skreni (…)

Napisati implementaciju interfejsa u klasi automobil

116
Implementacija više interfejsa
u jednoj klasi
• jedna klasa može da implementira više interfejsa:
• class clsA : Ix1, Ix2,...

• klasa može da nasleđuje baznu klasu i implementira jedan


ili više interfejsa:

class clsB : clsA, Ix1, Ix2,...

117
Vežba – implementacija
višestrukih interfejsa
• Na predhodnu vežbu dodati interfejs Ikamion
• definisati po slobodnom nahođenju svojstva i metode koje ima kamion,
ali ih nema automobil

• Napraviti klasu kamion kao implementaciju dva interfesja:


Iautomobil
Ikamion

118
Višestruko nasleđivanje (C++)
Nije podržano u C#
class Father {
// članovi klase Father
}
class Mother {
// članovi klase Mother
}
class Child: Mother, Father // višestruko nasleđivanje, OK u C++, notOK in C#
{
// članovi klasa Father i Mother
}

119
Generics
• Genericke klase imaju type parametar u deklaraciji
• Ovaj parametar može u pozivu biti bilo kog tipa, a C#
kompajler se prilagođava tom tipu
• Omogućava nam da jednu istu klasu koristimo za više
tipova koje prosleđujemo prilikom instanciranja klase

120
Generic klasa - sintaksa
class Test<T>
{
T vrednost;
public Test(T parametar) // konstruktor
{
vrednost = parametar;
}

public void Write()


{
Console.WriteLine(vrednost);
Console.WriteLine(vrednost.GetType());
}
}

121
Generic klasa - poziv
static void Main(string[] args)
{
Test<int> test1 = new Test<int>(5);
test1.Write();

Test<string> test2 = new Test<string>("cat");


test2.Write();
Console.ReadKey();
}

122
Multi threading u C# - 1
• System.Threading namespace
• Execution Thread (nit izvršavanja) definiše jednu putanju izvršavanja
programa
• Ako aplikacija ima delove koji se dugo izvršavaju i sprečavaju nastavak
rada, dobro rešenje je da se taj proces izvršava u izdvojenoj niti
• Postižemo konkurentni rad u okviru jedne operacije
• Single threaded -> Multi threaded
• Klasa System.Threading.Thread je zadužena za upravljanje nitima izvršavanja

123
Multi threading u C# - 2
• Instanciranje:
Thread x = new Thread(new ThreadStart (ImeFunkcije));

• Pokretanje
x.Start();

• Pauziranje
x.Sleep (milisekundi)

124
C# class library tip projekta
• Kompletan .NET Framework koncept je baziran na biblioteci klasa
• Class Library tip projekta otvara mogućnost da napravimo svoju
"custom" biblioteku klasa
• Kompajlira se kao DLL i koristi se isključivo iz EXE izvršnih programa
• Tipično implementira skup funkcionalnosti koje želimo da iskoristimo iz
više projekata
• Data access sloj se najčešće pravi kao biblioteka klasa i enkapsulira rad
sa podacima
• Nasleđuje COM (Component Object Model) uz mogućnost
kompatibilnosti sa njim

125
C# class library tip projekta
•Jedan class library projekat može sadržati jednu ili više klasa
u okviru istog namespace-a
• U svakoj klasi može postojati više metoda različitih tipova
• U biblioteci klasa može postojati i definicija interfejsa koji se
implementira u projektu koji ima referencu na tu biblioteku
• Testiranje i dibagovanje CL projekta se vrši tako što se u okviru istog
rešenja (solution) doda test projekat (WinForm, ConsoleApp,...) i u tom
projektu se napravi referenca na CL projekat

126
C# class library tip projekta

• Jednostavni demo sa test/debug projektom


• Release kompajliranje
• Korišćenje u aplikacijama

127
Kreiranje instalacionog paketa
• Microsoft Visual Studio Installer tip projekta
• Potrebno je installer dodati kao ekstenziju:
Tools -> Extensions and updates –> Online sekcija
• Predhodne VS verzije imaju installer template
• Dodaje se na isti solution gde je projekat za koga pravimo instalaciju
• Podešava se File sistem
◦ Application folder
◦ User's desktop
◦ User's programs menu

• Detektuje zavisnosti (.NET Framework,...)

132
Visual Studio Installer
• Podešavaju se dijalozi setup procedure
• Registry
• Registracija tipova fajlova
• ...

133
Alternative...
• InstallShield
• InstallAware
• ...

• Inno Setup - freeware


◦ +Inno Script Studio (GUI)

134
Serijalizacija
• Proces formatiranja podataka iz jednog oblika u drugi
• npr: Array, Class, DataSet,... -> XML, SOAP, JSON
• .NET Framework
System.Xml.Serialization
System.Runtime.Serialization.Formatters.Soap
System.Runtime.Serialization (za JSON)

◦ XmlSerializer
◦ SoapFormatter
◦ DataContractJsonSerializer

135
Serijalizacija
• Serijalizovati u XML podatke iz tabele Sales.Customers iz TSQL2012
baze podataka
• XML snimiti kao fajl

Tip:
Koristiti DataSet, XmlSerializer i StreamWriter

136
HASH funkcije
• Jednosmerne funkcije koje od različitog ulaza daju različit izlaz, ali uvek
iste dužine (koja zavisi od vrste funkcije)
• Namespace: System.Security.Cryptography
• Algoritmi:
◦ MD5
◦ RIPEMD160
◦ SHA1
◦ SHA256
◦ SHA384
◦ SHA512

137
HASH funkcije
• ComputeHash metoda svakog algoritma (klase)
• ulaz je byte[ ] – prezentacija teksta na kome se primenjuje hash
• izlaz je takodje byte[ ] – hash-ovan tekst

Najčešće se koriste Encoding funkcije (System.Text namespace) :


string -> byte[ ] Encoding.Unicode.GetBytes(string)
byte[ ] -> string Encoding.Unicode.GetString(byte[ ])

138