Curs C# Sasu

Embed Size (px)

Citation preview

Visual C#Lucian Sasu May 30, 2005

2

Cuprins1 Platforma Microsoft .NET 1.1 Prezentare general . . . . . . . . . . . . a 1.2 Arhitectura platformei Microsoft .NET . 1.3 Componente ale lui .NET Framework . . 1.3.1 Microsoft Intermediate Language 1.3.2 Common Language Specication 1.3.3 Common Language Runtime . . . 1.3.4 Common Type System . . . . . . 1.3.5 Metadata . . . . . . . . . . . . . 1.3.6 Assemblies . . . . . . . . . . . . . 1.3.7 Assembly cache . . . . . . . . . . 1.3.8 Garbage collection . . . . . . . . 1.4 Trsturi ale platformei .NET . . . . . . aa 2 Tipuri predenite, tablouri, string-uri 2.1 Vedere general asupra limbajului C# a 2.2 Tipuri de date . . . . . . . . . . . . . . 2.2.1 Tipuri predenite . . . . . . . . 2.2.2 Tipuri valoare . . . . . . . . . . 2.2.3 Tipul enumerare . . . . . . . . 2.3 Tablouri . . . . . . . . . . . . . . . . . 2.3.1 Tablouri unidimensionale . . . . 2.3.2 Tablouri multidimensionale . . 2.4 Siruri de caractere . . . . . . . . . . . 2.4.1 Expresii regulate . . . . . . . . 3 Clase, instructiuni, spatii de 3.1 Clase vedere general . . a 3.2 Transmiterea de parametri 3.3 Conversii . . . . . . . . . . 3.3.1 Conversii implicite nume . . . . . . . . . . . . . . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 11 12 12 12 13 14 15 16 17 17 17 21 21 23 24 25 29 36 36 37 41 43 45 45 49 55 55

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

4 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9 3.3.10 3.3.11 3.3.12 3.3.13 Spatii 3.4.1 3.4.2 Conversiile implicite ale expresiilor constante Conversii explicite . . . . . . . . . . . . . . Boxing i unboxing . . . . . . . . . . . . . . s Declaratii de variabile i constante . . . . . s Declaratii de etichete . . . . . . . . . . . . . Instructiuni de selectie . . . . . . . . . . . . Instructiuni de ciclare . . . . . . . . . . . . Instructiuni de salt . . . . . . . . . . . . . . Instructiunile try, throw, catch, nally . . . Instructiunile checked i unchecked . . . . . s Instructiunea lock . . . . . . . . . . . . . . . Instructiunea using . . . . . . . . . . . . . . de nume . . . . . . . . . . . . . . . . . . . . Declaratii de spatii de nume . . . . . . . . . Directiva using . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

CUPRINS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 57 60 62 62 63 64 66 66 67 67 67 68 69 70 75 75 76 77 77 77 78 78 79 79 80 81 81 81 87 92 93 95 95 96 99 99 101

3.4

4 Clase 4.1 Declararea unei clase . . . . . . . 4.2 Membrii unei clase . . . . . . . . 4.3 Cmpuri . . . . . . . . . . . . . . a 4.3.1 Cmpuri instante . . . . . a 4.3.2 Cmpuri statice . . . . . . a 4.3.3 Cmpuri readonly . . . . . a 4.3.4 Cmpuri volatile . . . . . a 4.3.5 Initializarea cmpurilor . . a 4.4 Constante . . . . . . . . . . . . . 4.5 Metode . . . . . . . . . . . . . . . 4.5.1 Metode statice i nestatice s 4.5.2 Metode externe . . . . . . 4.6 Proprieti . . . . . . . . . . . . . at 4.7 Indexatori . . . . . . . . . . . . . 4.8 Operatori . . . . . . . . . . . . . 4.8.1 Operatori unari . . . . . . 4.8.2 Operatori binari . . . . . . 4.8.3 Operatori de conversie . . 4.8.4 Exemplu: clasa Fraction . 4.9 Constructori de instant . . . . . a 4.10 Constructori statici . . . . . . . . 4.11 Clase interioare . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

CUPRINS 5 Destructori. POO C# n 5.1 Destructori . . . . . . . . . . . . . . . . . . . . . . . 5.2 Specializarea i generalizarea . . . . . . . . . . . . . . s 5.2.1 Specicarea motenirii . . . . . . . . . . . . . s 5.2.2 Apelul constructorilor din clasa de baz . . . a 5.2.3 Operatorii is i as . . . . . . . . . . . . . . . s 5.3 Clase sealed . . . . . . . . . . . . . . . . . . . . . . . 5.4 Polimorsmul . . . . . . . . . . . . . . . . . . . . . . 5.4.1 Polimorsmul parametric . . . . . . . . . . . . 5.4.2 Polimorsmul adhoc . . . . . . . . . . . . . . 5.4.3 Polimorsmul de motenire . . . . . . . . . . . s 5.4.4 Virtual i override . . . . . . . . . . . . . . . s 5.4.5 Modicatorul new pentru metode . . . . . . . 5.4.6 Metode sealed . . . . . . . . . . . . . . . . . . 5.4.7 Exemplu folosind virtual, new, override, sealed 5.5 Clase i metode abstracte . . . . . . . . . . . . . . . s 5.6 Interfete . . . . . . . . . . . . . . . . . . . . . . . . . 5.6.1 Clase abstracte sau interfete? . . . . . . . . .

