Sunteți pe pagina 1din 5

Caracteristicile limbajului C# Aa cum am mai spus, limbajul C# este un limbaj simplu, modern, orientat pe obiecte conceput pentru a dezvolta

aplicaii care s ruleze pe platforma .Net Framework. Combin productivitatea limbajelor de dezvoltare rapid a aplicaiilor cu puterea brut a limbajului C++. Codul C# este compilat ca i cod de baz, ceea ce nseamn c beneficiaz de serviciile CLR. Aceste servicii includ interoperabilitea limbajelor, garbage collection, securitate ridicat i suportul versiunilor mbuntite. n cele ce urmeaz voi descrie cteva caracteristici ale limbajului. 3.4.1. Tipuri de date n .NET (i, implicit, n C#), tipurile de date se mpart n dou categorii principale: tipuri valoare i tipuri referin. Diferena dintre ele este c variabilele de tip referin conin referine (pointeri) spre datele propriu-zise, care se afl n heap, pe cnd variabilele de tip valoare conin valorile efective. Aceast deosebire se observ, de exemplu, la atribuiri sau la apeluri de funcii. La o atribuire care implic tipuri referin, referina spre un obiect din memorie este duplicat, dar obiectul n sine este unul singur (are loc fenomenul de aliasing - mai multe nume pentru acelai obiect). La o atribuire care implic tipuri valoare, coninutul variabilei este duplicat n variabila destinaie. Tipurile valoare sunt structurile (struct) i enumerrile (enum). Tipuri referin sunt clasele (class), interfeele (interface), tablourile i delegrile (delegate). Poate prea surprinztor, dar unele din tipurile "primitive" cu care suntem obinuii din C (int, de exemplu), sunt tot structuri. Altele, cum ar fi string, sunt clase. Singurul lucru care le face mai speciale n C# este faptul c, la compilare, textul din codul surs este identificat i convertit automat n instane ale acestor tipuri. n plus, pentru aceste tipuri, exist cuvinte cheie C# prin care sunt descrise, dar i clase .NET care reprezint implementarea propriu-zisa. 3.4.2. Tablouri Un tablou este o structur de date care conine un numr de variabile numite elemente, accesate prin intermediul unuia sau mai multor indici ntregi. Tablourile sunt tipuri referin, iar pentru a crea un tablou trebuie alocat explicit spaiu cu operatorul new. n acest caz, un tablou este efectiv creat, iar valorile elementelor sunt iniializate cu valoarea implicit a tipului. Pentru a crea un tablou de obiecte (tipuri referin), trebuie creat nti tabloul, elementele acestuia vor fi iniializate implicit cu null, dup care tabloul trebuie parcurs i elementele sale iniializate explicit de ctre programator cu valori diferite de null. 3.4.3.Clase O clas este o structur de date care poate conine date (variabile i constante) i cod (metode, proprieti, evenimente, operatori, constructori i destructori). Clasele pot fi derivate din alte clase, prin acest mecanism clasele derivate putnd extinde, specializa sau modifica comportamentul clasei de baz. Clasele reprezint piatra de temelie a programrii pe obiecte. Acest concept pornete de la aseriunea c datele sunt strns legate de codul care le prelucreaz i c gruparea lor ntr-o structur

