четвртак, 21. јул 2016.

Rad sa drajverima, folderima i fajlovima u C# programskom jeziku


Bez obzira da li radite sa drajverima, folderima ili fajlovima; retko će te biti u situaciji da radite samo sa folderima ili samo sa fajlovima. U većini slučajeva gde su vam potrebni fajlovi, tu su vam potrebni i drajveri i folderi. Naravno kad kažem drajveri ne mislim na drajvere datoteke za hardverske uređaje u vašim računarima, nego drajvere zovemo i alfabete koji vidite kao root node u direktorijumu kad pokrenete File Explorer ili Command Prompt. Srećom i zahvaljujući Microsoft programerima; .Net Framework vam svojim klasama itekako olakšava rad sa istim, s time da vi trebate da poznajete određene klase i metode. Jednostavno treba da poznajete rad sa klasama poput Environment, DriveInfo, Directory, DirectoryInfo, File i FileInfo. Poznavanjem ovih par klasa niste ni svesni koliki programerski posao će one obavljati za vas.


( Klase koje morate znati; Environment, DriveInfo, Directory, DirectoryInfo, File i FileInfo )  

Do sada ste verovatno primetili da smo klasu okruženja Environment već koristili skoro u svim C# primerima na ovom blogu; jednostavno smo umesto eskejp sekvence \n za prelazak u novi red koristili Environment.NewLine. Neki od mojih kolega smatraju da sam to radio radi čitljivosti koda i nije im jasno zašto ne koristim eskejp sekvence \n jer skraćuje kod; često se koristi u školama i u knjigama za C# programiranje. Istina je da uvek trebate voditi računa i o čitljivosti koda, mada treba da znate i da se prelazak u novi red na različitim operativnim sistemima ne kompajlira isto. Npr. u Windows-u je to "\r\n" (\u000D\u000A) , na iOS operativnom sistemu je to "\r" (\u000D) dok je na Unix sistemu "\n" (\u000A). Većini programera; pogotovo onih koji koriste samo Windows operativni sistem to nije ni toliko bitno, ali iz tog razloga postoji preporuka Microsoft-a da se uvek koristi Environment.NewLine umesto eskejp sekvence \n kad god je to moguće i ja jednostavno poštujem preporuku. Međutim, klasa okruženja Environment ne služi samo za tu svrhu, već takođe obezbeđuje i informacije o platformi i okruženju na kom radite. Pogledajte samo neke od propertije i metode klase Environment.
  • CurrentDirectory – properti koji omogućava set-ovanje i čitanje tekućeg direktorijuma 
  • Is64BitOperatingSistem – properti koji vraća vrednost true ukoliko koristite 64bit-ni operativni sistem
  • MachineName – properti koji prikazuje NetBIOS ime lokalnog kompjutera ili ne iz bezbednosnih razloga
  • NewLine – properti koji se koristi za prelazak u novi red
  • OSVersion – properti koji prikazuje indikator za tekući OS i verziju
  • SystemDirectory – properti koji prikazuje putanju sistemskog direktorijuma
  • GetLogicalDrives – metoda prikazuje niz imena drajvera u tekućem kompjuteru
  • Itd.
Za razliku od klase Environment, klasa Directory ne sadrži uopšte propertije, samo korisne metode za rad sa direktorijuma poput:
  • CreateDirectory – kreira direktorijume i pod direktorijume ukoliko već ne postoje
  • Delete – briše prazan direktorijum
  • Exists – proverava da li postoji navedeni direktorijum
  • GetCurrentDirectory – metoda koja vraća string tekućeg direktorijuma
  • GetDirectories – metoda koja vraća pod direktorijume u direktorijumu prema zadatom obrascu
  • Itd.
Kako se koriste navedene klase najbolje će te shvatiti njihovom praktičnom primenom. U svakom slučaju da bi ste koristili mogućnosti navedeni klasa predlažem vam da prvo uključite imenski prostor System.IO u vašem projektu.

Praktičan primer rada sa drajverima i folderima

петак, 17. јун 2016.

Događaji u C# programskom jeziku