5 105 . 105 . 107 . 107 . 108 . 110 . 110 . 111 . 111 . 111 . 111 . 113 . 114 . 116 . 117 . 119 . 120 . 126 127 . 127 . . . . . . . . . 128 131 132 135 135 135 142 142 146

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

6 Delegati. Evenimente. Structuri 6.1 Tipul delegat . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.1 Utilizarea delegatilor pentru a specica metode la run time . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.2 Delegati statici . . . . . . . . . . . . . . . . . . . . . 6.1.3 Multicasting . . . . . . . . . . . . . . . . . . . . . . . 6.2 Evenimente . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.1 Publicarea i subscrierea . . . . . . . . . . . . . . . . s 6.2.2 Evenimente i delegati . . . . . . . . . . . . . . . . . s 6.2.3 Comentarii . . . . . . . . . . . . . . . . . . . . . . . 6.3 Structuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.1 Structuri sau clase? . . . . . . . . . . . . . . . . . . . 7 Tratarea exceptiilor. Atribute 7.1 Tratarea exceptiilor . . . . . . . . . . . . . . . 7.1.1 Tipul Exception . . . . . . . . . . . . . 7.1.2 Aruncarea i prinderea exceptiilor . . . s 7.1.3 Re ncercarea codului . . . . . . . . . . 7.1.4 Compararea tehnicilor de manipulare a 7.1.5 Sugestie pentru lucrul cu exceptiile . . 7.2 Atribute . . . . . . . . . . . . . . . . . . . . . 7.2.1 Generaliti . . . . . . . . . . . . . . . at . . . . . . . . . . . . . . . . . . . . erorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

147 . 147 . 147 . 148 . 159 . 161 . 162 . 163 . 163

6 7.2.2 7.2.3 7.2.4

CUPRINS Atribute predenite . . . . . . . . . . . . . . . . . . . . 164 Exemplicarea altor atribute predenite . . . . . . . . 167 Atribute denite de utilizator . . . . . . . . . . . . . . 170

8 ADO.NET 173 8.1 Ce reprezint ADO.NET? . . . . . . . . . . . . . . . . . . . . 173 a 8.2 Furnizori de date ADO.NET . . . . . . . . . . . . . . . . . 174 n 8.3 Componentele unui furnizor de date . . . . . . . . . . . . . . . 174 8.3.1 Clasele Connection . . . . . . . . . . . . . . . . . . . . 175 8.3.2 Clasele Command . . . . . . . . . . . . . . . . . . . . . 176 8.3.3 Clasele DataReader . . . . . . . . . . . . . . . . . . . . 176 8.3.4 Clasele DataAdapter . . . . . . . . . . . . . . . . . . . 176 8.3.5 Clasa DataSet . . . . . . . . . . . . . . . . . . . . . . . 176 8.4 Obiecte Connection . . . . . . . . . . . . . . . . . . . . . . . . 176 8.4.1 Proprieti . . . . . . . . . . . . . . . . . . . . . . . . . 177 at 8.4.2 Metode . . . . . . . . . . . . . . . . . . . . . . . . . . 179 8.4.3 Evenimente . . . . . . . . . . . . . . . . . . . . . . . . 179 8.4.4 Stocarea stringului de conexiune ier de congurare 179 n s 8.4.5 Gruparea conexiunilor . . . . . . . . . . . . . . . . . . 180 8.5 Obiecte Command . . . . . . . . . . . . . . . . . . . . . . . . 181 8.5.1 Proprieti . . . . . . . . . . . . . . . . . . . . . . . . . 181 at 8.5.2 Metode . . . . . . . . . . . . . . . . . . . . . . . . . . 182 8.5.3 Utilizarea unei comenzi cu o procedur stocat . . . . . 185 a a 8.5.4 Folosirea comenzilor parametrizate . . . . . . . . . . . 185 8.6 Obiecte DataReader . . . . . . . . . . . . . . . . . . . . . . . 187 8.6.1 Proprieti . . . . . . . . . . . . . . . . . . . . . . . . . 187 at 8.6.2 Metode . . . . . . . . . . . . . . . . . . . . . . . . . . 188 8.6.3 Crearea i utilizarea unui DataReader . . . . . . . . . . 188 s 8.6.4 Utilizarea de seturi de date multiple . . . . . . . . . . . 190 8.6.5 Accesarea datelor ntro manier sigur din punct de a a vedere a tipului . . . . . . . . . . . . . . . . . . . . . . 190 9 ADO.NET (2) 9.1 Obiecte DataAdapter . . . . . . 9.1.1 Metode . . . . . . . . . 9.1.2 Proprieti . . . . . . . . at 9.2 Clasa DataSet . . . . . . . . . . 9.2.1 Continut . . . . . . . . . 9.2.2 Clasa DataTable . . . . 9.2.3 Relatii ntre tabele . . . 9.2.4 Popularea unui DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 . 193 . 194 . 195 . 195 . 196 . 196 . 199 . 199

CUPRINS

7

9.3