comun (spre deosebire de limbajele procedurale, n care datele sunt separate de cod) duce la o proiectare, implementare, testare i ntreinere mai simpl. Clasele sunt tipuri referin, ceea ce nseamn c datele membru ale instanelor se afl n heap i programul are acces la ele prin referine. Referinele sunt pstrate corespunztor de runtime i n cazul n care nu mai exist referine spre o instan, memoria folosit de aceasta este recuperat automat. Sunt eliminate astfel o serie ntreag de defecte software legate de dealocarea memoriei - n C++ pot aprea situaii n care memoria nu este dealocat i este pierdut pn la oprirea programului sau situaii n care memoria este dealocat de o component dar alt component ncearc ulterior s scrie la acea adres pentru c are un pointer pe care l crede valid. Membrii unei clase pot fi statici; n acest caz, exist o singur instan a lor care este accesibil din toate instanele clasei respective; n situaia n care membri statici sunt i publici, ei vor fi accesibili din alte clase fr a avea nevoie de o instan a clasei respective. Mai mult, ei nu pot fi accesai prin intermediul unor instane, ci numai folosind numele clasei. De asemenea, pot fi definite metode statice. n mod similar, acestea aparin clasei i nu instanelor acesteia i pot fi apelate folosind numele clasei. n general, acioneaz asupra membrilor statici sau efectueaz operaii pentru care nu este necesar o instan a clasei. 3.4.4. Drepturi de acces ncapsularea reprezint un aspect esenial al programrii pe obiecte i nseamn, pe scurt, posibilitatea de a separa implementarea unui obiect de funcionalitatea pe care acesta o pune la dispoziie utilizatorilor si. Prin implementarea unui obiect ne referim, n general, la variabilele membru ale obiectului respectiv i la metodele interne, care contribuie la realizarea funcionalitii obiectului, dar care nu sunt necesare utilizatorilor obiectului respectiv. Drepturile de acces reprezint modalitatea prin care putem ascunde de utilizatorii clasei detaliile de implementare ale acesteia. Cei cinci specificatori de acces n C# i semnificaia lor sunt: - private - Membrii privai sunt accesibili numai din clasa n care sunt declarai. - internal - Membrii interni sunt accesibili numai din clase care fac parte din acelai assembly cu clasa n care sunt declarai. - protected - Membrii protejai sunt accesibili din clasa n care sunt declarai i din clasele derivate din aceasta. - protected internal - Membrii interni i protejai sunt accesibili din clasa n care sunt declarai, din clasele care fac parte din acelai assembly i din clasele derivate, indiferent n ce assembly sunt acestea. - public - Membrii publici sunt accesibili din orice clas. Dac specificatorul de acces lipsete, membrii unei clase sunt implicit privai. 3.4.5. Date membru O clas este alctuit din membrii motenii din clasa de baz i din membrii declarai n corpul clasei. Datele pot fi variabile, constante, sau variabile read-only. Diferena dintre constante si variabile read-only este ca valoarea constantelor poate fi calculata la compilare si plasata n fiierul executabil ca

atare, pe cnd valoarea variabilelor read-only este calculata la rulare. Implicit, pot fi declarate doar constante aparinnd tipurilor recunoscute de compilator ca "primitive". Variabilele read-only pot fi de orice tip si pot avea valori care nu sunt cunoscute la compilare. 3.4.6. Constructori Constructorul este o metod care implementeaz aciunile care au loc la crearea i iniializarea unei instane a clasei. Are acelai nume ca i clasa din care face parte i nu returneaz nici o valoare, nici mcar void. Poate apela un alt constructor al aceleiai clase sau un constructor al clasei de baza. Poate avea orice nivel de acces. Nici un constructor, compilatorul insereaz automat un constructor public, fr argumente, care iniializeaz automat toate variabilele cu valorile lor implicite. 3.4.7. Motenire Prin motenire se nelege crearea unei clase derivate care conine implicit toi membrii (mai puin constructorii, constructorul static i destructorul) unei alte clase, numite de baz. Motenirea se mai numete i derivare sau, mai rar, specializare. n C#, motenirea se realizeaz punnd ":" dup numele clasei, urmat de numele clasei de baz. O clas poate avea o singur clas de baz. Dac o clas nu este derivat explicit din nici o clas, compilatorul o face implicit s fie derivat din obiect. Object este rdcina ierarhiei de clase din .NET. Motenirea este tranzitiv, n sensul c dac A este derivat din B i B este derivat din C, implicit A va conine i membrii lui C (i, evident, pe cei ai lui B). Prin motenire, o clas derivat extinde clasa de baz. Clasa derivat poate aduga noi membri, dar nu i poate elimina pe cei existeni. Dei clasa derivat conine implicit toi membrii clasei de baz, acest fapt nu nseamn ca i i poate accesa. Membrii privai ai clasei de baza exist i n clasa derivat, dar nu pot fi accesai. n acest fel, clasa de baz i poate schimba la nevoie implementarea intern fr a distruge funcionalitatea claselor derivate existente. O referin la clasa derivat poate fi tratat ca o referin la clasa de baz. Aceasta conversie se numete upcast, din cauz c n reprezentrile ierarhiilor de clase, clasele de baz se pun deasupra, cele derivate dedesubtul lor, ca ntr-un arbore generalizat. Prin upcast se urc n arbore. Conversia invers, de la clasa de baz la cea derivat, se numete downcast i trebuie fcut explicit, deoarece nu tim dac referina indic spre un obiect din clasa de baz, spre un obiect din clasa derivat la care ncercm s facem conversia sau spre un obiect al altei clase derivate din clasa noastr de baz. Accesibilitatea trebuie sa fie consistent i n cazul n care ncercm s derivm o clas din alta. Clasa de baz trebuie sa fie cel puin la fel de accesibil ca i clasa derivat din ea. O clas derivat poate ascunde membri ai clasei de baz, declarnd membri cu aceeai semntur. Prin aceasta, membrii clasei de baz nu sunt eliminai, ci devin inaccesibili prin referine la clasa derivat. Ascunderea membrilor se face folosind cuvntul cheie new. Acest cuvnt cheie are rolul de a-l obliga pe programator s-i declare explicit inteniile i face, n acest fel, codul mai lizibil.