Event – događaj u C# programskom jeziku je način da klasa ili objekat pruži obaveštenje drugim klasama ili objektima da se nešto važno dogodilo. Klasa koja generiše događaj naziva se publisher – izdavač dok klasa koja prima ili obrađuje događaj se naziva subcriber – pretplatnik. Klasa publisher definiše kad će se generisati događaj dok klasa subscriber odlučuje koja će se akcija preduzeti. Obično klasa pretplatnik sadrži čitavu listu metoda koji se pozivaju kad se izazove događaj i takve metode takođe zovemo subscribers - pretplatničke metode. Kada programeri rade sa događajima, uglavnom se to odnosi na programiranje aplikacije sa grafičkim okruženjem ili web aplikacijama, zato što su takve aplikacije vođene događajima. Na primer kad god vi kliknete na neku stavku u meniju ili neko dugme na formi mišem; vi zapravo aktivirate određeni događaj i na osnovu pokrenutog događaja se izvršava kod koji se nalazi u proceduri događaja za stavku menija ili dugmeta koje ste pritisnuli. Kako će ceo tok programa da se izvršava zavisi od događaja koje korisnik aktivira sve do izlaska iz aplikacije. Zato kažemo da su navedene aplikacije vođene događajima. Događaji se retko koriste u konzolnim aplikacijama ali i u njima mogu da imaju svoju primenu.