9.2.5 Propagarea modicrilor ctre baza de date . . . . . . 200 a a Tranzactii ADO.NET . . . . . . . . . . . . . . . . . . . . . 202 n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 . 205 . 205 . 208 . 209 . 209 . 213 . 213 . 215 . 217 . 218 . 219 223 . 224 . 224 . 225 . 226 . 228 . 228 . 228 . 229 . 229 . 231 . 231 . 233 . 233 . 234 . 234 . 235 . 235 . 235 . 235 . 235

10 Fire de executie 10.1 Managementul threadurilor . . . . . . . . . . . 10.1.1 Pornirea threadurilor . . . . . . . . . . 10.1.2 Metoda Join() . . . . . . . . . . . . . . 10.1.3 Suspendarea relor de executie . . . . . 10.1.4 Omorrea threadurilor . . . . . . . . . a 10.1.5 Sugerarea prioritilor relor de executie at 10.1.6 Fire fundal i re prim-plan . . . . n s n 10.2 Sincronizarea . . . . . . . . . . . . . . . . . . . 10.2.1 Clasa Interlocked . . . . . . . . . . . . . 10.2.2 Instructiunea lock . . . . . . . . . . . . . 10.2.3 Clasa Monitor . . . . . . . . . . . . . . .

11 ASP.NET 11.1 Anatomia unei pagini ASP.NET . . . . . . . . . . . . . . . 11.1.1 Adugarea unui control Web . . . . . . . . . . . . . a 11.1.2 Adugarea scriptului inline . . . . . . . . . . . . . a 11.1.3 Code-behind . . . . . . . . . . . . . . . . . . . . . . 11.2 Clasa Page . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2.1 Evenimentul Init . . . . . . . . . . . . . . . . . . . 11.2.2 Evenimentul Load . . . . . . . . . . . . . . . . . . 11.2.3 Evenimentul Unload . . . . . . . . . . . . . . . . . 11.3 Crearea unei pagini ASP.NET folosind Visual Studio.NET 11.4 Controale server . . . . . . . . . . . . . . . . . . . . . . . . 11.4.1 Postback . . . . . . . . . . . . . . . . . . . . . . . . 11.4.2 Data Binding . . . . . . . . . . . . . . . . . . . . . 11.5 Controale Web . . . . . . . . . . . . . . . . . . . . . . . . 11.5.1 Label . . . . . . . . . . . . . . . . . . . . . . . . . . 11.5.2 Button . . . . . . . . . . . . . . . . . . . . . . . . . 11.5.3 LinkButton . . . . . . . . . . . . . . . . . . . . . . 11.5.4 TextBox . . . . . . . . . . . . . . . . . . . . . . . . 11.5.5 CheckBox . . . . . . . . . . . . . . . . . . . . . . . 11.5.6 RadioButton . . . . . . . . . . . . . . . . . . . . . 11.5.7 DropDownList . . . . . . . . . . . . . . . . . . . .

12 ASP.NET (2) 237 12.1 Controale de validare . . . . . . . . . . . . . . . . . . . . . . . 237 12.1.1 RequiredFieldValidator . . . . . . . . . . . . . . . . . . 238

8 12.1.2 RegularExpressionValidator . . . . . 12.1.3 RangeValidator . . . . . . . . . . . . 12.1.4 CompareValidator . . . . . . . . . . 12.1.5 CustomValidator . . . . . . . . . . . 12.1.6 ValidationSummary . . . . . . . . . . Comunicarea cu browserul . . . . . . . . . . 12.2.1 Generarea programatic continutului a 12.2.2 Redirectarea . . . . . . . . . . . . . . Cookies . . . . . . . . . . . . . . . . . . . . Fiierul de congurare al aplicatiei Web . . . s Fiierul global.asax . . . . . . . . . . . . . . s Managementul sesiunii . . . . . . . . . . . . ViewState . . . . . . . . . . . . . . . . . . . 12.7.1 Application . . . . . . . . . . . . . . Alte puncte de interes aplicatii ASP.NET n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

CUPRINS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 238 238 239 240 240 241 241 242 243 243 244 245 245 245

12.2

12.3 12.4 12.5 12.6 12.7 12.8

13 Servicii Web 13.1 Generaliti . . . . . . . . . . . . . . . . . . . . at 13.1.1 Componentele unui WS . . . . . . . . . 13.2 Discutii asupra blocurilor componente . . . . . . 13.2.1 Protocolul de transport . . . . . . . . . . 13.2.2 Schema de codicare . . . . . . . . . . . 13.2.3 Conventia de formatare . . . . . . . . . . 13.2.4 Mecanismul de descriere . . . . . . . . . 13.2.5 Mecanisme de descoperire . . . . . . . . 13.3 Crearea unui serviciu Web simplu . . . . . . . . 13.3.1 Adunarea a dou numere . . . . . . . . . a 13.3.2 Validarea unui numr de card de credit . a 13.3.3 SW pentru transmitere de continut binar 13.4 SOAP . . . . . . . . . . . . . . . . . . . . . . . 13.4.1 Header-e . . . . . . . . . . . . . . . . . . 13.4.2 Elementul body . . . . . . . . . . . . . .

247 . 247 . 247 . 248 . 248 . 248 . 249 . 250 . 250 . 251 . 251 . 252 . 253 . 254 . 255 . 256

Curs 1 Platforma Microsoft .NET1.1 Prezentare general a