3.4.8. Metode 3.4.8.1. Suprancrcarea metodelor n C#, este posibil, ca i n C++ sau Java s avem mai multe metode cu acelai nume n cadrul aceleiai clase. n C#, la suprancrcare se tine cont de numele metodei, de tipul argumentelor, de categoria lor (de intrare, intrare-ieire, ieire), de numrul i de ordinea lor. Semntura unei metode nu include tipul returnat, numele argumentelor sau argumentele variabile de la sfritul listei de argumente. Suprancrcarea metodelor i operatorilor se mai numete i polimorfism static, deoarece putem obine comportamente diferite prin acelai apel de funcie, dar comportamentul este totui bine determinat la compilare. 3.4.8.2. Metode cu numr variabil de argumente n C#, este posibil ca o metoda s primeasc un numr variabil de argumente. Argumentele variabile sunt transmise ntr-un tablou, iar numele acestui tablou trebuie precedat n declaraia funciei de cuvntul cheie params. 3.4.8.3. Metode virtuale i polimorfism Polimorfismul este a treia piatr de temelie a programrii pe obiecte. Dac ncapsularea afecteaz n mod direct uurina de implementare i utilizare a claselor prin separarea implementrii de funcionalitate, iar motenirea reprezint o modalitate simpl de reutilizare a codului, polimorfismul reprezint componenta eseniala cnd vine vorba despre extensibilitate. O metod virtual este o metod care poate fi suprascris ntr-o clas derivat. 3.4.9. Proprieti Proprietile sunt membri care ofer acces la atributele unui obiect. Exemple de proprieti includ lungimea unui ir de caractere, lungimea unui tablou, mrimea unui font, titlul unei ferestre amd. Proprietile pot prea sinonime cu variabilele membru ale unei clase - au nume, au tip i sunt folosite n mod similar de utilizatorii clasei, cu aceeai sintax. Cu toate acestea, proprietile difer de variabilele membru prin faptul c nu reprezint spatii de memorie, ci funcii de acces. Aceste funcii de acces sunt executate cnd utilizatorii clasei ncearc s obin sau s modifice aceste atribute. Ele sunt similare cu modelul get/set din alte limbaje de programare (aa i sunt implementate intern), dar ofer o modalitate mai coerenta de lucru mpreun cu aceleai avantaje posibilitatea de a valida argumentele furnizate la modificarea atributelor sau de a anuna alte obiecte despre modificrile aprute, de exemplu. 3.4.10. Destructori n .NET, memoria ocupat de obiecte este automat recuperata de un garbage colector n momentul cnd nu mai este folosit. Uneori, ns, un obiect este asociat cu resurse care nu depind de .NET i care trebuie dealocate explicit, ntr-un fel sau altul. Un exemplu de astfel de resurse l reprezint conexiunile TCP/IP, care nu pot fi lsate la voia ntmplrii.

De obicei, este bine s se elibereze astfel de resurse n momentul cnd nu mai sunt necesare i vom vedea puin mai ncolo cum se face acest lucru. Exist ns i o plas de siguran oferit de compilator, reprezentat de destructori. Destructorii sunt metode care au acelai nume cu clas din care fac parte, precedat de semnul ~. Nu au drepturi de acces, nu au argumente i nu permit nici un fel de specificatori (static, virtual same). Nu pot fi invocai explicit, ci numai de librriile .NET specializate pe recuperarea memoriei. Ordinea i momentul n care sunt apelai sunt nedefinite, ca i firul de execuie n care sunt executai. Este bine ca n aceste metode s dealocai numai obiectele care nu pot fi dealocate automat de .NET i s nu facei nici un fel de alte operaii.

S-ar putea să vă placă și