( Događaji u C# programskom jeziku )

Deklaracija događaja je jednostavna, stime da su događaji namenjeni da se koriste sa delegatima. Jednostavno tip događaja mora da bude delegat i zato ispred delegata mora da se nalazi ključna reč event. U .Net Framework-u su događaji bazirani na EventHandler delegatu. O delegatima čitajte ovde, a sintaksa za deklarisanje događaja je sledeća:


event DelegatDogadjaja imeDogadjaja;

Kao i kod delegate, pretplata na događaj se vrši operatorom +=

ImeDogadjaja += new DelegatDogadjaja (ImeMetode);

Dok se odjava, otkazivanje pretplate vrši operatorom -=

ImeDogadjaja -= new DelegatDogadjaja (ImeMetode);

Pre generisanja događaja se uvek proverava da li događaj ima null vrednost:

if (ImeDogadjaja != null)
{
    ImeDogadjaja.Invoke();

}

Događaje će te najbolje naučiti koristeći praktične primere. Pogledajte jedan od njih.

Praktičan primer događaja

четвртак, 16. јун 2016.

Delegati u C# programskom jeziku



Delegati su neka vrsta pokazivača na metode koji su objektno orjentisani i strogo tipizirani. Najjednostavnije rečeno delegat je referenca na metodu. Najlakše će te ih razumeti ukoliko zamislite da su delegati potpis metoda. Delegati vam omogućavaju da se logika vaše aplikacije u vašim metodama potpuno razdvoji od aplikacija koje su ih pozvale. Inače mnogi programeri ne shvataju zašto bi koristili delegate kad mogu pozvati metodu i ne vide njihovu svrhu. Delegati su predviđeni za situacije u kojima metodama želite da prenosite druge metode. Ja razumem da ste vi navikli da metodama prenosite podatke preko parametara ali ne i metode. Međutim postoje situacije u kojima će vaš metod umesto da za obradu podataka, poziva drugi metod i da bi situacija bila još komplikovanija vi čak i ne znate koji je taj drugi metod koji će se pozivati. Jer to možete znati jedino u fazi izvršavanja i zbog toga je neophodno pozivanje metode preko parametra i zato se koriste delegati.



( Delegati u C# programskom jeziku )

Delegati se često koriste kada radite sa nitima, klasama biblioteka i događajima. Delegate koje nameravate da koristite prvo treba da definišete. To u prevodu znači da vi definisanjem delegata saopštavate kompajleru koju vrstu metoda vaš delegat predstavlja. Svaki delegat se definiše unutar imenskog prostora ili klase. Zatim pravite jedan ili više primeraka tog delegata. Delegati mogu biti i sa i bez parametara. Sintaksa za delegata izgleda ovako; prvo se definiše delegat korišćenjem ključne reči delegate:

public delegate string ImeDelegata(string patrametar);

Delegat se može instancirati ovako:

public ImeDelegata mojDelegat = null;

Delegatu se može dodati referenca koristeći += operator:

mojDelegat += TestMetoda;

ili

mojDelegat = new ImeDelegata(TestMetoda);

Delegatu se takođe može ukloniti referenca koristeći -= operator:

mojDelegat -= TestMetoda;

Sve ovo vam može zvučati i izgledati nerazumljivo ali kad pogledate praktične primere upotrebe delegata, shvatićete koliko je to jednostavno. Ono što je najbitnije treba da razumete da se delegati izvršavaju dinamički; u toku izvršavanja; i da delegat može pokazivati na bilo koju metodu koja ima isti potpis kao i delegat. Pogledajte jednostavan primer kako se koristi delegat sa više metoda.

Primer upotrebe delegata

недеља, 12. јун 2016.

Generičke liste u C# programskom jeziku


Prvo sam vam objasnio šta su negeneričke kolekcije; pogledajte ovde; zatim sam vam pokazao šta su generici i kako se prave; pogledajte ovde; i sad su došle na red generičke liste s kojima možete sva tri posta zaokružiti u jednu veliku celinu o svim kolekcijama uopšteno. Sa poznavanjem kolekcija vaše programiranje ali i čitanje koda drugih programera će vam biti mnogo efikasnije. Mada i dalje ostajem pri tome da po pitanju pravljenja igrica, posebno za Windows Phone aplikacije ili UWP – Universal Window Platform aplikacije izbegavate kolekcije jer su skupe. U svakom slučaju testirajte. Ali za sve ostale vrste aplikacija, kolekcije jednostavno olakšavaju programerima kodiranje i smanjuju kod. Kolekcije su uglavnom povezane za rad sa podacima koji potiču iz baza podataka, klasa ili drugih datoteka; često su isprepletene sa drugim programerskim aktivnostima poput taskova, događaja, delegata ili jednostavno služe da ispune neku kontrolu u programima sa grafičkim okruženjem; poput ListBox-a ili ComboBox-a; ali u jedno možete biti sigurni; gde su kolekcije tu su i podaci i kad manipulišete sa podacima vi to jednostavno radite preko kolekcija.



( Generičke kolekcije olakšavaju programiranje )

Uglavnom, sve što važi za generike to važi i za generičke liste. Sve generičke liste se nalaze u imenskom prostoru System.Collection.Generic; sve su parametorizovane kako bi izbegle boxing i unboxing objekata i kad radite sa generičkim listama tada radite sa tipom podataka koje ste definisali; svi elementi u kolekciji moraju da imaju isti tip podataka; i sve generičke liste su takođe safe type. Tokom vašeg programiranja češće će te koristiti generičke liste nego što će te praviti svoje generike jer već postojeće generičke liste mogu da odrade mnogobrojne poslovne zahteve. I pored toga što neke generičke liste imaju isti naziv poput negenerički kolekcija; razlikuju se po tome što zahtevaju parametre pri samoj deklaraciji iste. Znači, generičke liste koristite kada znate koji tip podataka hoćete da koristi vaša lista i kad hoćete da svaki elemenat u kolekciji bude istog tipa.

Generička kolekcija List<>


недеља, 05. јун 2016.

Šta su generici i kako se prave?


Pod pojmom generici u većini slučajeva se podrazumevaju sve klase koje sadrži imenski prostor System.Collection.Generic. Često se generičke klase, generičke liste ili uopšteno sve generičke kolekcije svrstavaju pod pojmom generici, ali za iskusnije programere kad kažete generici to se uglavnom misli na generičke klase, metode, strukture i sve što zahteva parametre. Znači češće se misli na nešto što ste vi sami isprogramirali da bude generičko dok pod pojmom generičke liste se misli na generičke liste koje već postoje u imenskom prostoru System.Collection.Generic. U prethodnom postu „Negeneričke kolekcije u C# programskom jeziku“ sam objasnio šta su negeneričke kolekcije, koje postoje u System.Collection imenskom prostoru i dao sam vam jednostavan primer kako da pravite vlastitu negeneričku klasu iako se takve retko prave. Takođe sam vam naveo da su generičke kolekcije za razliku od negenerički kolekcija; one kolekcije koje su parametorizovane; znači moraju imati određen tip podataka i svi elementi u kolekciji moraju biti istog tipa podataka.


( Generici u C# programskom jeziku )


Jednostavno, generičke kolekcije koriste se kad želite da svi elementi u kolekciji budu istog tipa podataka i zato su type safe. Izuzetno su korisni kada želite da izbegnete hard kodirane tipove i ne morate da pamtite koja vrsta podataka se koristi. Takođe nemate potrebe ni za eksplicitnom konverzijom. To se sve odnosi i na generike i na generičke liste i uopšteno na sve generičke kolekcije. Inače pod pojmom generici ću se isključivo baviti pravljenjem vlastitih generički kolekcija. Vi ćete u vašim programima često koristiti već napravljene generičke liste iz klasa .Net-a, ali će te takođe često dolaziti u situaciju da sami pravite svoje generike. Još samo jedna napomena. Ukoliko pravite igrice, korišćenje uopšteno svih kolekcija se smatra skupo, uzima više memorije i može usporiti igricu, pa u tom slučaju preporučujem da izbegavate kolekcije iako programerima olakšavaju posao. Inače u poslovnim aplikacijama, kolekcije se koriste konstantno ali generičke kolekcije. Kada pokrenete Microsoft Visual Studio, primetiće te da se imenski prostor System.Collection.Generic insertuje u vašim aplikacijama dok to nije slučaj sa imenskim prostorom System.Collection. To vam je takođe znak da treba da koristite generičke kolekcije ako već koristite kolekcije.

Generička klasa sa jednim parametrom

понедељак, 30. мај 2016.

Negeneričke kolekcije u C# programskom jeziku


Verovatno se sećate šta su nizovi iako sam nizove opisao među prvim postovima C# programskog jezika; pogledajte ovde. Za razliku od nizova kolekcije su vam veći progres od nizova i mnogo se više koriste u programiranju. Tačnije kolekcije predstavljaju skup objekata kojima je moguće pristupati elemenat po elemenat. To u praksi znači da je kolekcija set objekata kojima se pristupa korišćenjem petlje foreach. Razlika između nizova i kolekcija je pre svega u tome što u većini nizova unapred trebate odrediti veličinu, dok to sa kolekcijama nije slučaj. Kolekcije imaju mnogo više funkcionalnosti nego nizovi. Ali pogledajte prvo od čega se sastoji kolekcija.



( Grafički prikaz kolekcija u C# programskom jeziku )

Kolekcije se nalaze u imenskom prostoru System.Collection. Mogu da budu generičke i negeneričke. Generičke kolekcije su parametorizovane, znači moraju imati određen tip podataka i svi elementi u kolekciji moraju biti istog tipa. Generičke kolekcije se za razliku od negenerički kolekcija nalaze u imenskom prostoru System.Collections.Generic i omogućavaju vam type safe i nemate potrebe za konverzijom vaših podataka. Dok negeneričke kolekcije rade sa tipom podataka object. Na taj način vi negeneričke kolekcije možete koristiti da u njih smestite podatke različitog tipa podataka koje možete kasnije koristiti konverzijom istih kastingom. Negeneričke klase nisu type safe i retko se koriste. Svaka kolekcija da bi uopšte bila kolekcija pre svega mora da implementira enumerator koji može da prođe kroz sve elemente u kolekciji. To u prevodu znači da svaka kolekcija koristi interfejse IEnumerable ili interfejs ICollection koji je izveden iz interfejsa IEnumerable dok se obadva interfejsa nalaze u imenskom prostoru System.Collections. Interfejs ICollection koriste sofisticiranije kolekcije, dok vi takođe možete u vašim klasama koristiti koju hoćete. Međutim neke kolekcije koriste i interfejse IList, negeneričku kolekciju stavki kome se može pristupiti preko indeksa ili IDictionary negeneričku listu parova kojima se pristupa kroz ključ ili vrednost. Vi i sami možete da pravite čak vaše kolekcije ukoliko nasledite apstraktnu baznu klasu CollectionBase u vašu klasu. Kolekcije se deklarišu instanciranjem jer kolekcije jesu klase i isto se deklarišu:

Kolekcija MojaKolekcija = new Kolekcija ();


Posle deklaracije možete da vašoj kolekciji dodajete elemente, menjate, brišete i druge aktivnosti u zavisnosti kakvu kolekciju koristite. Negeneričke liste su vam ArrayList, Queue, Stack, Hashtable i SortedList. Pa krenimo redom.

ArrayList kolekcija


петак, 27. мај 2016.

Asinhrono, async i await višenitno programiranje

Dolaskom C# programskog jezika verzije 5, u C# programski jezik su uključene dve nove ključne reči async i await, dve komande koje ne idu jedna bez druge. Laički rečeno, tamo gde vidite da je metoda definisana sa async, u toj metodi trebate imati i ključnu reč await. Njihova magija je u tome što one omogućavaju višenitno programiranje ali bez direktnog formiranja niti. Sve do pojave asinhronog programiranja, svi vaši .Net programi bez dodatnog programiranja su sve operacije izvršavale sekvencijalno. To u prevodu znači da su se operacije izvršavale jedna po jedna i svaka operacija je morala čekati da se svaka prethodna operacija izvrši do kraja. Kad god napravite aplikaciju poput Windows Form, ona poseduje samo jednu nit; Main thread – glavnu ili UI nit; i sad zamislite da u toj niti koristite I/O operaciju. Vaš Windows će tada čekati dok vi pristupate nekom fajlu na hard disku ili mreži dok god se vaša operacija ne izvrši do kraja. Zbog toga Windows pauzira vašu nit tako da on ne koristi ni jedan CPU resurs ali na taj način zadržava memoriju.


( Asinhronizovano programiranje )

Asinhrono programiranje je jednostavno rešilo ovaj problem, jer asinhrono programiranje za razliku od sekvencijalnog ili sinhronog programiranja vam omogućava da vi pokrenete neku metodu i nastavljate da radite neki drugi posao dok se metoda ne završi. Inače sa sinhronim programiranjem pokrećete neku metodu; morate da čekate da se metoda izvrši do kraja; prosledi vam se neki rezultat i onda se nastavlja vaše izvršavanje programa. Danas se u programiranju koristi i jedna i druga varijanta u zavisnosti da li radite sa I/O operacijama ili jednostavno vam je potrebno više vremena da se izvrši neka metoda. Danas celi koncept Funkcionalnog programiranja je daleko bolji kad se radi preko asinhronizovani delegata, dok na primer UWP ili Phone aplikacija bez asinhroni metoda je nezamisliva jer svaka metoda koja radi duže od 2 sekunde je neprihvatljiva. Asinhrono programiranje se koristi kad imate kompleksne upite koje uzimaju dosta vremena, šaljete email-ove ili radite sa fajlovima. Nadam se da vam je sad jasno koliko je asinhrono programiranje bitno, ali takođe treba da znate da asinhronizovano programiranje nije lako jer se vi morate pobrinuti da ništa ne krene pogrešno, takođe je komplikovano debugovanje i održavanje istog. Ključnu reč async koristite da markirate metodu za asinhronizovanu operaciju. Na taj način vi samo dajete signal vašem kompajleru da će se nešto asinhronizovano desiti. Kompajler tada transformiše vašu kod u programersku C# paradigmu koju zovemo state machine. Znači pokreće sinhronično trenutnu nit, ali vam omogućava da vašu metodu razdvojite u više delova. Kad koristite await ključnu reč, kompajler će generisati kod koji će te videti bez obzira da li je vaša asinhronizovana operacija završena. Ako se vaša metoda samo sinhronizovano nastavlja, u prevodu nije završena; onda će state machine spojiti sa kontinuiranom metodom koja će se pokrenuti kada se task završi. Prepustiće kontrolu pozivajućoj niti i ta nit će se moći koristiti za drugi posao. Imajte u vidu da asinhronizovana metoda može da vrati rezultat samo kao void, Task i Task<T>.

Kako izgleda neki praktični primer asinhronog programiranja?