Documente Academic
Documente Profesional
Documente Cultură
Introducere in .Net Framework - Suport de Curs Pentru Elevi PDF
Introducere in .Net Framework - Suport de Curs Pentru Elevi PDF
Adrian Ni
profesor, Colegiul Naional Emanuil Gojdu, Oradea
Maria Ni
profesor, Colegiul Naional Emanuil Gojdu, Oradea
Nicolae Olroiu
profesor, Colegiul Naional B.P. Hadeu, Buzu Suport de curs pentru elevi
Rodica Pintea
profesor, Liceul Grigore Moisil, Bucureti (capitolul 1)
Cristina Sichim
profesor, Colegiul Naional Ferdinand I, Bacu
Daniela Taras
Inspector Informatic, ISJ Bacu
Coordonatori:
Mihai Ttran
cadru didactic asociat, Universitatea Politehnic Timioara
Nua Dumitriu-Lupan
inspector General MECT
Petru Jucovschi
Developer Community Lead, Microsoft Romnia
Introducere n
.Net Framework
Ediia 2008
Cerine de sistem
Arhitectura suportat:
x86
x64 (WOW)
Cerine Hardware:
Minimum: CPU 1.6 GHz, RAM 192 MB, Rezoluie Monitor 1024x768, Disc 5400 RPM
Recomandat: CPU 2.2 GHz sau mai puternic, RAM 384 MB sau mai mult, rezoluie monitor 1280x1024,
Disc 7200 RPM sau mai mult.
Windows Vista: CPU 2.4 GHz, RAM 768 MB, Spaiu liber disc 1.3 GB pentru instalare complet
Resurse i Instrumente:
www.microsoft.ro/ark - Academic Resource Kit, colecie de instrumente software i resurse
educaionale.
Cuvnt nainte
Dragi elevi,
Suportul de curs este publicat n dou versiuni. Cea pentru elevi cuprinde doar com-
ponenta de specialitate. Versiunea pentru profesori cuprinde pe lng componenta
de specialitate i pe cea metodic de predare.
Sanda Foamete
SNR Manager de Proiecte Educaionale
Microsoft Romnia
Autori, n ordine alfabetic:
Coordonatori:
Editat de BYBLOS SRL sub coordonarea Agora Media SA, pentru Microsoft Romnia. Ediia 2008.
ISBN: 973-86699-5-2
Not:
Acest suport de curs este destinat elevilor de la clasele matematic-informatic i matematic-informatic
intensiv, care au optat n programa colar, pentru variantele: Programare orientat obiect, Progamare
vizual cu C# i Programare web cu Asp.Net. Suportul de curs poate fi utilizat gratuit exclusiv n procesul
de predare-nvare. Este interzis utilizarea suportului de curs Introducere n .Net Framework pentru
scopuri comerciale sau n alte scopuri n afara celui descris mai sus.
Drepturile de autor asupra suportului de curs Introducere n .Net Framework aparin Microsoft.
Introducere n .Net Framework (Suport de curs) 3
CUPRINS
1 Programarea Orientat Obiect (POO) cu C# . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
1.1. Evoluia tehnicilor de programare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
1.2. Tipuri de date obiectuale. ncapsulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
1.3. Suprancrcare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
1.4. Motenire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
1.5. Polimorfism. Metode virtuale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
1.6. Programare orientat obiect n C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
1.7. Declararea unei clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
1.8. Constructori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12
1.9. Destructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
1.10. Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
1.11. Proprieti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
1.12. Evenimente i delegri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
1.13. Interfee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
3. Limbajul C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
3.1. Caracterizare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
3.2. Compilarea la linia de comand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
3.3. Crearea aplicaiilor consol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26
3.4. Structura unui program C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27
3.5. Sintaxa limbajului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
3.6. Tipuri de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30
3.7. Conversii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34
3.7.1. Conversii numerice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34
3.7.2. Conversii ntre numere i iruri de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36
3.7.3. Conversii boxing i unboxing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38
3.8. Constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
3.9. Variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
3.10. Expresii i operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
3.11. Instruciuni condiionale, de iteraie i de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
3.11.1. Instruciunea if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
4 Introducere n .Net Framework (Suport de curs)
6. ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89
6.1. Arhitectura ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90
6.2. Furnizori de date (Data Providers) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90
6.3. Connection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90
6.3.1. Exemple de conectare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91
6.3.2. Proprieti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91
6.3.3. Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92
6.3.4. Evenimente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92
6.4. Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92
6.4.1. Proprieti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .93
6.4.2. Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .93
6.4.3. Interogarea datelor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
6.4.4. Inserarea datelor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
6.4.5. Actualizarea datelor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
6.4.6. tergerea datelor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96
6.5. DataReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .99
6.5.1. Proprieti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .99
6.5.2. Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .99
6.6. DataAdapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .101
6.6.1. Proprieti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .102
6.6.2. Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .102
6.7. DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .102
6.8. SqlParameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104
6.9. Proceduri Stocate (Stored Procedures) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .105
6.10. Proiectarea vizual a seturilor de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .106
7
CAPITOLUL 1
Programarea Orientat Obiect (POO) cu C#
1.3. Suprancrcare
Dei nu este o tehnic specific programrii orientat obiect, ea creeaz un anu-
mit context pentru metodele ce formeaz o clas i modul n care acestea pot fi (ca
orice subprogram) apelate.
Prin suprancarcare se nelege posibilitatea de a defini n acelai domeniu de
vizibilitate2 mai multe funcii cu acelai nume, dar cu parametri diferiti ca tip i/sau ca
numr. Astfel ansamblul format din numele funciei i lista sa de parametri reprezin-
t o modalitate unic de identificare numit semntur sau amprent. Supra-
1 Datorit tehnicii de suprancrcare C++, Java i C# permit existena mai multor constructori
2 Noiunile generale legate de vizibilitate se consider cunoscute din programarea procedural. Aspectele specifice
i modificatorii de acces/vizibilitate pot fi studiai din documentaiile de referin C#.
10 Introducere n .Net Framework (Suport de curs)
ncrcarea permite obinerea unor efecte diferite ale apelului n contexte diferite3.
Apelul unei funcii care beneficiaz, prin suprancrcare, de dou sau mai multe
semnturi se realizeaz prin selecia funciei a crei semntur se potrivete cel mai
bine cu lista de parametri efectivi (de la apel).
Astfel, poate fi definit metoda comand on-line cu trei semnturi diferite:
comanda_online(cod_prod) cu un parametru ntreg (desemnnd comanda unui singur
produs identificat prin cod_prod.
comanda_online(cod_prod,cantitate) cu primul parametru ntreg i celalalt real
comanda_online(cod_prod,calitate) cu primul parametru ntreg i al-II-lea caracter.
1.4. Motenire
Pentru tipurile de date obiectuale class este posibil o operaie de extindere sau
specializare a comportamentului unei clase existente prin definirea unei clase noi ce
motenete datele i metodele clasei de baz, cu aceast ocazie putnd fi redefinii
unii membri existeni sau adugai unii membri noi. Operaia mai poart numele de
derivare.
Clasa din care se motenetea se mai numete clas de baz sau superclas. Clasa
care motenete se numete subclas, clas derivat sau clas descendent.
Ca i n Java, n C# o subclas poate moteni de la o singur superclas, adic avem
de-a face cu motenire simpl; aceeai superclas ns poate fi derivat n mai multe
subclase distincte. O subclas, la randul ei, poate fi superclas pentru o alt clas
derivat. O clas de baz impreun cu toate clasele descendente (direct sau indirect)
formeaza o ierarhie de clase. n C#, toate clasele motenesc de la clasa de baz Object.
n contextul mecanismelor de motenire trebuie amintii modificatorii abstract i
sealed aplicai unei clase, modificatori ce oblig la i respectiv se opun procesului de
derivare. Astfel, o clas abstract trebuie obligatoriu derivat, deoarece direct din ea
nu se pot obine obiecte prin operaia de instaniere, n timp ce o clas sigilat
(sealed) nu mai poate fi derivat (e un fel de terminal n ierarhia claselor). O metod
abstract este o metod pentru care nu este definit o implementare, aceasta urmnd
a fi realizat n clasele derivate din clasa curent4. O metod sigilat nu mai poate fi
redefinit n clasele derivate din clasa curent.
3 Capacitatea unor limbaje (este i cazul limbajului C#) de a folosi ca "nume" al unui subprogram un operator, repre-
zint suprancrcarea operatorilor. Aceasta este o facilitate care "reduce" diferenele dintre operarea la nivel abstract
(cu DTA) i apelul metodei ce realizeaz acest operaie la nivel de implementare obiectual. Dei ajut la sporirea
expresivitii codului, prin suprancrcarea operatorilor i metodelor se pot crea i confuzii.
4 care trebuie s fie i ea abstract (virtual pur, conform terminologiei din C++)
5 deoarece tot aspecte polimorfice mbrac i unele tehnici din programarea clasic sau tehnica suprancrcrcrii
funciilor i operatorilor.
CAPITOLUL 1. Programarea orientat obiect (POO) cu C# 11
rii avnd ns acelai nume. Astfel, n cazul unei referiri obiectuale, se pune problema
stabilirii datei sau metodei referite. Comportamentul polimorfic este un element de
flexibilitate care permite stabilirea contextual, n mod dinamic6, a membrului referit.
De exemplu, dac este definit clasa numit PIESA (de ah), cu metoda nestatic
muta(pozitie_initiala,pozitie_finala), atunci subclasele TURN i PION trebuie s
aib metoda muta definit n mod diferit (pentru a implementa maniera specific a
pionului de a captura o pies en passant7). Atunci, pentru un obiect T, aparinnd
claselor derivate din PIESA, referirea la metoda muta pare nedefinit. Totui mecanis-
mele POO permit stabilirea, n momentul apelului, a clasei proxime creia i aparine
obiectul T i apelarea metodei corespunztore (mutare de pion sau tur sau alt
pies).
Pentru a permite acest mecanism, metodele care necesit o decizie contextual (n
momentul apelului), se declar ca metode virtuale (cu modificatorul virtual). n mod
curent, n C# modificatorului virtual al funciei din clasa de baz, i corespunde un
specificator override al funciei din clasa derivat ce redefinete funcia din clasa de
baz.
O metod ne-virtual nu este polimorfic i, indiferent de clasa creia i aparine
obiectul, va fi invocat metoda din clasa de baz.
6 Este posibil doar n cazul limbajelor ce permit "legarea ntrziat". La limbajele cu "legare timpurie", adresa la care
se face un apel al unui subprogram se stabilete la compilare. La limbajele cu legare ntrziat, aceast adresa se sta-
bileste doar in momentul rulrii, putndu-se calcula distinct, n funcie de contextul n care apare apelul.
7 ntr-o alt concepie, metoda muta poate fi implementat la nivelul clasei PIESA i redefinit la nivelul subclasei
PION, pentru a particulariza acest tip de deplasare care captureaz piesa peste care trece pionul n diagonal.
8 echivalentrul claselor template din C++
9 [] din definiia schematic semnific un neterminal, iar o semnific o component opional
12 Introducere n .Net Framework (Suport de curs)
1.8. Constructori
Sintaxa:
[atrib]o [modificatori]o [nume_clas]([list_param_formali]o)[:iniializator]o [corp_constr]o
Modificatori: public protected internal private extern
Iniializator: base([list_param]o), this([list_param]o) ce permite invocarea unui
constructor anume12 nainte de executarea instruciunilor ce formeaz corpul con-
structorului curent. Dac nu este precizat niciun iniializator, se asociaz implicit
iniializatorul base().
Corpul constructorului este format din instruciuni care se execut la crearea unui
10 avnd n vedere c ele pot s fac parte dintr-o clas interioar altei clase
11 din semntur nefcnd parte specificatorii ref i out asociai parametrilor
12 Din clasa de baz (base) sau din clasa insi (this)
CAPITOLUL 1. Programarea orientat obiect (POO) cu C# 13
nou obiect al clasei respective (sau la crearea clasei, n cazul constructorilor cu mo-
dificatorul static).
pot exista mai muli constructori care se pot diferenia prin lista lor de parametri
constructorii nu pot fi motenii
dac o clas nu are definit niciun constructor, se va asigna automat constructorul
fr parametri al clasei de baz (clasa object, dac nu este precizat clasa de baz)
Instanierea presupune declararea unei variabile de tipul clasei respective i
iniializarea acesteia prin apelul constructorului clasei (unul dintre ei, dac sunt
definii mai muli) precedat de operatorul new. Acestea se pot realiza i simultan ntr-o
instruciune de felul:
[Nume_clas] [nume_obiect]=new [Nume_clas] ([list_param]o)
Exist dou motive pentru care definiia constructorului al treilea din clasa Fetita
este greit i de aceea este comentat. Care sunt aceste motive?
1.9. Destructor
Sintaxa: [atrib]o [extern]o ~[nume_clas] () [corp_destructor]o
Corpul destructorului este format din instruciuni care se execut la distrugerea
unui obiect al clasei respective. Pentru orice clas poate fi definit un singur construc-
tor. Destructorii nu pot fi motenii. n mod normal, destructorul nu este apelat n
mod explicit, deoarece procesul de distrugere a unui obiect este invocat i gestionat
automat de Garbagge Collector.
1.10. Metode
Sintaxa:[atrib]o[modificatori]o[tip_returnat][nume]([list_param_formali]o) [corp_metoda]o
Modificatori: new public protected internal private static virtual abstract sealed
override extern15
Tipul rezultat poate fi un tip definit sau void. Numele poate fi un simplu identifica-
tor sau, n cazul n care definete n mod explicit un membru al unei interfee, numele
este de forma [nume_interfata].[nume_metoda]
Lista de parametri formali este o succesiune de declarri desprite prin virgule,
declararea unui parametru avnd sintaxa: [atrib]o [modificator]o [tip] [nume]
Modificatorul unui parametru poate fi ref (parametru de intrare i ieire) sau out
(parametru care este numai de ieire). Parametrii care nu au niciun modificator sunt
parametri de intrare.
Un parametru formal special este parametrul tablou cu sintaxa:
[atrib]o params [tip][] [nume].
Pentru metodele abstracte i externe, corpul metodei se poate reduce la un semn ;
Semntura fiecrei metode este format din numele metodei, modificatorii aces-
teia, numrul i tipul parametrilor16
Numele metodei trebuie s difere de numele oricrui alt membru care nu este
metod.
La apelul metodei, orice parametru trebuie s aib acelai modificator ca la definire
Invocarea unei metode se realizeaz prin sintagma [nume_obiect].[nume_metoda]
(pentru metodele nestatice) i respectiv [nume_clas].[nume_metoda] (pentru
metodele statice).
Definirea datelor i metodelor statice corespunztoare unei clase
15 Poate fi folosit cel mult unul dintre modificatorii static, virtual I override ; nu pot aprea mpreun new i over-
ride, abstract nu poate s apar cu niciunul dintre static, virtual, sealed, extern; private nu poate s apar cu niciunul
dintre virtual, override i abstract; seald oblig i la override
16 Din semntur (amprent) nu fac parte tipul returnat, numele parametrilor formali i nici specificatorii ref i out.
CAPITOLUL 1. Programarea orientat obiect (POO) cu C# 15
17 Se are n vedere i constructorul fr parametri definit i preluat implicit n subclasele din cadrul primului exem-
plu din subcapitolul 1.8: public Copil() {nume = Console.ReadLine();}
18 Dect cu ajutorul modificatorului new pentru metoda respectiv n clasa derivat
16 Introducere n .Net Framework (Suport de curs)
1.11. Proprieti
Proprietatea este un membru ce permite accesul controlat la datele-membru ale
clasei.
Sintaxa: [atrib]o [modificatori]o [tip] [nume_proprietate] {[metode_de_acces]o}
Observaiile privind modificatorii i numele metodelor sunt valabile i n cazul pro-
prietilor.
Metodele de acces sunt dou: set i get. Dac proprietatea nu este abstract sau
extern, poate s apar una singur dintre cele dou metode de acces sau amn-
dou, n orice ordine.
Este o manier de lucru recomandabil aceea de a proteja datele membru (cm-
puri) ale clasei, definind instrumente de acces la acestea: pentru a obine valoarea
cmpului respectiv (get) sau de a memora o anumit valoare n cmpul respectiv
(set). Dac metoda de acces get este perfect asimilabil cu o metod ce retuneaz o
valoare (valoarea datei pe care vrem s-o obinem sau valoarea ei modificat conform
unei prelucrri suplimentare specifice problemei n cauz), metoda set este asimi-
labil cu o metod care un parametru de tip valoare (de intrare) i care atribuie (sau
nu, n funcie de context) valoarea respectiv cmpului. Cum parametrul corespunz-
tor valorii transmise nu apare n structura sintactic a metodei, este de stiut c el este
implicit identificat prin cuvntul value. Dac se supune unor condiii specifice proble-
mei, se face o atribuire de felul cmp=value.
Definirea n clasa Copil a proprietii Nume, corespunztoare cmpului protejat ce
reine, sub forma unui ir de caractere, numele copilului respctiv. Se va observ c
proprietatea este motenit i de clasele derivate Fetita i Biat19.
19 Desigur c proprietatea care controleaz accesul la cmpul identificat prin nume se poate numi cu totul altfel (pro-
prietatea Nume fiind uor de confundat cu cmpul de date nume).
CAPITOLUL 1. Programarea orientat obiect (POO) cu C# 17
20 De observat c n exemplul anterior (subcapitolul 1.10), cmpul nume era declarat public, pentru a permite acce-
sul "general" la cmpul respectiv de date. Iar metodele i constructorii foloseau identificatorul nume i nu propri-
etatea Nume.
18 Introducere n .Net Framework (Suport de curs)
1.13. Interfee
Interfeele sunt foarte importante n programarea orientat pe obiecte, deoarece
permit utilizarea polimorfismului ntr-un sens mai extins.O interfa este o compo-
nent a aplicaiei, asemntoare unei clase, ce declar prin membrii si (metode, pro-
prieti, evenimente i indexatori) un comportament unitar aplicabil mai multor
clase, comportament care nu se poate defini prin ierarhia de clase a aplicaiei.
De exemplu, dac vom considera arborele din figura urmtoare, n care AVERE
este o clas abstract, iar derivarea claselor a fost conceput urmrind proprietile
comune ale componentelor unei averi, atunci o clas VENIT nu este posibil,
deoarece ea ar moteni de la toate clasele evideniate, iar motenirea multipl nu
este admis n C#.
Pentru metodele din cadrul unei interfee nu se d nici o implementare, ci sunt pur
i simplu specificate, implementarea lor fiind furnizat de unele dintre clasele apli-
caiei25. Nu exist instaniere n cazul interfeelor, dar se admit derivri, inclusiv
moteniri multiple.
n exemplul nostru, se poate defini o interfa VENIT care s conin antetul unei
metode calc (s zicem) pentru calculul venitului obinut, fiecare dintre clasele care
implementeaz interfaa VENIT fiind obligat s furnizeze o implementare (dup o
formul de calcul specific) pentru metoda calc din interfa. Orice clas care dorete
s adere la interfa trebuie s implementeze toate metodele din interfa. Toate
clasele care motenesc dintr-o clas care implementeaz o interfa motenesc, evi-
dent, metodele respective, dar le pot i redefini (de exemplu, clasa Credit_acordat
redefinete metoda calc din clasa Investiie, deoarece formula de calcul implemen-
tat acolo nu i se potrivete i ei26).
De exemplu, dac presupunem c toate clasele subliniate implementeaz interfaa
VENIT, atunci pentru o avere cu aciuni la dou firme, un imobil nchiriat i o
25 Acele clase care "ader" la o interfa spunem c "implementeaz" interfaa respectiv
26 Dac n sens polimorfic spunem c Investiie este i de tip Bani i de tip Avere, tot aa putem spune c o clas care
implementeaz interfaa VENIT i clasele derivate din ea sunt i de tip VENIT
20 Introducere n .Net Framework (Suport de curs)
Gsii dou motive pentru care interfaa VENIT i rezovarea de mai sus ofer o
soluie mai bun dect: t=act1.calc()+act2.calc()+casa.calc()+dep.calc().
21
CAPITOLUL 2
Platforma .NET
2.1 Prezentare
.NET este un cadru (Framework) de dezvoltare software unitar care permite
realizarea, distribuirea i rularea aplicaiilor-desktop Windows i aplicaiilor WEB.
Tehnologia .NET pune laolalt mai multe tehnologii (ASP, XML, OOP, SOAP,
WDSL, UDDI) i limbaje de programare (VB, C++, C#, J#) asigurnd totodat att
portabilitatea codului compilat ntre diferite calculatoare cu sistem Windows, ct i
reutilizarea codului n programe, indiferent de limbajul de programare utilizat.
.NET Framework este o component livrat mpreun cu sistemul de operare
Windows. De fapt, .NET 2.0 vine cu Windows Server 2003, se poate instala pe versi-
unile anterioare, pn la Windows 98 inclusiv; .NET 3.0 vine instalat pe Windows
Vista i poate fi instalat pe versiunile Windows XP cu SP2 i Windows Server 2003 cu
minimum SP1.
Pentru a dezvolta aplicaii pe platforma .NET este bine sa avem 3 componente
eseniale:
un set de limbaje (C#, Visual Basic .NET, J#, Managed C++, Smalltalk, Perl,
Fortran, Cobol, Lisp, Pascal etc),
un set de medii de dezvoltare (Visual Studio .NET, Visio),
i o bibliotec de clase pentru crearea serviciilor Web, aplicaiilor Web i apli-
caiilor desktop Windows.
Cnd dezvoltm aplicaii .NET, putem utiliza:
Servere specializate - un set de servere Enterprise .NET (din familia SQL Server
2000, Exchange 2000 etc), care pun la dispoziie funcii de stocare a bazelor de
date, email, aplicaii B2B (Bussiness to Bussiness comer electronic ntre
partenerii unei afaceri).
Servicii Web (n special comerciale), utile n aplicaii care necesit identificarea
utilizatorilor (de exemplu, .NET Passport - un mod de autentificare folosind un
singur nume i o parol pentru toate ste-urile vizitate)
Servicii incluse pentru dispozitive non-PC (Pocket PC Phone Edition,
Smartphone, Tablet PC, Smart Display, XBox, set-top boxes, etc.)
.NET Framework
Componenta .NET Framework st la baza tehnologiei .NET, este ultima interfa
22 Introducere n .Net Framework (Suport de curs)
Componenta .NET Framework este format din compilatoare, biblioteci i alte exe-
cutabile utile n rularea aplicaiilor .NET. Fiierele corespunztoare se afl, n general,
n directorul C:\WINDOWS\Microsoft. NET\Framework\V2.0. (corespunztor versiu-
nii instalate)
CAPITOLUL 3
Limbajul C#
3.1. Caracterizare
Limbajul C# fost dezvoltat de o echip restrns de ingineri de la Microsoft, echip
din care s-a evideniat Anders Hejlsberg (autorul limbajului Turbo Pascal i membru
al echipei care a proiectat Borland Delphi).
C# este un limbaj simplu, cu circa 80 de cuvinte cheie, i 12 tipuri de date prede-
finite. El permite programarea structurat, modular i orientat obiectual, conform
perceptelor moderne ale programrii profesioniste.
Principiile de baz ale programrii pe obiecte (NCAPSULARE, MOTENIRE,
POLIMORFISM) sunt elemente fundamentale ale programrii C#. n mare, limbajul
motenete sintaxa i principiile de programare din C++. Sunt o serie de tipuri noi de
date sau funciuni diferite ale datelor din C++, iar n spiritul realizrii unor secvene
de cod sigure (safe), unele funciuni au fost adugate (de exemplu, interfee i
delegri), diversificate (tipul struct), modificate (tipul string) sau chiar eliminate
(motenirea multipl i pointerii ctre funcii). Unele funciuni (cum ar fi accesul
direct la memorie folosind pointeri) au fost pstrate, dar secvenele de cod corespun-
ztoare se consider nesigure.
using System;
class primul
{
static void Main()
{ Console.WriteLine(Primul program);
Console.ReadKey(true);
}
}
26 Introducere n .Net Framework (Suport de curs)
O aplicatie C# este format din una sau mai multe clase, grupate n spaii de nume
(namespaces). Un spaiu de nume cuprinde mai multe clase cu nume diferite avnd
funcionaliti nrudite. Dou clase pot avea acelai nume cu condiia ca ele s fie de-
finite n spaii de nume diferite. n cadrul aceluiai spaiu de nume poate aprea
definiia unui alt spaiu de nume, caz n care avem de-a face cu spaii de nume imbri-
28 Introducere n .Net Framework (Suport de curs)
cate. O clas poate fi identificat prin numele complet (nume precedat de numele
spaiului sau spaiilor de nume din care face parte clasa respectiv, cu separatorul
punct). n exemplul nostru, HelloWorld.Program este numele cu specificaie com-
plet al clasei Program.
O clas este format din date i metode (funcii). Apelarea unei metode n cadrul
clasei n care a fost definit aceasta presupune specificarea numelui metodei. Apelul
unei metode definite n interiorul unei clase poate fi invocat i din interiorul altei
clase, caz n care este necesar specificarea clasei i apoi a metodei separate prin
punct. Dac n plus, clasa aparine unui spaiu de nume neinclus n fiierul curent,
atunci este necesar precizarea tuturor componentelor numelui: spaiu.clas.metod
sau spaiu.spaiu.clas.metod etc.
n fiierul nostru se afl dou spaii de nume: unul definit (HelloWorld) i unul
extern inclus prin directiva using (System). Console.WriteLine reprezint apelul
metodei WriteLine definit n clasa Console. Cum n spaiul de nume curent este
definit doar clasa Program, deducem c definiia clasei Console trebuie s se
gseasc n spaiul System.
Pentru a facilita cooperarea mai multor programatori la realizarea unei aplicaii
complexe, exist posibilitatea de a segmenta aplicaia n mai multe fiiere numite
assemblies. ntr-un assembly se pot implementa mai multe spaii de nume, iar pri
ale unui aceeai spaiu de nume se pot regsi n mai multe assembly-uri. Pentru o
aplicaie consol, ca i pentru o aplicaie Windows de altfel, este obligatoriu ca una
(i numai una) dintre clasele aplicaiei s conin un punct de intrare (entry point),
i anume metoda (funcia) Main.
S comentm programul de mai sus:
linia 1: este o directiv care specific faptul c se vor folosi clase incluse n spaiul
de nume System. n cazul nostru se va folosi clasa Console.
linia 3: spaiul nostru de nume
linia 5: orice program C# este alctuit din una sau mai multe clase
linia 7: metoda Main, punctul de intrare n program
linia 9: clasa Console, amintit mai sus, este folosit pentru operaiile de
intrare/ieire. Aici se apeleaz metoda WriteLine din acest clas, pentru afiarea
mesajului dorit pe ecran.
27 Este un termen folosit un pic echivoc i provenit din traduceriea cuvntului "token"
CAPITOLUL 3. Limbajul C# 29
comentariu pe mai multe rnduri prin folosirea /* i */ Orice text cuprins ntre
simbolurile menionate mai sus se consider a fi comentariu. Simbolurile /* repre-
zint nceputul comentariului, iar */ sfritul respectivului comentariu.
/* Acesta este un
comentariu care se
intinde pe mai multe randuri */
Nume
Prin nume dat unei variabile, clase, metode etc. nelegem o succesiune de carac-
tere care ndeplinete urmtoarele reguli:
numele trebuie s nceap cu o liter sau cu unul dintre caracterele _ i @;
primul caracter poate fi urmat numai de litere, cifre sau un caracter de subliniere;
numele care reprezint cuvinte cheie nu pot fi folosite n alt scop dect acela
pentru care au fost definite
cuvintele cheie pot fi folosite n alt scop numai dac sunt precedate de @
dou nume sunt distincte dac difer prin cel puin un caracter (fie el i liter
mic ce difer de aceeai liter majuscul)
Convenii pentru nume:
n cazul numelor claselor, metodelor, a proprietilor, enumerrilor, interfeelor,
spaiilor de nume, fiecare cuvnt care compune numele ncepe cu majuscul
n cazul numelor variabilelor dac numele este compus din mai multe cuvinte,
primul ncepe cu minuscul, celelalte cu majuscul
Cuvinte cheie n C#
Exemple:
Tipul enumerare
Tipul enumerare este un tip definit de utilizator. Acest tip permite utilizarea
numelor care, sunt asociate unor valori numerice. Toate componentele enumerate au
un acelai tip de baz ntreg. n cazul n care, la declarare, nu se specific tipul de baz
al enumerrii, atunci acesta este considerat implicit int.
Declararea unui tip enumerare este de forma:
Observaii:
n mod implicit valoarea primului membru al enumerrii este 0, iar fiecare varia-
bil care urmeaz are valoarea (implicit) mai mare cu o unitate dect precedenta.
Valorile folosite pentru iniializri trebuie s fac parte din domeniul de valori
declarat al tipului
Nu se admit referine circulare:
enum ValoriCirculare
{
a = b,
b
}
32 Introducere n .Net Framework (Suport de curs)
Exemplu:
using System;
namespace tipulEnum
{
class Program
{
enum lunaAnului
{
Ianuarie = 1,
Februarie, Martie, Aprilie, Mai, Iunie, Iulie,
August, Septembrie, Octombrie, Noiembrie, Decembrie
}
static void Main(string[] args)
{
Console.WriteLine(Luna Mai este a {0},
(int)lunaAnului.Mai + -a luna din an.);
Console.ReadLine();
}
}
}
Tablouri
Declararea unui tablou unidimensional:
Tip[] nume;
Prin aceasta, nu se aloc spaiu pentru memorare. Pentru a putea reine date n
structura de tip tablou, este necesar o operaie de instaniere:
nume = new Tip[NumarElemente];
Declararea, instanierea i chiar iniializarea tabloului se pot face n aceeai
instruciune:
Exemplu:
int[] v = new int[] {1,2,3}; sau
int[] v = {1,2,3}; //new este implicit
n cazul tablourilor cu mai multe dimensiuni facem distincie ntre tablouri regu-
late i tablouri neregulate (tablouri de tablouri)
Declarare n cazul tablourilor regulate bidimensionale:
Tip[,] nume;
Intaniere:
nume = new Tip[Linii,Coloane];
Acces:
nume[indice1,indice2]
CAPITOLUL 3. Limbajul C# 33
Exemple:
int[,] mat = new int[,] {{1,2,3},{4,5,6},{7,8,9}}; sau
int[,] mat = {{1,2,3},{4,5,6},{7,8,9}};
iruri de caractere
Se definesc dou tipuri de iruri:
regulate
de tip verbatim
Tipul regulat conine ntre ghilimele zero sau mai multe caractere, inclusiv
secvene escape.
Secvenele escape permit reprezentarea caracterelor care nu au reprezentare grafic
precum i reprezentarea unor caractere speciale: backslash, caracterul apostrof, etc.
n cazul n care folosim multe secvene escape, putem utiliza irurile verbatim.
Aceste iruri pot s conin orice fel de caractere, inclusiv caracterul EOLN. Ele se
folosesc n special n cazul n care dorim s facem referiri la fiiere i la regitri. Un
astfel de ir ncepe ntotdeauna cu simbolul@ naintea ghilimelelor de nceput.
Exemplu:
using System;
namespace SiruriDeCaractere
{
class Program
{
static void Main(string[] args)
{
string a = un sir de caractere;
string b = linia unu \nlinia doi;
string c = @linia unu
linia doi;
string d=c:\\exemple\\unu.cs;
string e = @c:\exemple\unu.cs;
Console.WriteLine(a); Console.WriteLine(b);
Console.WriteLine(c); Console.WriteLine(d);
Console.WriteLine(e); Console.ReadLine();
}
}
}
un sir de caractere
linia unu
linia doi
linia unu
linia doi
c:\exemple\unu.cs
c:\exemple\unu.cs
3.7. Conversii
3.7.1. Conversii numerice
n C# exist dou tipuri de conversii numerice:
implicite
explicite.
Conversia implicit se efectueaz (automat) doar dac nu este afectat valoarea
convertit.
CAPITOLUL 3. Limbajul C# 35
Exemplu:
using System;
using System.Collections.Generic;
using System.Text;
namespace Conversii
{
class Program
{
static void Main(string[] args)
{
byte a = 13; // byte intreg fara semn
// pe 8 biti
byte b = 20;
long c; //intreg cu semn pe 64 biti
c = a + b;
Console.WriteLine(c);
Console.ReadLine();
}
}
}
din n
sbyte short, int, long, float, double, decimal
byte short, ushort, int, uint, long, ulong, float, double, decimal
short int, long, float, double, decimal
ushort int, uint, long, ulong, float, double, decimal
int long, float, double, decimal
uint long, ulong, float, double, decimal
long float, double, decimal
char ushort, int, uint, long, ulong, float, double, decimal
float double
ulong float, double, decimal
Conversia explicit se realizeaz prin intermediul unei expresii cast, atunci cnd nu
exist posibilitatea unei conversii implicite.
using System;
using System.Collections.Generic;
using System.Text;
namespace Conversii1
{
36 Introducere n .Net Framework (Suport de curs)
class Program
{
static void Main(string[] args)
{
int a = 5;
int b = 2;
float c;
c = (float)a / b; //operatorul cast
Console.WriteLine({0}/{1}={2}, a, b, c);
Console.ReadLine();
}
}
}
se obine:
5/2 = 2,5
n cazul n care nu s-ar fi folosit operatorul cast rezultatul, evident eronat, ar fi fost:
5/2=2
din n
sbyte byte, ushort, uint, ulong, char
byte sbyte, char
short sbyte, byte, ushort, uint, ulong, char
ushort sbyte, byte, short, char
int sbyte, byte, short, ushort, uint, ulong, char
uint sbyte,byte, short, ushort, int, char
long sbyte, byte, short, ushort, int, uint, ulong, char
ulong sbyte, byte, short, ushort, int, uint, long, char
char sbyte, byte, short
float sbyte, byte, short, ushort, int, uint, long, ulong, char, decimal
double sbyte, byte, short, ushort, int, uint, long, ulong, char, float, decimal
decimal sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double
numr ir + numr
Exemplu:
using System;
namespace Conversii
{
class Program
{
static void Main(string[] args)
{
string s;
const int a = 13;
const long b = 100000;
const float c = 2.15F;
double d = 3.1415;
Console.WriteLine(CONVERSII\n);
Console.WriteLine(TIP\tVAL. \tSTRING);
Console.WriteLine();
s = + a;
Console.WriteLine(int\t{0} \t{1},a,s);
s = + b;
Console.WriteLine(long\t{0} \t{1},b,s);
s = + c;
Console.WriteLine(float\t{0} \t{1},c,s);
s = + d;
Console.WriteLine(double\t{0} \t{1},d,s);
Console.WriteLine(\nSTRING\tVAL \tTIP);
Console.WriteLine();
int a1;
a1 = int.Parse(13);
Console.WriteLine({0}\t{1}\tint,13,a1);
long b2;
b2 = long.Parse(1000);
Console.WriteLine({0}\t{1}\tlong,1000,b2);
float c2;
c2 = float.Parse(2,15);
Console.WriteLine({0}\t{1}\tfloat,2,15,c2);
38 Introducere n .Net Framework (Suport de curs)
double d2;
d2 = double.Parse(3.1415,
System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine({0}\t{1}\tdouble,3.1415,d2);
Console.ReadLine();
}
}
}
CONVERSII
TIP VAL. STRING
int 13 13
long 100000 100000
float 2,15 2,15
double 3,1415 3,1415
STRING VAL. TIP
13 13 int
1000 1000 long
2,15 2,15 float
3.1415 3,1415 double
sau
int i = 13;
object ob = i; //boxing implicit
3.8. Constante
n C# exist dou modaliti de declarare a constantelor: folosind const sau
folosind modificatorul readonly. Constantele declarate cu const trebuie s fie iniia-
lizate la declararea lor.
Exemple:
const int x; //gresit, constanta nu a fost initializata
const int x = 13; //corect
3.9. Variabile
O variabil n C# poate s conin fie o valoare a unui tip elementar, fie o referin
la un obiect.
Exemple:
int Salut;
int Azi_si _maine;
char caracter;
3.11.1 Instruciunea if
Instruciunea if are sintaxa:
if (conditie)
Instructiuni_A;
else
Instructiuni_B;
Exemplu:
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
int n;
Console.WriteLine(Introduceti un nr intreg );
n = Convert.ToInt32(Console.ReadLine());
if (n >= 0)
Console.WriteLine(Nr. introdus este > 0);
else
Console.WriteLine(Nr. introdus este < 0);
Console.ReadLine();
}
}
}
using System;
CAPITOLUL 3. Limbajul C# 41
namespace Test
{
class Program
{
static void Main(string[] args)
{
int n = 0;
while (n <= 10)
{
Console.WriteLine(n este {0}, n);
n++;
}
Console.ReadLine();
}
}
}
do
Instructiuni;
while(conditie)
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
int n = 0;
do
{
Console.WriteLine(n este {0}, n);
n++;
}
while (n <= 10);
Console.ReadLine();
}
}
}
42 Introducere n .Net Framework (Suport de curs)
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
for(int n=0; n<=10; n++)
{
Console.WriteLine(n este {0}, n);
}
Console.ReadLine();
}
}
}
switch (a)
{
case 13:
case 20:
x=5;
y=8;
break;
default:
x=1;
y-0;
break;
}
Exemplu:
switch(strAnimal)
{
case Pisica :
break;
case Catel :
break;
default:
break;
}
Exemplu:
using System;
namespace Salt
{
class Program
{
static void Main(string[] args)
{
int i = 0;
while(true)
{
Console.Write({0} ,i);
i++;
if(i<10)
continue;
else
break;
}
Console.ReadLine();
}
}
}
Se va afia:
0 1 2 3 4 5 6 7 8 9
Exemplu:
switch (a)
{
case 13:
x=0;
y=0;
goto case 20;
case 15:
x=3;
y=1;
goto default;
case 20:
x=5;
y=8;
break;
default:
x=1;
CAPITOLUL 3. Limbajul C# 45
y=0;
break;
}
Exemplu:
using System;
using System.IO;
namespace Exceptii
{
class tryCatch
{
static void Main(string[] args)
{
Console.Write(Numele fisierului:);
string s=Console.ReadLine(s);
try
{
File.OpenRead(s);
}
catch (FileNotFoundException a)
{
Console.WriteLine(a.ToString());
}
catch (PathTooLongException b)
{
Console.WriteLine(b.ToString());
}
finally
{
Console.WriteLine(Programul s-a sfarsit);
Console.ReadLine();
}
}
}
}
46 Introducere n .Net Framework (Suport de curs)
CAPITOLUL 4
Programarea web cu ASP.NET
4.1. Introducere
ASP.NET este tehnologia Microsoft care permite dezvoltarea de aplicaii web
moderne, utiliznd platforma Microsoft .NET cu toate beneficiile sale.
Pentru a nelege procesul de realizare a unui site web cu ASP.NET este important
s cunoatem modul n care funcioneaz comunicarea ntre browser i serverul web.
Acest proces este format din urmtoarele etape principale:
1 Browserul Web iniiaza o cerere (request) a unei resurse ctre serverul Web
unde este instalat aplicaia dorit.
2 Cererea este trimis serverului Web folosind protocolul HTTP.
3 Serverul Web proceseaz cererea.
4 Serverul web trimite un rspuns browserului folosind protocolul HTTP.
5 Browserul proceseaz rspunsul n format HTML, afind pagina web.
6 Utilizatorul poate introduce date (s spunem ntr-un formular), apas butonul
Submit i trimite date napoi ctre server.
7 Serverul Web proceseaz datele.
8 Se reia de la pasul 4.
Serverul web primete cererea (request), iar apoi trimite un rspuns (response)
napoi ctre browser, dup care conexiunea este nchis, i sunt eliberate resursele
folosite pentru procesarea cererii. Acesta este modul de lucru folosit pentru afiarea
paginilor statice (datele dintr-o pagin nu depind de alte date din alte pagini sau de
alte aciuni precedente ale utilizatorului) i nici o informaie nu este stocat pe server.
n cazul paginilor web dinamice, serverul poate s proceseze cereri de pagini ce
conin cod care se execut pe server, sau datele pot fi salvate pe server ntre dou
cereri din partea browserului.
Trimiterea datelor de la browser ctre server se poate realiza prin metoda GET sau
POST.
Prin GET, URL-ul este completat cu un ir de caractere (QueryString) format din
perechi de tipul cheie = valoare separate prin &.
48 Introducere n .Net Framework (Suport de curs)
Exemplu:
GET /getPerson.aspx?Id=1&city=Cluj HTTP/1.1
Prin Get nu se pot trimite date de dimensiuni mari, iar datorit faptului c datele
sunt scrise n URL-ul browser-ului, pot aprea probleme de securitate. De aceea, de
preferat este s se foloseasc metoda POST pentru trimiterea de date.
Trimiterea datelor napoi ctre server este numit deseori PostBack. Aciunea de
PostBack poate fi folosit att cu metoda GET ct i cu metoda POST. Pentru a ti
dac se trimit date (POST) sau pagina este doar cerut de browser (GET), cu alte
cuvinte pentru a ti dac pagina curent se ncarc pentru prim dat sau nu, n
ASP.NET se folosete o proprietate a clasei Page numit IsPostBack.
Seciunea de cod, conine codul C# asociat paginii sau obiectelor din pagin.
Codul poate fi plasat direct n pagina sau ntr-un fiier cu extensia .cs, cu acelai
nume ca al paginii (de ex. Default.aspx.cs). n cazul n care se gsete direct n pa-
gin, codul este cuprins ntre tag-urile <script> </script>:
<script runat=server>
protected void Button1_Click(object sender, EventArgs e)
{
Page.Title = First Web Application;
}
</script>
n cazul n care n fereastra pentru adugarea unei pagini noi n proiect, se bifeaz
opiunea Place code in separate file, codul este plasat ntr-un fiier separat, iar n
seciunea de directive este precizat numele acestui fiier.
Exemplu: CodeFile=Default.aspx.cs.
<body>
<form id=form1 runat=server>
<div>
<asp:Button ID=Button1 runat=server OnClick=Button1_Click
Text=Button /></div>
</form>
</body>
Exemple complete de aplicaii web putei gsi pe DVD-ul Academic Resource Kit (ARK),
instalnd Resurse\Visual Studio 2005\101 Samples CS101SamplesAll.msi sau descrcnd
cele 101 exemple de utilizare a Visual Studio 2005 de la adresa http://msdn2.
microsoft.com/en-us/vstudio/aa718334.aspx. Dup instalare, din aplicaia Microsoft
Visual Web Developer 2005 alegei din meniul File opiunea Open Web Site i selectai, din
directorul ..\CS101SamplesAll\CS101SamplesWebDevelopment\, aplicaia dorit. n fe-
reastra Solution Explorer selectai Start.aspx i apoi butonul View in Browser".
50 Introducere n .Net Framework (Suport de curs)
Cnd vom rula pagina, vom constata c totui nu se ntmpl nimic. Pentru a se
executa metoda CheckBox1_CheckedCanged, pagina trebuie retrimis serverului n
momentul bifrii checkbox-ului. Serverul trebuie s execute codul i apoi s retrimit
ctre browser pagina n care textbox-ul este vizibil sau nu. De aceea controlul check-
box trebuie s genereze aciunea de PostBack, lucru care se ntmpl dac este setat
valoarea true proprietii AutoPostBack. Unele controale genereaz ntotdeauna
Postback atunci cnd apare un anumit eveniment. De exemplu evenimentul click al
controlului button.
Exemplu de folosire a controalelor web putei gsi pe DVDul ARK, instalnd
Resurse\Visual Studio 2005\101 Samples CS101SamplesAll.msi sau descrcnd cele
101 exemple de utilizare a Visual Studio 2005 de la adresa http://msdn2.
microsoft.com/en-us/vstudio/aa718334.aspx, aplicaia MenuAndSiteMapPath.
4.4.2.1. Profile
<profile enabled=true>
<properties>
<add name =ProfileTest allowAnonymous =true/>
</properties>
</profile>
4.4.2.2. Session
Obiectul Session este creat pe serverul web la prima accesare a sitului de ctre un
utilizator i rmne n memorie n principiu att timp ct utilizatorul rmne conectat
la site. Exist i excepii, dar ele nu fac obiectul acestui material.
Pentru a aduga un obiect n sesiune, trebuie doar s scriem un cod de genul
urmtor:
Session este de fapt un dicionar (list de perechi cheie valoare), n care valo-
rile sunt de tip object. Ceea ce nseamn c la citirea unor valori din sesiune va tre-
bui s realizm o conversie de tip.
Odat introdus un obiect n Session, el poate fi accesat din toate paginile aplicaiei,
att timp ct el exist acolo. Programatorul poate realiza scoaterea obiectului din
sesiune atunci cnd dorete acest lucru:
Session.Remove(sir);
4.4.2.3. Application
dat, i nu unei anumite sesiuni. Cu alte cuvinte odat introdus un obiect n Applicatio,
va putea fi accesat din orice loc al sitului i de ctre toi utilizatorii acestuia.
Toate variabilele declarate ca fiind statice sunt specifice ntregii aplicaii i nu unei
anumite sesiuni. De exemplu, dac atunci cnd un site este accesat de Utilizator1 i
o variabil declarat:
static string test = init;
se modific de ctre acesta:
test = modificat;
atunci toi utilizatorii aplicaiei vor vedea valoarea modificat din acel moment
nainte.
4.4.3. Concluzii
n cazul obiectului ViewState, datele sunt salvate n pagina web sub forma unui ir
de caractere, iar n cazul obiectului Session respectiv Application n memoria
serverului web. Dac datele salvate sunt de dimensiuni mari, n primul caz crete
dimensiunea paginii web, care va fi transmis mai ncet, iar n al doilea caz rezult o
folosire excesiv a memoriei serverului web, ceea ce duce la scderea vitezei de
lucru. Aceast folosire excesiv a memoriei poate s apar i n cazul unei dimen-
siuni a datelor ceva mai redus, dar a unui numr mare de utilizatori care acceseaz
simultan pagina (pentru fiecare se va creea un obiect sesiune).
4.5.2. Validatoare
1 RequiredFieldValidator. Verific dac n csua de text asociat prin proprietatea
ControlToValidate s-a introdus text. Util pentru formularele n care anumite date
sunt obligatorii.
2 RangeValidator. Verific dac informaia introdus n csua de text asociat
face parte dintr-un anumit interval, specificat prin tipul datei introduse (prorie-
tatea Type) i MinimumValue respectiv MaximumValue.
3 RegularExpressionValidator. Verific dac informaia din csua de text asociat
este conform unei expresii regulate specificate. Este util pentru validarea unor
informaii de genul adreselor de email, numerelor de telefon, etc n general
informaii care trebuie s respecte un anumit format. Trebuie setat proprietatea
ValidationExpression n care se pot alege cteva expresii uzuale gata definite.
4 CompareValidator. Compar datele introduse n csua de text asociat cu o va-
loare prestabilit (ValueToCompare), n funcie de operatorul ales (proprietatea
Operator) i de tipul de date care se ateapt (proprietatea Type).
Aceste obiective pot fi atinse foarte uor utiliznd funcionalitile i uneltele din
ASP.NET respectiv Visual Studio, anume clasa Membership i unealta
ASP.NET Configuration (din meniul Website al Visual Studio Web Developer
Express). Configurarea autentificrii i autorizrii se poate realiza dup cum se vede
n acest tutorial:
http://msdn2.microsoft.com/en-us/library/879kf95c(VS.80).aspx.
Un exemplu de securizare a aplicailor web putei gsi pe dvd-ul ARK, instalnd
Resurse\Visual Studio 2005\101 Samples CS101SamplesAll.msi sau descrcnd cele
101 exemple de utilizare a Visual Studio 2005 de la adresa http://msdn2.
microsoft.com/en-us/vstudio/aa718334.aspx, aplicatia Security.
4.8. Resurse
Dezvoltarea de aplicaii web cu Visual Web Developer Express:
http://msdn.microsoft.com/vstudio/express/vwd/
59
CAPITOLUL 5
Programare vizual
28 Se utilizeaz ades antonimia dintre vizual (operaii asupra unor componente grafice) i textual (scriere de linii de
cod); proiectarea oricrei aplicaii "vizuale" mbin ambele tehnici.
29 Deciziile arhitecturale stabilesc n principal cum se leag interfaa de restul aplicaiei i ct de uor de ntreinut
este codul rezultat.
60 Introducere n .Net Framework (Suport de curs)
sau fiierele pe care aceasta le utilizeaz. Cu alte cuvinte, n cadrul interfeei cu utilizatorul,
nu se vor folosi obiecte de tipuri definite de programator, ci numai baza din .NET.
Nivelul de logic a aplicaiei
Se ocup de tot ceea ce este specific aplicaiei care se dezvolt. Aici se efectueaz
calculele i procesrile i se lucreaz cu obiecte de tipuri definite de programator.
Nivelul de acces la date
Aici rezid codul care se ocup cu accesul la baza de date, la fiiere, la alte servicii.
Aceast ultim structur este foarte bun pentru a organiza aplicaiile, dar nu este
uor de realizat. De exemplu, dac n interfaa cu utilizatorul prezentm date sub
form ListView i la un moment dat clientul ne cere reprezentarea datelor ntr-un
GridView, modificrile la nivel de cod nu se pot localiza doar n interfa deoarece
cele dou controale au nevoie de modele de acces la date total diferite.
Indiferent de modelul arhitectural ales, n realizarea aplicaiei mai trebuie respec-
tate i principiile proiectrii interfeelor:
Simplitatea
Interfaa trebuie s fie ct mai uor de neles30 i de nvat de ctre utilizator i
s permit acestuia s efectueze operaiile dorite n timp ct mai scurt. n acest sens,
este vital culegerea de informaii despre utilizatorii finali ai aplicaiei i a modului n
care acetia sunt obinuii s lucreze.
Poziia controalelor
Locaia controalelor dintr-o fereastr trebuie s reflecte importana relativ i
frecvena de utilizare. Astfel, cnd un utilizator trebuie s introduc nite informaii
unele obligatorii i altele opionale este indicat s organizm controalele astfel
nct primele s fie cele care preiau informaii obligatorii.
Consistena
Ferestrele i controalele trebuie s fie afiate dup un design asemntor (tem-
30 ntruct mintea uman poate s perceap la un moment dat aproximativ 5-9 obiecte, o fereastr supra-ncrcat
de controale o face greu de utilizat..
CAPITOLUL 5. Programare vizual 61
statice. Metoda Run invocat mai sus creeaz un formular implicit, aplicaia rspun-
znd la mesajele utilizatorului pn cnd formularul va fi nchis.
Compilarea modulelor aplicaiei i asamblarea lor ntr-un singur fiier exe-
cutabil se realizeaz cu ajutorul opiunilor din meniul Build, uzual fiind Build
Solution (F6).
Odat implementat, aplicaia poate fi lansat, cu asisten de depanare sau nu
(opiunile Start din meniul Debug). Alte faciliti de depanare pot fi folosite prin
umrirea pas cu pas, urmrirea pn la puncte de ntrerupere etc. (celelalte opiuni ale
meniului Debug). Ferestre auxiliare de urmrire sunt vizualizate automat n timpul pro-
cesului de depanare, sau pot fi activate din submeniul Windows al meniului Debug.
5.3. Ferestre
Spaiul Forms ne ofer clase specializate pentru: creare de ferestre sau formulare
(System.Windows.Forms.Form), elemente specifice (controale) cum ar fi butoane
(System.Windows.Forms.Button), casete de text (System.Windows.Forms.TextBox)
etc. Proiectarea unei ferestre are la baz un cod complex, generat automat pe msur
ce noi desemnm componentele i comportamentul acesteia. n fapt, acest cod rea-
lizeaz: derivarea unei clase proprii din System.Windows.Forms.Form, clas care
este nzestrat cu o colecie de controale (iniial vid). Constructorul ferestrei rea-
lizeaz instanieri ale claselor Button, MenuStrip, Timer etc. (orice plasm noi n fer-
eastr) i adaug referinele acestor obiecte la colecia de controale ale ferestrei.
Dac modelul de fereastr reprezint ferestra principal a aplicaiei, atunci ea este
instaniat automat n programul principal (metoda Main). Dac nu, trebuie s scriem
noi codul ce realizeaz instanierea.
Clasele derivate din Form motenesc o serie de proprieti care determin
atributele vizuale ale ferestrei (stilul marginilor, culoare de fundal, etc.), metode care
implementeaz anumite comportamente (Show, Hide, Focus etc.) i o serie de
metode specifice (handlere) de tratare a evenimentelor (Load, Clic etc.).
O fereastr poate fi activat cu form.Show() sau cu form.ShowDialog(), metoda a
doua permind ca revenirea n fereastra din care a fost activat noul formular s se
fac numai dup ce noul formular a fost inchis (spunem c formularul nou este
deschis modal).
Un propietar este o fereastr care contribuie la comportarea formularului deinut.
Activarea propietarului unui formular deschis modal va determina activarea formula-
rului deschis modal. Cnd un nou formular este activat folosind form.Show() nu va
avea nici un deintor, acesta stabilindu-se direct:
Vizibilitatea unui formular poate fi setat folosind metodele Hide sau Show. Pentru a
ascunde un formular putem folosi:
5.4. Controale
Unitatea de baz a unei interfee Windows o reprezint un control. Acesta poate fi
gzduit de un container ce poate fi un formular sau un alt control.
Un control este o instan a unei clase derivate din System.Windows.Forms i este
reponsabil cu desenarea unei pri din container. Visual Studio .NET vine cu o serie
de controale standard, disponibile n Toolbox. Aceste controale pot fi grupate astfel:
31 Dac va fi setat la 10% formularul i toate controalele sale vor fi aproape invizibile.
CAPITOLUL 5. Programare vizual 65
5.4.1. Controale form. Controlul form este un container. Scopul su este de a gzdui
alte controale. Folosind proprietile, metodele i evenimentele unui formular,
putem personaliza programul nostru.
n tabelul de mai jos vei gsi o list cu controalele cel mai des folosite i cu
descrierea lor. Exemple de folosire a acestor controale vor urma dup explicarea pro-
prietilor comune al controalelor i formularelor.
public Form1()
{
InitializeComponent();
this.Text = Primul formular;
}
this.Close();.
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
Casete de mesaje:
Pentru a crea o caset mesaj, apelm metoda MessageBox.Show();.ntr-o nou apli-
caie Windows, tragei un buton n formular, modificai textul butonului cum dorii
sau ca n imaginea alturat va apare un mesaj, executai dublu clic pe buton i
68 Introducere n .Net Framework (Suport de curs)
Casete de dialog
O caset de dialog este o form specializat de control de tip Form.
Exemplu:
Creai o nou aplicaie Windows, apoi tragei un buton n formular i setai propri-
etatea Text a butonului la : s avem un dialog, iar apoi executai dublu clic pe buton
i folosii urmtorul cod pentru administratorul evenimentului Click.
Creai un alt formular la acest proiect(alegei Add Windows Forms din meniul
Project), apoi n ordine: setai proprietatea ControlBox la valoarea false, setai propri-
etatea Text la caset de dialog, tragei n formular un control de tip Label i Text la
introdu text, adugai un control TextBox n formular, adugai dou butoane,
setai proprietatea Text a butonului din stnga la OK iar al celui din dreapta la
Cancel, setai proprietatea DialogResult a butonului din stanga la OK iar al celui din
dreapta la Cancel, executai clic pe formularul casetei de dialog i setai proprietatea
AcceptButton la OKButton iar proprietatea CancelButton la CancelButton. Acum exe-
cutai dublu clic pe butonul OK i folosii urmtorul cod pentru administratorul eveni-
mentului Click:
Executai dublu clic pe butonul Cancel i folosii urmtorul cod pentru administra-
torul evenimentului Click:
Creai o nou aplicaie Windows n care tragei 13 butoane pe care le vei poziiona
i numi ca n figura alturat, apoi mai adugai un TextBox(pe acesta l putei seta
s arate textul n stnga sau n dreapta).
Adugai un menuStrip care s conin elementele precizate mai sus, i pe care le
putei observa n figura alturat.
Facei dublu clic pe fiecare buton numeric n parte pentru a ajunge la surs i mo-
dificai fiecare surs respectnd codul de mai jos:
Am dat exemplu pentru tasta 7, dar atenie la fiecare tast, variabila v, va primi ca
valoare numrul afiat pe tasta respectiv.
Acum procedai la fel, i modificai sursa pentru butoanele + i -.
Un alt exemplu:
Se adaug pe formular dou butoane i o caset text. Apsarea primului buton va
determina afiarea textului din TextBox ntr-un MessageBox iar apsarea celui de-al
doilea buton va nchide nchide aplicaia.
CAPITOLUL 5. Programare vizual 71
Dup adugarea celor dou butoane i a casetei text, a fost schimbat textul afiat
pe cele dou butoane i au fost scrise funciile de tratare a evenimentului Click pen-
tru cele dou butoane:
Exemplul PV2 afieaz un grup alctuit din 3 butoane, etichetate A,B respectiv C
avnd iniial culoarea roie. Apsarea unui buton determin schimbarea culorii aces-
tuia n galben. La o nou apsare butonul revine la culoare iniial. Acionarea
butonului Starea butoanelor determin afiarea ntr-o caset text a etichetelor
butoanelor galbene. Caseta text devine vizibil atunci cnd apsm prima oar acest
buton. Culoarea butonului mare (verde/portocaliu) se schimb atunci cnd mouse-ul
este poziionat pe buton.
Aplicaia PV3 este un exemplu de utilizare a acestor controale. Soluia unei probleme
cu mai multe variante de rspuns este memorat cu ajutorul unor checkbox-uri cu
proprietatea ThreeState. Apsarea butonului Verific determin afiarea unei
etichete i a butoanelor radio DA i NU. Rspunsul este afiat ntr-un MessageBox.
Exerciiu (Test gril) Construii un test gril care conine 5 itemi cu cte 4 variante
de rspuns (alegere simpl sau multipl), memorai rspunsurile date i afiai, dup
efectuarea testului, ntr-o caset text, n dreptul fiecrui item, rspunsul corect.
Exerciiu (Filtru) Construii o aplicaie care afieaz fiierele dintr-un folder ales
care au un anumit tip (tipul fiierelor este ales de utilizator pe baza unui
CheckedListBox)
Graphics g = this.CreateGraphics();
// Deseneaza fiecare imagine utilizand metoda ImageList.Draw()
for (int i = 0; i < desene_animate.Images.Count; i++)
desene_animate.Draw(g, 60 + i * 60, 60, i);
g.Dispose();
}
Formularul din aplicaia PV7 conine un calendar pentru care putem selecta un
interval de maximum 30 de zile, sunt afiate sptmnile i ziua curent. Intervalul
selectat se afieaz prin intermediul unei etichete. Dac se selecteaz o dat atunci
aceasta va fi adugat ca item ntr-un ComboBox (orice dat poate aprea cel mult o
dat n list).
Dup adugarea celor 3 controale pe formular, stabilim proprietile pentru
monthCalendar1 (ShowWeekNumber-True, MaxSelectionCount-30, etc.) i precizm
ce se execut atunci cnd selectm un interval de timp:
76 Introducere n .Net Framework (Suport de curs)
ListView este folosit pentru a afia o colecie de elemente n unul din cele 4
moduri (Text, Text+Imagini mici, Imagini mari, Detalii). Acesta este similar gra-
fic cu ferestrele n care se afieaz fiierele dintr-un anumit director din
Windows Explorer. Fiind un control complex, conine foarte multe proprieti,
printre care: View (selecteaz modul de afiare (LargeIcon, SmallIcon, Details,
List)), LargeImageList, SmallImageList (icon-urile de afiat n modurile
LargeIcon, SmallIcon), Columns(utilizat doar n modul Details, pentru a defini
coloanele de afiat), Items(elementele de afiat).
Pentru item-ul selectat se afieaz mai nti folderele i dup aceea fiierele.
Pentru aceasta trebuie s determinm coninutul acestuia:
ListViewItem lvi;
ListViewItem.ListViewSubItem lvsi;
this.calea_curenta.Text = radacina + (Doublu Click pe folder);
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(radacina);
DirectoryInfo[] dirs = dir.GetDirectories();
FileInfo[] files = dir.GetFiles();
this.lista_fisiere.Items.Clear();
this.lista_fisiere.BeginUpdate();
i s adugm fiecare nou item ( coloana a doua este vid n cazul foldere-
lor):
Dm clic pe icoana de la timer care are numele aplCeas, iar la Events, la Tick selec-
tm lblCeas_Click
CAPITOLUL 5. Programare vizual 79
Formularul:
ProgressBar-urile:
Pentru Timer:
Control Proprietate Valoare Evenimente
Timer1 (Name) Timer1 Timer1_Tick
Enabled True
Interval 1.000
pentru timer1:
lblAfisOre.Text = H.ToString();
82 Introducere n .Net Framework (Suport de curs)
lblAfisMinute.Text = M.ToString();
lblAfisSecunde.Text = S.ToString();
}
pentru a redimensiona proporional ProgressBar-ul Ore cu cel care reprezint
Minutele, respectiv Secundele, introducem urmtorul cod:
n aplicaia urmtoare PV9 cele 3 butoane ale toolbar-ului permit modificarea pro-
prietilor textului introdus n caset. Toolbar-ul se poate muta fr a depi spaiul
ferestrei. Schimbarea fontului se realizeaz cu ajutorul unui control FontDialog(),iar
schimbarea culorii utilizeaz ColorDialog()
{ this.richTextBox1.Font= fd.Font;
this.richTextBox1.ForeColor=fd.Color;
}
ColorDialog cd = new ColorDialog();
cd.AllowFullOpen = true;cd.Color = Color.DarkBlue;
if(cd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
this.richTextBox1.ForeColor = cd.Color;
toolBar1.BorderStyle = BorderStyle.Fixed3D;
}}}
}
unde mainMenu1 i mainMenu2 sunt obiecte de tip MenuStrip. Editarea unui ast-
fel de obiect se poate face utiliznd Menu Designer. Clasa MenuStrip are o colecie
de MenuItem care conine 0 sau mai multe obiecte de tip MenuItem. Fiecare dintre
aceste obiecte de tip MenuItem are 0 sau mai multe obiecte de tip MenuItem, care
vor constitui noul nivel de itemi (Ex: File New,Save, Open, Close, Exit).
Propietile Checked i RadioCheck indic itemul selectat, Enabled and Visible
determin dac un item poate fi sau nu selectat sau vizibil, Shortcut permite
asignarea unei combinaii de taste pentru selectarea unui item al meniului i Text
CAPITOLUL 5. Programare vizual 85
Exemplul PV11 permite, prin intermediul unui meniu, scrierea unui fiier Notpad,
afiarea continutului acestuia ntr-o caset text, schimbarea fontului i culorii de
afiare, tergerea coninutului casetei, afiarea unor informaii teoretice precum i
Help dinamic. Au fost definite chei de acces rapid pentru accesarea componentelor
meniului.
System.Diagnostics.Process.Start( notepad );
File Open selecteaz i afieaz n caseta text coninutul unui fiier text.
File Close terge coninutul casetei text, File Exit nchide aplicaia
Window Font i Window Color permit stabilirea fontului/culorii textului afiat.
Help DinamicHelp acceseaz
System.Diagnostics.Process.Start(IExplore,
http://msdn2.microsoft.com/en-us/default.aspx);
Help About PV afieaz n caseta text informaii despre implementarea unui menu.
86 Introducere n .Net Framework (Suport de curs)
5.5. System.Drawing
Spaiul System.Drawing conine tipuri care permit realizarea unor desene 2D i au rol
deosebit n proiectarea interfeelor grafice.
Un obiect de tip Point este reprezentat prin coordonatele unui punct ntr-un spaiu
bidimensional (exemplu: Point myPoint = new Point(1,2);)
Point este utilizat frecvent nu numai pentru desene, ci i pentru a identifica n pro-
gram un punct dintr-un anumit spaiu. De exemplu, pentru a modifica poziia unui
buton n fereastr putem asigna un obiect de tip Point proprietii Location indicnd
astfel poziia colului din stnga-sus al butonului (button.Location = new Point(100, 30)).
Putem construi un obiect de tip Point pentru a redimensiona un alt obiect.
Structura Color conine date, tipuri i metode utile n lucrul cu culori. Fiind un tip
valoare (struct) i nu o clas, aceasta conine date i metode, ns nu permite
instaniere, constructori, destructor, motenire.
Graphics g = this.CreateGraphics();
Pen pen = new Pen(Color.Yellow, 2);
g.DrawLines(pen, points);
Aplicaia PV12 este un exerciiu care deseneaz cercuri de raze i culori aleatorii i
emite sunete cu frecven aleatoare.
Image thumbnail;
private void Thumbnails_Load(object sender, EventArgs e)
{ try{Image img = Image.FromFile(C:\\Imagini\\catel.jpg);
int latime=100, inaltime=100;
thumbnail=img.GetThumbnailImage(latime, inaltime,null, IntPtr.Zero);}
catch{MessageBox.Show(Nu exista fisierul);}
}
private void Thumbnails_Paint(object sender, PaintEventArgs e)
{e.Graphics.DrawImage(thumbnail, 10, 10);}
ErrorProvider
O manier simpl de a semnala erori de validare este aceea de a seta un mesaj de
eroare pentru fiecare control.
Aplicatii recapitulative.
Urmrii aplicaiile i precizai pentru fiecare dintre ele controalele utilizate, eveni-
mentele tratate: Forma poloneza (PV14), Triunghi (PV15), Ordonare vector(PV16),
Subsir cresctor de lungime maxim(PV17), Jocul de Nim (PV18)
Exerciiu (Test grila) Realizai un generator de teste gril (ntrebrile sunt preluate
dintr-un fiier text, pentru fiecare item se precizeaz tipul (alegere simpl/multipl),
punctajul, enunul i distractorii, imaginea asociat (dac exist). Dup efectuarea
testului se afieaz rezultatul obinut i statistica rspunsurilor.
89
CAPITOLUL 6
ADO.NET
ADO.NET (ActiveX Data Objects) reprezint o parte component a nucleului .NET
Framework ce permite conectarea la surse de date diverse, extragerea, manipularea
i actualizarea datelor.
De obicei, sursa de date este o baz de date, dar ar putea de asemenea s fie un
fiier text, o foaie Excel, un fiier Access sau un fiier XML.
n aplicaiile tradiionale cu baze de date, clienii stabilesc o conexiune cu baza de
date i menin aceast conexiune deschis pn la ncheierea executrii aplicaiei.
Conexiunile deschise necesit alocarea de resurse sistem. Atunci cnd meninem
mai multe conexiuni deschise server-ul de baze de date va rspunde mai lent la
comenzile clienilor ntruct cele mai multe baze de date permit un numr foarte mic
de conexiuni concurente.
ADO.NET permite i lucrul n stil conectat dar i lucrul n stil deconectat, aplicaiile
conectndu-se la server-ul de baze de date numai pentru extragerea i actualizarea
datelor. Acest lucru permite reducerea numrului de conexiuni deschise simultan la
sursele de date.
ADO.NET ofer instrumentele de utilizare i reprezentare XML pentru transferul
datelor ntre aplicaii i surse de date, furniznd o reprezentare comun a datelor,
ceea ce permite accesarea datelor din diferite surse de diferite tipuri i prelucrarea lor
ca entiti, fr s fie necesar s convertim explicit datele n format XML sau invers.
Aceste caracteristici sunt determinate n stabilirea beneficiilor furnizate de
ADO.NET:
Interoperabilitate. ADO.NET poate interaciona uor cu orice component care
suport XML.
Durabilitate. ADO.NET permite dezvoltarea arhitecturii unei aplicaii datorit
modului de transfer a datelor ntre nivelele arhitecturale.
Programabilitate.ADO.NET simplific programarea pentru diferite task-uri cum
ar fi comenzile SQL, ceea ce duce la o cretere a productivitii i la o scdere a
numrului de erori.
Performan. Nu mai este necesar conversia explicit a datelor la transferul
ntre aplicaii, fapt care duce la crete performanelor acestora.
Accesibilitate Utilizarea arhitecturii deconectate permite accesul simultan la
acelai set de date. Reducerea numrului de conexiuni deschise simultan deter-
min utilizarea optim a resurselor.
90 Introducere n .Net Framework (Suport de curs)
6.3.Connection.
nainte de orice operaie cu o surs de date extern, trebuie realizat o conexiune
(legtur) cu acea surs. Clasele din categoria Connection (SQLConnection,
OleDbConnection etc.) conin date referitoare la sursa de date (locaia, numele i
parola contului de acces, etc.), metode pentru deschiderea/nchiderea conexiunii,
pornirea unei tranzacii etc. Aceste clase se gsesc n subspaii (SqlClient, OleDb etc.)
ale spaiului System.Data. n plus, ele implementeaz interfaa IdbConnection.
Pentru deschiderea unei conexiuni prin program se poate instania un obiect de tip
conexiune, precizndu-i ca parametru un ir de caractere coninnd date despre
conexiune.
CAPITOLUL 6. ADO.NET 91
using System.Data.SqlClient;
SqlConnection co = new SqlConnection();
co.ConnectionString = Data Source=localhost; User ID=profesor;pwd=info; Initial
Catalog=Orar;
co.Open();
using System.Data.SqlClient;
SqlConnection co =
new SqlConnection(@Data Source=serverBD;Database=scoala;User
ID=elev;Password=madonna);
co.Open();
using System.Data.OleDb;
OleDbConnection co =
new OleDbConnection(@Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Date\scoala.mdb);
co.Open();
6.3.2. Proprieti
a) ConnectionString (String, cu accesori de tip get i set ) definete un ir care per-
mite identificarea tipului i sursei de date la care se face conectarea i eventual
contul i parola de acces. Conine lista de parametri necesarii conectrii sub
forma parametru=valoare, separai prin ;.
Parametru Descriere
Specific furnizorul de date pentru conectarea la sursa de date. Acest furnizor
Provider trebuie precizat doar dac se folosete OLE DB .NET Data Provider,
i nu se specific pentru conectare la SQL Server.
Identific serverul, care poate fi local,
Data Source
un domeniu sau o adresa IP.
specific numele bazei de date. Baza de date trebuie s se gseasc pe
Initial Catalog
serverul dat n Data Source
Integrated Security32 Logarea se face cu user-ul configurat pentru Windows.
User ID Numele unui user care are acces de logare pe server
Password Parola corespunztoare ID-ului specificat.
6.3.3. Metode
a) Open(): deschide o conexiune la baza de date
b)Close() i Dispose(): nchid conexiunea i elibereaz toate resursele alocate pen-
tru ea
c) BeginTransaction(): pentru executarea unei tranzacii pe baza de date; la sfrit
se apeleaz Commit() sau Rollback().
d)ChangeDatabase(): se modific baza de date la care se vor face conexiunile. Noua
baz de date trebuie s existe pe acelai server ca i precedenta.
e) CreateCommand(): creeaz o comand (un obiect de tip Command) valid asoci-
at conexiunii curente.
6.3.4. Evenimente
a) StateChange: apare atunci cnd se schimb starea conexiunii. Handlerul cores-
punztor (de tipul delegat StateChangeEventHandler) spune ntre ce stri s-a
fcut tranziia.
b) InfoMessage: apare cnd furnizorul trimite un avertisment sau un mesaj ctre client.
6.4. Command
Clasele din categoria Command (SQLCommand, OleDbCommand etc.) conin date
referitoare la o comand SQL (SELECT, INSERT, DELETE, UPDATE) i metode pentru
executarea unei comenzi sau a unor proceduri stocate. Aceste clase implementeaz
interfaa IDbCommand. Ca urmare a interogrii unei baze de date se obin obiecte din
categoriile DataReader sau DataSet. O comand se poate executa numai dup ce s-a
stabilit o conxiune cu baza de date corespunztoare.
CAPITOLUL 6. ADO.NET 93
6.4.1. Proprieti
a) CommandText (String): conine comanda SQL sau numele procedurii stocate care
se execut pe sursa de date.
b)CommandTimeout (int): reprezint numrul de secunde care trebuie s fie ateptat
pentru executarea comenzii. Dac se depeste acest timp, atunci se genereaz
o excepie.
c) CommandType (enumerare de componente de tip CommandType): reprezint tipul
de comand care se execut pe sursa de date. Valorile pot fi: StoredProcedure
(apel de procedur stocat), Text (comand SQL obinuit), TableDirect (numai
pentru OleDb)
d)Connection (System. Data. [Provider].PrefixConnection): conine obiectul de tip
conexiune folosit pentru legarea la sursa de date.
e) Parameters (System.Data.[Provider].PrefixParameterCollection): returneaz o
colecie de parametri care s-au transmis comenzii.
f) Transaction (System.Data.[Provider].PrefixTransaction): permite accesul la
obiectul de tip tranzacie care se cere a fi executat pe sursa de date.
6.4.2. Metode
a) Constructori:
SqlCommand()
SqlCommand(string CommandText)
SqlCommand(string CommandText, SqlConnection con )
SqlCommand(string CommandText,SqlConnection con,SqlTransaction trans)
b)Cancel() oprete o comand aflat n executare.
c) Dispose() distruge obiectul comand.
d)ExecuteNonQuery()execut o comand care nu returneaz un set de date din baza
de date; dac comanda a fost de tip INSERT, UPDATE, DELETE, se returneaz
numrul de nregistrri afectate.
Exemplu:
SqlCommand cmd = new SqlCommand();
cmd.CommandText = DELETE FROM elevi WHERE nume = BARBU;
cmd.Connection = con;
Console.WriteLine(cmd.ExecuteNonQuery().ToString());
//cte nreg. s-au sters
Exemplu
Se obine coninutul tabelei elevi ntr-un obiect de tip SqlDataReader.
SqlCommand cmd = new SqlCommand(SELECT * FROM elevi,con);
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read()) { Console.WriteLine({0} - {1},
94 Introducere n .Net Framework (Suport de curs)
reader.GetString(0),reader.GetString(1));
}
reader.Close();
Exemplu:
Exemplu:
SqlCommand CMD=
new SqlCommand(SELECT * FROM elevi FOR XML MATE,EXAMEN, con);
System.Xml.XmlReader myXR = CMD.ExecuteXmlReader();
using System.Data.SqlClient;
SqlConnection conn =
new SqlConnection(@Data Source=serverBD;Database=MAGAZIN;User ID=adm;Password=eu);
conn.Open();
CAPITOLUL 6. ADO.NET 95
cmd.Connection = conn;33
// Apelm ExecuteNonQuery pentru executarea comenzii
cmd.ExecuteNonQuery();
Cteodat avem nevoie s obinem din baza de date o singur valoare, care poate
fi o sum, o medie sau alt rezultat al unei funcii agregat. O alegere ineficient ar fi
utilizarea metodei ExecuteReader i apoi calculul valorii. n acest caz, cea mai bun
alegere este s lucrm direct asupra bazei de date i s obinem aceast valoare.
Exerciii:
1) Realizai o conexiune la baza de date MAGAZIN i afiai ID-urile produselor.
using System;
using System.Data;
using System.Data.SqlClient;
class ADO1
{
static void Main()
{ SqlConnection conn = new SqlConnection(
Data Source=(local);Initial Catalog=MAGAZIN;Integrated Security=SSPI);
SqlDataReader rdr = null;
try
{ conn.Open();
SqlCommand cmd = new SqlCommand(select * from PRODUSE, conn);
33 Am fi putut folosi acelai constructor ca la Insert. Acest exemplu demonstreaz c putem schimba oricnd obiec-
tul connection asignat unei comenzi
34 n acest exemplu am ales s aplel constructorul SqlCommand fr parametri, pentru a exemplifica cum putem
stabili explicit conexiunea i comanda
35 Este necesar conversia ntruct rezultatul returnat de ExecuteScalar este de tip object
CAPITOLUL 6. ADO.NET 97
rdr = cmd.ExecuteReader();
while (rdr.Read()) { Console.WriteLine(rdr[0]);}
}
finally
{ if (rdr != null) {rdr.Close();}
if (conn != null){conn.Close();}
}
}
}
using System;
using System.Data;
using System.Data.SqlClient;
class ADO2
{
SqlConnection conn;
public ADO2()
{ conn = new SqlConnection(Data Source=(local);Initial
Catalog=MAGAZIN;Integrated Security=SSPI);
}
static void Main()
{
ADO2 scd = new ADO2();
Console.WriteLine(Produse aflate n magazin nainte de Insert);
scd.ReadData();scd.Insertdata();
Console.WriteLine(Produse aflate n magazin dupa Insert);
scd.ReadData();scd.UpdateData();
Console.WriteLine(Produse aflate n magazin dupa Update);
scd.ReadData();scd.DeleteData();
Console.WriteLine(Categories After Delete);
scd.ReadData();
int number_inregistrari = scd.GetNumberOfRecords();
Console.WriteLine(Numarul de inregistrari: {0}, numar_inregistrari);
}
public void ReadData()
{ SqlDataReader rdr = null;
try
{conn.Open();
SqlCommand cmd = new SqlCommand(select DENUMIRE_PRODUS from PRODUSE,
conn);
rdr = cmd.ExecuteReader();
while (rdr.Read()) {Console.WriteLine(rdr[0]);}
}
finally
{ if (rdr != null){rdr.Close();}
98 Introducere n .Net Framework (Suport de curs)
if (conn != null){conn.Close();}
}
}
public void Insertdata()
{try
{conn.Open();
string insertString = @insert into PRODUSE(DENUMIRE_PRODUS, DESCRIERE)
values (SCOOBY, jucarie de plus);
SqlCommand cmd = new SqlCommand(insertString, conn);
cmd.ExecuteNonQuery();
}
finally
{if (conn != null){conn.Close();}
}
}
public void UpdateData()
{
try
{conn.Open();
string updateString = @update PRODUSE set DENUMIRE_PRODUS = SCOOBY DOO
where DENUMIRE_PRODUS = SCOOBY;
SqlCommand cmd = new SqlCommand(updateString);
cmd.Connection = conn;
cmd.ExecuteNonQuery();
}
finally
{if (conn != null){conn.Close();}
}
}
public void DeleteData()
{ try
{ conn.Open();
string deleteString = @delete from PRODUSE where DENUMIRE_PRODUS = BAR-
BIE;
SqlCommand cmd = new SqlCommand();
cmd.CommandText = deleteString;
cmd.Connection = conn;
cmd.ExecuteNonQuery();
}
finally
{if (conn != null){conn.Close();}}
}
public int GetNumberOfRecords()
{
int count = -1;
try
{ conn.Open();
SqlCommand cmd = new SqlCommand(select count(*) from Produse, conn);
count = (int)cmd.ExecuteScalar();
}
CAPITOLUL 6. ADO.NET 99
finally
{if (conn != null){conn.Close();}
}
return count;
}
}
6.5. DataReader
Datele pot fi explorate n mod conectat (cu ajutorul unor obiecte din categoria
DataReader), sau pot fi preluate de la surs (dintr-un obiect din categoria
DataAdapter) i nglobate n aplicaia curent (sub forma unui obiect din categoria
DataSet).
Clasele DataReader permit parcurgerea ntr-un singur sens a sursei de date, fr
posibilitate de modificare a datelor la surs. Dac se dorete modificarea datelor la
surs, se va utiliza ansamblul DataAdapter + DataSet.
Datorita faptului c citete doar nainte (forward-only) permite acestui tip de date
s fie foarte rapid n citire. Overhead-ul asociat este foarte mic (overhead generat cu
inspectarea rezultatului i a scrierii n baza de date). Dac ntr-o aplicaie este nevoie
doar de informaii care vor fi citite o singura dat, sau rezultatul unei interogri este
prea mare ca sa fie reinut n memorie (caching) DataReader este soluia cea mai
bun.
Un obiect DataReader nu are constructor36, ci se obine cu ajutorul unui obiect de
tip Command i prin apelul metodei ExecuteReader() (vezi exerciiile de la capitolul
anterior). Evident, pe toat durata lucrului cu un obiect de tip DataReader, conexi-
unea trebuie s fie activ. Toate clasele DataReader (SqlDataReader,
OleDbDataReader etc.) implementeaz interfaa IDataReader.
6.5.1. Proprieti:
a) IsClosed (boolean, read-only)- returnez true dac obiectul este deschis si fals
altfel
b)HasRows (boolean,read-only) - verific dac reader-ul conine cel puin o nre-
gistrare
c) Item (indexator de cmpuri)
d)FieldCount - returneaz numrul de cmpuri din nregistrarea curent
6.5.2. Metode:
a) Close() nchidere obiectului i eliberarea resurselor; trebuie s precead
nchiderea conexiunii.
b)GetBoolean(), GetByte(), GetChar(), GetDateTime(), GetDecimal(), GetDouble(),
GetFloat(), GetInt16(), GetInt32(), GetInt64(), GetValue(), GetString()
returneaz valoarea unui cmp specificat, din nergistrarea curent
36 Dac pentru instantiere este folosit operatorul new vei obine un obiect cu care nu putei face nimic pentru c nu
are o conexiune i o comand ataate.
100 Introducere n .Net Framework (Suport de curs)
DataReader obine datele ntr-un stream secvenial. Pentru a citi aceste informaii tre-
buie apelat metoda Read; aceasta citeste un singur rnd din tabelul rezultat. Metoda
clasic de a citi informaia dintr-un DataReader este de a itera ntr-o bucl while.
Ex.1)
Exemplu: Codul
este echivalent cu
using System;
using System.Data;
using System.Data.SqlClient;
class ADO3
{ static void Main()
{ADO3 rd = new ADO3();
rd.SimpleRead();
}
6.6. DataAdapter
Folosirea combinat a obiectelor DataAdapter i DataSet permite operaii de
selectare, tergere, modificare i adugare la baza de date. Clasele DataAdapter
genereaz obiecte care funcioneaz ca o interfa ntre sursa de date i obiectele
DataSet interne aplicaiei, permind prelucrri pe baza de date. Ele gestioneaz
automat conexiunea cu baza de date astfel nct conexiunea s se fac numai atunci
cnd este imperios necesar.
Un obiect DataSet este de fapt un set de tabele relaionate. Folosete serviciile
unui obiect DataAdapter pentru a-i procura datele i trimite modificrile napoi ctre
baza de date. Datele sunt stocate de un DataSet n format XML, acelai folosit i pen-
tru transferul datelor.
n exemplul urmtor se preiau datele din tablele elevi i profi:
6.6.1. Proprieti
a) DeleteCommand, InsertCommand, SelectCommand, UpdateCommand (Command), conin
comenzile ce se execut pentru selectarea sau modificarea datelor n sursa de
date.
b)MissingSchemaAction (enumerare) determin ce se face atunci cnd datele aduse
nu se potrivesc peste schema tablei n care sunt depuse. Poate avea urmtoarele
valori:
Add - implicit, DataAdapter adaug coloana la schema tablei
AddWithKey se adug coloana i informaii relativ la cheia primar
Ignore - se ignor lipsa coloanei respective, ceea ce duce la pierdere de date
Error - se genereaz o excepie de tipul InvalidOperationException.
6.6.2. Metode
Constructori:SqlDataAdapter()|SqlDataAdapter(obiect_comanda)|
SqlDataAdapter(string_comanda, conexiune);
a) Fill() permite umplerea unei tabele dintrun obiect DataSet cu date. Permite
specificarea obiectului DataSet n care se depun datele, eventual a numelui
tablei din acest DataSet, numrul de nregistrare cu care s se nceap popu-
larea (prima avnd indicele 0) i numrul de nregistrri care urmeaz a fi aduse.
a) Update() permite transmiterea modificrilor efectuate ntrun DataSet ctre
baza de date.
6.7. DataSet
Un DataSet este format din Tables (colecie format din obiecte de tip DataTable;
DataTable este compus la rndul lui dintr-o colecie de DataRow i DataColumn),
Relations (colecie de obiecte de tip DataRelation pentru memorarea legturilor
printecopil) i ExtendedProperties ce conine proprieti definite de utilizator.
Scenariul uzual de lucru cu datele dintr-o tabel conine urmtoarele etape:
popularea succesiv a unui DataSet prin intermediul unuia sau mai multor
obiecte DataAdapter, apelnd metoda Fill (vezi exemplul de mai sus)
procesarea datelor din DataSet folosind numele tabelelor stabilite la umplere,
ds.Tables[elevi], sau indexarea acestora, ds.Tables[0], ds.Tables[1]
actualizarea datelor prin obiecte comand corespunztoare operaiilor INSERT,
UPDATE i DELETE. Un obiect CommandBuilder poate construi automat o com-
binaie de comenzi ce reflect modificrile efectuate.
SqlDataAdapter daProd =
new SqlDataAdapter (SELECT ID_PRODUS, DENUMIRE_PRODUS FROM PRODUSE, conn);
Dup ce au fost fcute modificri ntr-un DataSet acestea trebuie scrise i n baza
de date. Actualizarea se face prin apelul metodei Update.
daProd.Update (dsProduse, PRODUSE);
6.8. SqlParameter
Atunci cnd lucrm cu bazele de date avem nevoie, de cele mai multe ori s filtrai
rezultatul dup diverse criterii. De obicei acest lucru se face n funcie de nite criterii
pe care utilizatorul le specific (ex: vrei s vedei doar ppuile Barbie).
Cea mai simpl metod de filtrare a rezultatelor este s construim dinamic string-ul
SqlCommand dar aceast metoda nu este recomandat deoarece poate afecta baza
de date (ex. Accesarea informaiilor confideniale).
Dac folosim interogri cu parametri atunci orice valoare pus ntr-un parametru
nu va fi tratat drept cod SQL, ci ca valoare a unui cmp, fcnd aplicaia mai sigur.
Pentru a folosi interogri cu parametri trebuie s:
Ex. cmd.Parameters.Add(param);
37 Se pot afia mai multe tabele dintr-un DataSet, semnul "+" permindu-i utilizatorului s aleaga care tabel s fie
afiat. Pentru a suprima afiarea acelui semn "+" setm proprietatea DataMembers pe numele tabelului care va fi
afiat. Numele tabelului este acelai care l-am folosit ca parametru n apelul metodei Fill.
38 Atunci cnd comanda va fi executat @den va fi nlocuit cu valoarea aflat n obiectul SqlParameter ataat. Dac
nu asociem o instan de tipul SqlParameter pentru un parametru din string-ul de interogare sau avem mai multe
instane SqlParameter pentru un parametru vom obine o eroare la rulare
CAPITOLUL 6. ADO.NET 105
Exemplu:
Precizri.Toate informaiile se vor afla ntr-o baz de date. Creati propriile structuri
de date adecvate rezolvarii problemei. Utilizati Microsoft Access pentru crearea bazei
de date. Iniial aplicaia va afia o form Windows care permite selectarea operaiei
efectuate (adugare carte/cri, adugare abonat, actualizare stare carte/cri/abonat,
mprumut carte/cri, etc.)
Prin tragerea unor obiecte din fereastra Data Sources n fereastra noastr
nou, se creeaz automat obiecte specifice. n partea de jos a figurii se pot
observa obiectele de tip Dataset, TableAdapter, BindingSource,
BindingNavigator i, n fereastr, TableGridView
Meniul contextual asociat grilei n care vor fi vizualizate datele permite configu-
rarea modului de lucru cu grila (sursa de date, operaiile permise i altele).
108 Introducere n .Net Framework (Suport de curs)
n timpul rulrii aplicaiei, bara de navigare i elementele vizuale ale grilei permit
operaiile de baz cu nregistrrile bazei de date. Operaiile care modific baza de
date trebuie s fie definitivate prin salvarea noilor date .
BIBLIOGRAFIE
Marshall Donis, Programming Microsoft Visual C# 2005: The Language, Microsoft Press 2006,
ISBN:0735621810
Pelland Patrice, Build a Program NOW, Microsoft Visual C# 2005 Express Edition, Microsoft Press
2006,
LearnVisualStudio.NET http://www.learnvisualstudio.net resurse educaionale gratuite sub forma de
filme
Harris Andy, Microsoft C# Programming for the Absolute Beginner, Premier Press 2002,
ISBN: 1?931841?16?0
Wright Peter, Beginning Visual C# 2005 Express Edition: From Novice to Professional, Apress 2006,
ISBN-13 (pbk): 978-1-59059-549-7, ISBN-10 (pbk): 1-59059-549-1
Liberty Jesse, Programming C#, Second Edition, O'REILLY 2002, ISBN 10: 0-596-00309-9,
ISBN 13:9780596003098
Solis Daniel, Illustrated C# 2005, Apress 2006, ISBN-13 (pbk): 978-1-59059-723-1,
ISBN-10 (pbk): 1-59059-723-0
Rasheed Faraz, C# School, Synchron Data 2005-2006,
http://www.programmersheaven.com/2/CSharpBook
Schneider Robert, Microsoft SQL Server 2005 Express Edition For Dummies, Wiley Publishing
2006, ISBN-13: 978-0-7645-9927-9, ISBN-10: 0-7645-9927-5
Bradley L. Jones, Sams Teach Yourself the C# Language in 21 Days, SAMS, 2004,
International Standard Book Number: 0-672-32546-2
Michel de Camplain, Brian G. Patrik, C# 2.0: Practical Guide for Programmers, Elsevier, 2005,
ISBN: 0-12-167451-7
Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson, Morgan Skinner, Allen Jones,
Professional C# 2005, Wiley Publishing, Inc., 2006, ISBN-13: 978-0-7645-7534-1
ISBN-10: 0-7645-7534-1
Sharp John, Visual C# 2005, DUNOD 2006
Iulian Serban, Dragos Brezoi, Tiberiu Radu, Adam Ward, GDI+ Custom Controls with Visual C#
2005, PACKT Publishing 2006, ISBN 1-904811-60-4
Simpson Alan, Visual Web Developer Server 2005 Express Edition For Dummies, Wiley
Publishing 2006, ISBN-13: 978-0-7645-8360-5, ISBN-10: 0-7645-8360-3
Hoffman Kevin, Microsoft Visual C# 2005 Unleashed, Sams 2006,
ISBN-10: 0-672-32776-7, ISBN-13: 978-0-672-32776-6
Popovici, Dorin Mircea i colaboratorii - Proiectare i implementare software,
Editura TEORA, Bucureti, 1998
C# Language Specification, Microsoft Corporation, 1999-2003
C# Version 2.0 Specification May 2004, Microsoft Corporation, 1999-2005
David Conger, Programarea n C#, editura B.I.C. ALL 2003
Chris H. Pappas, William H. Murray C# pentru programarea Web, editura B.I.C. ALL 2004
MCAD/MCSD -Developing XML WEB SERVICES and SERVER COMPONENTS WITH MICROSOFT
http://www.csharp-station.com
http://msdn2.microsoft.com
M.E.C. Serviciul Naional de Evaluare i Examinare - Ghid de evaluare,
INFORMATICA i TEHNOLOGIA INFORMATIEI, Editura Aramis, Bucureti 2001
M.E.C. Consiliul Naional pentru Curriculum - Ghid metodologic pentru aplicarea programelor
colare, Editura Aramis, Bucureti 2002
M.E.C Consiliul Naional pentru curriculum - Ghid metodologic pentru Educaie Tehnologic
Informatic - Tehnologia Informaiei - Liceu teoretic - Editura Aramis, Bucureti 2001
Autori, n ordine alfabetic:
Adrian Ni
Introducere n
.Net Framework
ISBN: 973-86699-5-2
Ediia 2008