Platforma .NET este un nou cadru de dezvoltare a softului, sub care se vor realiza, distribui si rula aplicatiile de tip forme Windows, aplicatii WEB si servicii WEB. Ea const trei prti principale: Common Language a n a Runtime, clase pentru platform i ASP.NET. O infrastructur ajuttoare, as a a Microsoft .NET Compact Framework este un set de interfete de programare care permite dezvoltatorilor realizarea de aplicatii pentru dispozitive mobile precum telefoane inteligente i PDA-uri1 . s .NET Framework constituie un nivel de abstractizare ntre aplicatie i s kernel-ul sistemului de operare (sau alte programe), pentru a asigura portabilitatea codului; de asemenea integreaz tehnologii care au fost lansate de a catre Microsoft incepnd cu mijlocul anilor 90 (COM, DCOM, ActiveX, etc) a sau tehnologii actuale (servicii Web, XML). Platforma const cteva grupe de produse: a a 1. Unelte de dezvoltare - un set de limbaje (C#, Visual Basic .NET, J#, Managed C++, Objective-C, Python, Smalltalk, Eiel, Perl, Fortran, Cobol, Lisp, Haskell, Pascal, RPG, etc), un set de medii de dezvoltare (Visual Studio .NET, Visio), infrastructura .NET Framework, o bibliotec cuprinztoare de clase pentru crearea serviciilor Web (Web Sera a 2 vices) , aplicatiilor Web (Web Forms) i aplicatiilor Windows (Win s dows Forms). 2. Servere specializate - un set de servere Enterprise .NET, continuatoare ale lui SQL Server 2000, Exchange 2000, BizTalk 2000, etc, care pun la1 2

Denitia ocial Microsoft, martie 2005, www.microsoft.com/net/basics/glossary.asp a Serviciilor Web - aplicatii care ofer servicii folosind Web-ul ca modalitate de acces. a

9

10

CURS 1. PLATFORMA MICROSOFT .NET dispozitie functionaliti diverse pentru stocarea bazelor de date, email, at 3 aplicatii B2B . 3. Servicii Web - cel mai notabil exemplu este .NET Passport - un mod prin care utilizatorii se pot autentica pe site-urile Web vizitate, folosind un singur nume i o parol pentru toate. Dei nu este omiprezent, multe s a s site-uri folosesc pentru a uura accesul utilizatorilor. l s 4. Dispozitive - noi dispozitive nonPC, programabile prin .NET Compact Framework, o versiune redus a lui .NET Framework: Pocket PC Phone a Edition, Smartphone, Tablet PC, Smart Display, XBox, set-top boxes, etc.

Motivul pentru care Microsoft a trecut la dezvoltarea acestei platforme este maturizarea industriei software, accentunduse urmtoarele directii: a a 1. Aplicatiile distribuite - sunt din ce ce mai numeroase aplicatiile de n tip client / server sau cele pe mai multe nivele (ntier). Tehnologiile distribuite actuale cer de multe ori o mare anitate fat de productor a a i prezint o carent acut a interoperrii cu Web-ul. Viziunea actual s a a a a a se deprteaz de cea de tip client/server ctre una care calculatoare, a a a n dispozitive inteligente i servicii conlucreaz pentru atingerea scopurilor s a propuse. Toate acestea se fac deja folosind standarde Internet neproprietare (HTTP, XML, SOAP). 2. Dezvoltarea orientat pe componente - este de mult timp cerut sima a plicarea integrrii componentelor software dezvoltate de diferiti proa ductori. COM (Component Object Model) a realizat acest deziderat, a dar dezvoltarea i distribuirea aplicatiilor COM este prea complex. s a Microsoft .NET pune la dispozitie un mod mai simplu de a dezvolta i s a distribui componente. 3. Modicri ale paradigmei Web - de-a lungul timpului sau adus a mbuntiri tehnologiilor Web pentru a simplica dezvoltarea aplicatiilor. a at ultimii ani, dezvoltarea aplicatiilor Web sa mutat de la prezentare In (HTML i adiacente) ctre capacitate sporit de programare (XML i s a a s SOAP). 4. Alti factori de maturizare a industriei software - reprezint contienti a s zarea cererilor de interoperabilitate, scalabilitate, disponibilitate; unul din dezideratele .NET este de a oferi toate acestea.Bussiness to Bussiness - Comert electronic ntre parteneri de afaceri, diferit de a comertul electronic ntre client i afacere (Bussiness to Consumer B2C). s3

1.2. ARHITECTURA PLATFORMEI MICROSOFT .NET

11

1.2

Arhitectura platformei Microsoft .NET

Figura 1.1: Arhitectura .NET Figura 1.1 schematizeaz arhitectura platformei Microsoft .NET. Orice a program scris ntr-unul din limbajele .NET este compilat Microsoft Intern mediate Language (MSIL), concordant cu Common Language Specican a tion (CLS). Aceste limbaje sunt sprijinite de o bogat colectie de biblioteci a de clase, ce pun la dispozitie faciliti pentru dezvoltarea de Web Forms, at Windows Forms i Web Services. Comunicarea dintre aplicatii i servicii se s s face pe baza unor clase de manipulare XML i a datelor, ceea ce sprijin s a dezvoltarea aplicatiilor cu arhitectur n-tier. Base Class Library exist pen a a tru a asigura functionalitate de nivel sczut, precum operatii de I/O, re de a executie, lucrul cu iruri de caractere, comunicatie prin retea, etc. Aceste s clase sunt reunite sub numele de .NET Framework Class Library, ce permite dezvoltarea rapid a aplicatiilor. La baza tuturor se a cea mai impora a tant component a lui .NET Framework - Common Language Runtime, a a care rspunde de executia ecrui program. Mediul de dezvoltare Visual a a Studio .NET nu este absolut necesar pentru a dezvolta aplicatii (exist i a s alternative open-source pentru el), dar datorit extensibilitii este cel mai a at

12

CURS 1. PLATFORMA MICROSOFT .NET

bine adaptat pentru crearea aplicatiilor. Evident, nivelul inferior este rezer vat sistemului de operare. Trebuie spus c platforma .NET nu este exclusiv a dezvoltat pentru sistemul de operare Microsoft Windows, ci i pentru arome a s 4 de Unix (FreeBSD sau Linux - a se vedea proiectul Mono ).

1.31.3.1

Componente ale lui .NET FrameworkMicrosoft Intermediate Language

Una din uneltele de care dispune ingineria software este abstractizarea. Deseori vrem s ferim utilizatorul de detalii, s punem la dispozitia altora a a o interfat simpl, care s permit atingerea scopului, fr a necesare a a a a aa cunoaterea tuturor detaliilor. Dac interfata rmne neschimbat, se pot s a a a a modica toate detaliile interne, fr a afecta actiunile celorlati beneciari ai aa codului. cazul limbajelor de programare, s-a ajuns treptat la crearea unor nivele In de abstractizare a codului rezultat la compilare, precum p-code (cel produs de compilatorul Pascal-P) i bytecode (binecunoscut celor care au lucrat Java). s n Bytecode-ul Java, generat prin compilarea unui ier surs, este cod scris s a ntrun limbaj intermediar care suport POO. Bytecod-ul este acelai timp o a n s abstractizare care permite executarea codului Java, indiferent de platforma int, atta timp ct aceast platform are implementat o main virtual t a a a a a a s a a Java, capabil s traduc mai departe ierul class cod nativ. a a a s n Microsoft a realizat i el propria sa abstractizare de limbaj, aceasta nus mindu-se Common Intermediate Language. Dei exist mai multe limbaje s a de programare de nivel nalt (C#, Managed C++, Visual Basic .NET, etc), la compilare toate vor produce cod acelai limbaj intermediar: Microsoft n s Intermediate Language (MSIL, sau IL pe scurt). Asemntor cu bytecod-ul, a a IL are trsturi OO, precum abstractizarea datelor, motenirea, polimorsaa s mul, sau concepte care s-au dovedit a extrem de necesare, precum exceptiile sau evenimentele. De remarcat c aceast abstractizare de limbaj permite a a rularea aplicatiilor independent de platform (cu aceeai conditie ca la Java: a s s existe o main virtual pentru acea platform). a s a a a

1.3.2

Common Language Specication

Unul din scopurile .NET este de a sprijini integrarea limbajelor astfel at nc programele, dei scrise diferite limbaje, pot interopera, folosind din plin s n motenirea, polimorsmul, s ncapsularea, exceptiile, etc. Dar limbajele nu 4

www.go-mono.com

1.3. COMPONENTE ALE LUI .NET FRAMEWORK

13

sunt identice: unele suport supra arcarea operatorilor (Managed C++, a nc C#), altele nu (Visual Basic .NET); unele sunt case sensitive, altele nu. Pentru a se asigua totui interoperabilitatea codului scris diferite limbaje, s n Microsoft a publicat Common Language Specication (CLS), un subset al lui CTS (Common Type System, vezi 1.3.4), continnd specicatii de reguli a necesare pentru integrarea limbajelor. CLS denete un set de reguli pentru compilatoarele .NET, asigurnd s a faptul c ecare compilator va genera cod care interfereaz cu platforma a a (mai exact, cu CLRul vezi mai jos) ntr-un mod independent de limbajul surs. Obiectele i tipurile create diferite limbaje pot interactiona fr a s n aa probleme suplimentare. Combinatia CTS/CLS realizeaz de fapt interoper a area limbajelor. Concret, se poate ca o clas scris C# s e motenit a a n a s a de o clas scris Visual Basic care arunc exceptii ce sunt prinse de cod a a n a scris C++ sau J#. n

1.3.3

Common Language Runtime

CLR este de departe cea mai important parte component a lui .NET a a Framework. Este responsabil cu managementul i executia codului scris s n limbaje .NET, aat format IL; este foarte similar cu Java Virtual Machine. n CLR instantiaz obiectele, face vericri de securitate, depune obiectele a a n memorie, disponibilizeaz memoria prin garbage collection. a urma compilrii unei aplicatii rezult un ier cu extensia exe, dar In a a s care nu este un executabil portabil Windows, ci un executabil portabil .NET (.NET PE). Acest cod nu este deci un executabil nativ, ci se va rula de ctre CLR, a ntocmai cum un ier class este rulat cadrul JVM. CLR s n folosete tehnologia compilrii JIT - o implementare de main virtual, s a s a a n care o metod sau o functie, momentul care este apelat pentru prima a n n a oar, este tradus cod main. Codul translatat este depus a a n s a ntr-un cache, evitnd-se astfel recompilarea ulterioar. Exist 3 tipuri de compilatoare a a a JIT: 1. Normal JIT - a se vedea descrierea de mai sus. 2. Pre-JIT - compileaz a ntregul cod cod nativ singur dat. mod n a a In normal este folosit la instalri. a 3. Econo-JIT - se foloete pe dispozitive cu resurse limitate. Compileaz s s a codul IL bit cu bit, elibernd resursele folosite de codul nativ ce este a stocat cache. n

14

CURS 1. PLATFORMA MICROSOFT .NET

esent, activitatea unui compilator JIT este destinat a In a a mbunti pera at formanta executiei, ca alternativ la compilarea repetat a aceleiai buci a a s at de cod cazul unor apelri multiple. Unul din avantajele mecanismului JIT n a apare clipa care codul, o dat ce a fost compilat, se execut pe diverse n n a a procesoare; dac maina virtual este bine adaptat la noua platform, atunci a s a a a acest cod va benecia de toate optimizrile posibile, fr a mai nevoie a aa recompilarea lui (precum C++, de exemplu). n

1.3.4

Common Type System

Pentru a asigura interoperabilitatea limbajelor din .NET Framework, o clas scris C# trebuie s e echivalent cu una scris VB.NET, o a a n a a a n interfat scris Managed C++ trebuie s e perfect utilizabil Managed a a n a a n Cobol. Toate limbajele care fac parte din pleiada .NET trebuie s aibe un set a comun de concepte pentru a putea integrate. Modul care acest deziderat n s-a transformat realitate se numete Common Type System (CTS); orice n s limbaj trebuie s recunoasc i s poat manipula nite tipuri comune. a as a a s O scurt descriere a unor faciliti comune (ce vor exhaustiv enumerate a at i tratate cadrul prezentrii limbajului C#): s n a 1. Tipuri valoare - general, CLR-ul (care se ocup de managementul i n a s executia codului IL, vezi mai jos) suport dou tipuri diferite: tipuri a a valoare i tipuri referint. Tipurile valoare reprezint tipuri alocate s a a pe stiv i nu pot avea valoare de null. Tipurile valoare includ tipuas rile primitive, structuri i enumerri. Datorit faptului c de regul s a a a a au dimensiuni mici i sunt alocate pe stiv, se manipuleaza ecient, s a reducnd overhead-ul cerut de mecanismul de garbage collection. a 2. Tipuri referint - se folosesc dac variabilele de un anumit tip cer a a resurse de memorie semnicative. Variabilele de tip referinta contin adrese de memorie heap i pot null. Transferul parametrilor se face s rapid, dar referintele induc un cost suplimentar datorit mecanismului a de garbage collection. 3. Boxing i unboxing - motivul pentru care exist tipuri primitive este s a a orice variabil .NET este acelai ca i Java: performanta. Ins s s n a n compatibil cu clasa Object, rdcina ierarhiei existente .NET. De a a a n exemplu, int este un alias pentru System.Int32, care se deriveaz din a System.ValueType. Tipurile valoare se stocheaz pe stiv, dar pot a a oricnd convertite a ntr-un tip referint memorat heap; acest mecana n ism se numete boxing. De exemplu: s

1.3. COMPONENTE ALE LUI .NET FRAMEWORK int i = 1; //i - un tip valoare object box = i; //box - un obiect referinta

15

Cnd se face boxing, se obtine un obiect care poate gestionat la fel a ca oricare altul, fcnduse abstractie de originea lui. a a Inversa boxing-ului este unboxing-ul, prin care se poate converti un obiect tipul valoare echivalent, ca mai jos: n int j = (int)box; unde operatorul de conversie este sucient pentru a converti de la un obiect la o variabil de tip valoare. a 4. Clase, proprieti, indexatori - platforma .NET suport pe deplin proat a gramarea orientat pe obiecte, concepte legate de obiecte ( a ncapsularea, motenirea, polimorsmul) sau trsturi legate de clase (metode, cms aa a puri, membri statici, vizibilitate, accesibilitate, tipuri interioare, etc). De asemenea se includ trsturi precum proprieti, indexatori, eveniaa at mente. 5. Interfete - reprezint acelai concept precum clasele abstracte din C++ a s (dar continnd doar functii virtuale pure), sau interfetele Java. O a clas care se deriveaz dintr-o interfat trebuie s implementeze toate a a a a metodele acelei interfete. Se permite implementarea simultan a mai a multor interfete ( rest motenirea claselor este simpl). n s a 6. Delegati - inspirati de pointerii la functii din C, ce permit programarea generic. Reprezint versiunea sigur a pointerilor ctre functii din a a a a C/C++ i sunt mecanismul prin care se trateaz evenimentele. s a Exist numeroase componente ale lui CLR care fac cea mai impora l tant parte a lui .NET Framework: metadata, assemblies, assembly cache, a reection, garbage collection.

1.3.5

Metadata

Metadata nseamn general date despre date. cazul .NET, ea a n In reprezint informatii destinate a citite de ctre main, nu de utilizatorul a a s a uman. Este stocat a mpreun cu codul pe care descrie. Pe baza metadatei, a l CLR tie cum s instantieze obiectele, cum s le apeleze metodele, cum s s a a a acceseze proprietile. Printr-un mecanism numit reection, o aplicatie (nu at

16

CURS 1. PLATFORMA MICROSOFT .NET

neaprat CLR) poate s interogheze aceast metadat i s ae ce expune a a a as a un obiect. Mai pe larg, metadata contine o declaratie a ecrui tip i cte o declaratie a s a pentru ecare metod, cmp, proprietate, eveniment al tipului respectiv. a a Pentru ecare metod implementat, metadata contine informatie care pera a mite arctorului clasei respective s localizeze corpul metodei. De asemena nc a a mai poate contine declaratii despre cultura aplicatiei respective, adic despre a localizarea ei (limba folosit partea de interfat utilizator). Mecanismul a n a prin care aceste informatii se folosesc pe parcursul rulrii de ctre aplicatii a a se numete reection. s

1.3.6

Assemblies

Un assembly reprezint un bloc functional al unei aplicatii .NET. El a formeaz unitatea fundamental de distribuire, versionare, reutilizare i pera a s misiuni de securitate. La runtime, un tip de date exist interiorul unui a n assembly (i nu poate exista exteriorul acestuia). Un assembly contine s n metadate care sunt folosite de ctre CLR. Scopul acestor assemblies este a s se asigure dezvoltarea softului mod plug-and-play. Dar metadatele a n nu sunt suciente pentru acest lucru; mai sunt necesare i manifestele. s Un manifest reprezint metadate despre assembly-ul care gzduiete tia a s purile de date. Contine numele assembly-ului, informatia despre versiune, referiri la alte assemblies, o list a tipurilor assembly, permisiuni de secua n ritate i altele. s Un assembly care este artit mp ntre mai multe aplicatii are de asemenea un shared name. Aceast informatie care este unic este optional, neaprnd a a a aa manifestul unui assembly daca acesta nu a fost gndit ca o aplicatie parn a tajat. a Deoarece un assembly contine date care descriu, instalarea lui poate l fcut copiind assemblyul directorul destinatie dorit. Cnd se dorete rua a n a s larea unei aplicatii continute assembly, maniferstul va instrui mediul .NET n despre modulele care sunt continute assembly. Sunt folosite de asemenea n i referintele ctre orice assembly extern de care are nevoie aplicatia. s a Versionarea este un aspect deosebit de important pentru a se evita aa s numitul DLL Hell. Scenariile precedente erau de tipul: se instaleaza o aplicatie care aduce nite iere .dll necesare pentru functionare. Ulterior, o s s alt aplicatie care se instaleaz suprascrie aceste iere (sau mcar unul din a a s a ele) cu o versiune mai nou, dar cu care vechea aplicatie nu mai functioneaz a a corespunztor. Reinstalarea vechii aplicatii nu rezolv problema, deoarece a a a doua aplicatie nu va functiona. Dei ierele dll contin informatie relativ s s la versiune interiorul lor, ea nu este folosit de ctre sistemul de operare, n a a

1.4. TRASATURI ALE PLATFORMEI .NET

17

ceea ce duce la probleme. O solutie la aceast dilem ar instalarea ierelor a a s dll directorul aplicatiei, dar acest mod ar disprea reutilizarea acestor n n a biblioteci.

1.3.7

Assembly cache

Assembly cache este un director aat mod normal directorul \Winnt n n \Assemblies. Atunci cnd un assembly este instalat pe o main, el va a s a adugat assembly cache. Dac un assembly este descrcat de pe Internet, a n a a el va stocat acest assembly cache, n ntr-o zon tranzient. Aplicatiile a a instalate vor avea assemblies ntr-un assembly cache global. acest assembly cache vor exista versiuni multiple ale aceluiai assemIn s bly. Dac programul de instalare este scris corect, va evita suprascrierea a assembly-urilor deja existente (i care functioneaz perfect cu acplicatiile s a instalate), adugnd doar noul assembly. Este un mod de rezolvare a proba a lemei DLL Hell, unde suprascrierea unei biblioteci dinamice cu o variant a mai nou putea duce la nefunctionarea corespunztoare a aplicatiilor antea a rior instalate. CLR este cel care decide, pe baza informatiilor din manifest, care este versiunea corect de assembly de care o aplicatie are nevoie. Acest a mecanism pune capt unei epoci de trist amintire pentru programatori i a a s utilizatori.

1.3.8

Garbage collection

Managementul memoriei este una din sarcinile cele mai consumatoare de resurse umane. Garbage collection este mecanismul care se declaneaz s a atunci cnd alocatorul de memorie rspunde negativ la o cerere de alocare de a a memorie. Implementarea este de tip mark and sweep: se presupune initial c toat memoria alocat se poate disponibiliza, dupa care se determin a a a a care din obiecte sunt referite de variabilele aplicatiei; cele care nu mai sunt referite sunt dealocate, celelalte zone de memorie sunt compactate. Obiectele a cror dimensiune de memorie este mai mare dect un anumit prag nu mai a a sunt mutate, pentru a nu crete semnicativ penalizarea de performant. s a general, CLR este cel care se ocup de apelarea mecanismului de In a garbage collection. Totui, la dorint, programatorul poate cere rularea lui. s a

1.4

Trsturi ale platformei .NET a a

Prin prisma celor prezentate pna acum putem rezuma urmtoarele tra a a sturi: a

18

CURS 1. PLATFORMA MICROSOFT .NET Dezvoltarea multilimbaj: Deoarece exist mai multe limbaje pentru a aceast platform, este mai uor de implementat prti specice lima a s a n bajele cele mai adecvate. Numarul limbajelor curent implementate este mai mare dect 10. Aceast dezvoltare are vedere i debugging-ul a a n s aplicatiilor dezvoltate mai multe limbaje. n Independenta de procesor i de platform: IL este independent s a de procesor. O dat scris i compilat, orice aplicatie .NET (al crei a as a a management este fcut de ctre CLR) poate rulat pe orice platform. a a a a Datorit CLR-ului, aplicatia este izolat de particularitile hardware a a at sau ale sistemului de operare. Managementul automat al memoriei: Problemele de tipul memory leakage nu mai trebuie s preocupe programatorii; overhead-ul ina dus de ctre mecanismul de garbage collection este suportabil, ind a implementat sisteme mult mai timpurii. n Suportul pentru versionare: Ca o lectie aat din perioada de nvt a DLL Hell, versionarea este acum un aspect de care se ine cont. t Dac o aplicatie a fost dezvoltat i testat folosind anumite compoa as a nente, instalarea unei componente de versiune mai nou nu va atenta la a buna functionare a aplicatiei discutie: cele dou versiuni vor coexista n a panic, alegerea lor ind fcut pe baza manifestelor. s a a Sprijinirea standardelor deschise: Nu toate dispozitivele ruleaz a sisteme de operare Microsoft sau folosesc procesoare Intel. Din aceast a cauz orice este strns legat de acestea este evitat. Se folosete XML i a a s s cel mai vizibil descendent al acestuia, SOAP. Deoarece SOAP este un protocol simplu, bazat pe text, foarte asemntor cu HTTP5 , el poate a a trece uor de rewall-uri, spre deosebire de DCOM sau CORBA. s Distribuirea uoar: Actualmente instalarea unei aplicatii sub Wins a dows nseamn copierea unor iere nite directoare anume, moa s n s dicarea unor valori regitri, instalare de componente COM, etc. n s Dezinstalarea complet a unei aplicatii este in majoritatea cazurilor a o utopie. Aplicatiile .NET, datorit metadatelor i reectrii trec de a s a aceste probleme. Se dorete ca instalarea unei aplicatii s nu s a nsemne mai mult dect copierea ierelor necesare a s ntr-un director, iar dezinstalarea aplicatiei s se fac prin tergerea acelui director. a a s Arhitectur distribuit: Noua losoe este de a asigura accesul la a a servicii Web distribuite; acestea conlucreaz la obtinerea informatiei a 5

Folosit la transmiterea paginilor Web pe Internet

1.4. TRASATURI ALE PLATFORMEI .NET

19

dorite. Platforma .NET asigur suport i unelte pentru realizarea acesa s tui tip de aplicatii. Interoperabilitate cu codul unmanaged: Codul unmanaged se refer la cod care nu se a totalitate sub controlul CLR. El a a n este rulat de CLR, dar nu beneciaz de CTS sau garbage collection. a Este vorba de apelurile functiilor din DLL-uri, folosirea componentelor COM, sau folosirea de ctre o component COM a unei componente a a .NET. Codul existent se poate folosi continuare. n Securitate: Aplicatiile bazate pe componente distribuite cer automat securitate. Modalitatea actual de securizare, bazat pe drepturile a a contului utilizatorului, sau cel din Java, care codul suspectat este n rulat ntr-un sandbox, fr acces la resursele critice este aa nlocuit n .NET de un control mai n, pe baza metadatelor din assembly (zona din care provine - ex. Internet, intranet, maina local, etc) precum i s a s a politicilor de securitate ce se pot seta.

20

CURS 1. PLATFORMA MICROSOFT .NET

Curs 2 Vedere general asupra a limbajului C#. Tipuri predenite. Tablouri. Siruri de caractere2.1 Vedere general asupra limbajului C# a

C#1 este un limbaj de programare modern, simplu, obiectorientat. Este foarte asemntor cu Java i C++, motiv pentru care curba de aare este a a s nvt foarte lin. a Un prim exemplu de program, care contine o serie de elemente ce se vor alni continuare, este: nt n using System; class HelloWorld { public static void Main() { Console.WriteLine(Hello world!); } } Prima linie using System; este o directiv care specic faptul c se vor a a a 2 folosi clasele care sunt incluse spatiul de nume System; un spatiu de n nume este o colectie de tipuri sau o grupare de alte spatii de nume care pot 1 2

# se pronunt sharp a Eng: namespace

21

22

CURS 2. TIPURI PREDEFINITE, TABLOURI, STRING-URI

folosite ntr-un program (detalii vor date mai trziu). cazul de fat, a In a clasa care este folosit din acest spatiu de nume este Console. Mai departe, a orice program este continut ntro clas, cazul nostru HelloWorld. Punctul a n de intrare aplicatie este metoda Main, care nu preia acest exemplu nici n n un argument din linia de comand i nu returneaz explicit un indicator de as a stare a terminrii. a Pentru operatiile de intrareieire cu consola, se folosete clasa Console s s din spatiul de nume System; pentru aceast clas se apeleaz metoda static a a a a WriteLine, care aeaz pe ecran mesajul, dup care face trecerea la linie s a a nou. a O variant uor modicat a programului de mai sus, care se salut a s a n a persoanele ale cror nume este transmis prin linia de comand: a a using System; class HelloWorld { public static void Main( String[] args) { for( int i=0; i