Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Istoricul versiunilor
Versiunea
Anul
Denumire Versiune .NET
lansării
Framework
Visual Studio 4.0 N/A 1995
Visual Studio 97 5.0 N/A 1997
Visual Studio 6.0 6.0 N/A 1998
Visual Studio .NET (2002) 7.0 1.0 2002
Visual Studio .NET 2003 7.1 1.1 2003
Visual Studio 2005 8.0 2.0 2005
Visual Studio 2008 9.0 3.5 2007
Visual Studio 2010 10.0 4.0 2010
Visual Studio 2012 11.0 4.5 2011
Visual Studio 2013 12.0 4.5.1 2013
Visual Studio 2015 14.0 4.6 2015
Anterior versiunii Visual Studio 4.0 a existat Visual Basic 3, Visual C++, Visual FoxPro și
Source Safe ca și produse independente.
Pe lângă limbajele amintite anterior, Microsoft Visual Studio oferă suport și pentru alte
limbaje, cum ar fi M, Python, Ruby. De asemenea, sprijină XML/XSLT, HTML/XHTML,
JavaScript și CSS.
1
Programare orientată pe obiecte Curs 7
Visual studio este oferit în mai multe variante: Express, Professional, Premium, Ultimate,
Test Professional.
Tehnologia .NET pune laolaltă mai multe tehnologii (ASP, XML, OOP, SOAP, WDSL,
UDDI) şi limbaje de programare (ex.: C++, VB, C#) asigurând, totodată, atât portabilitatea codului
compilat între diferite calculatoare cu sistem Windows, cât şi reutilizarea codului în programe,
indiferent de limbajul de programare utilizat. Pentru a fi integrate în platforma .NET, limbajele de
programare sus amintite respectă un set de caracteristici de bază Common Language
Specification (CLS), astfel asigurându-se interoperabilitatea între aplicaţii, indiferent de limbajul
folosit pentru crearea acestora. CLS-ul definește și un set de tipuri - Common Type System
(CTS). Ca elemente de bază, limbajele de programare au: clase, interfeţe, delegări, tipuri valoare şi
referinţă, iar ca mecanisme: moştenirea, polimorfismul şi tratarea excepţiilor. Limbajele au o
platformă comună de executare numită Common Language Runtime (CLR). Toate aceste
limbaje folosesc un ansamblul de biblioteci necesare în realizarea aplicaţiilor desktop sau Web,
numit Framework Class Library (FCL). În figura de mai jos este arhitectura pentru .NET
Framework.
Componenta .NET Framework este formată din compilatoare, biblioteci şi alte executabile
utile în rularea aplicaţiilor .NET. Fişierele corespunzătoare se află, în general, în directorul
C:\WINDOWS\Microsoft.NET\Framework\V…. (corespunzător versiunii instalate).
Compilarea programelor
Un program scris într-unul dintre limbajele .NET conform Common Language
Specification (CLS) este compilat în Microsoft Intermediate Language (MSIL sau IL). Codul
astfel obţinut are extensia ".exe", dar nu este direct executabil, ci respectă formatul unic MSIL.
2
Programare orientată pe obiecte Curs 7
Limbajul C#
Limbajul C# a fost dezvoltat de o echipă de ingineri de la Microsoft în frunte cu 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 predefinite. El permite programarea
structurată, modulară şi orientată obiectual, conform perceptelor moderne ale programării
profesioniste. Principiile de bază ale programării orientate pe obiecte (încapsulare, moștenire,
polimorfism) sunt elemente fundamentale ale programării C#.
La baza acestuia stă limbajul C dar sunt preluate și principiile de programare din C++. Sintaxa este
apropiată și limbajului Java.
Au fost adăugate o serie de tipuri noi de date sau funcţiuni diferite ale datelor din C++, iar în
spiritul realizării unor secvenţe de cod sigure (safe), unele funcţiuni au fost adăugate (de exemplu,
interfeţe şi delegări), diversificate (tipul struct), modificate (tipul string) sau chiar eliminate
(moştenirea multiplă şi pointerii către funcţii). Unele funcţiuni (cum ar fi accesul direct la memorie
folosind pointeri) au fost păstrate, dar secvenţele de cod corespunzătoare se consideră „nesigure”.
În momentul în care Microsoft a decis să susțină și să dezvole C# s-a hotărât ca acesta să aibă o
legatura deosebita cu mediul sau de rulare, arhitectura .NET. Pe de o parte, C# a fost dezvoltat
pentru crearea codului pentru arhitectura .NET, iar pe de alta parte bibliotecile utilizate de C# sunt
cele ale arhitecturii .NET. Atunci cand este compilat un program C#, rezultatul compilarii nu este
un cod executabil ci se se produce un fisier într-un limbaj. Acest fisier IL poate fi copiat in orice
calculator care dispune de .NET CLR, prin intermediul compilatorului JIT (Just In Time), motorul
comun de pogramare transforma codul intermediar in cod executabil.
3
Programare orientată pe obiecte Curs 7
Avantaje:
o permite un control foarte precis asupra momentului în care este distrus un obiect, astfel
folosindu-se memoria exact atât cât este nevoie;
o permite folosirea destructorilor, astfel obiectele fiind întotdeauna şterse corespunzător.
Dezavantaje:
o riscul de a apela prea târziu (sau deloc) operatorul delete. Omiterea apelării operatorului
delete nu este în general fatală pentru program, dar conduce la ocuparea memoriei mai mult
decât este necesar (memory leakage). Memory leak este o eroare de programare în care
programatorul a alocat memorie pe heap utilizând funcţiile din libraria standard C (malloc,
calloc, realloc) sau operatorul C++ new, dar nu a mai dezalocat memoria alocata . Acest
fapt reprezintă o problemă deoarece consumul de memorie al aplicaţiei poate creşte în mod
necontrolat. Problema devine critică mai ales în cazul aplicatiilor care trebuie sa ruleze un
timp îndelungat (de exemplu un server de baza de date, sau un server web, un filesystem ...
etc).
o riscul de a apela prea devreme operatorul delete –este o problemă mult mai gravă.
Exemplu:
//cream un obiect
Punct *P=new Punct();
4
Programare orientată pe obiecte Curs 7
Tipuri numerice
a)Intregi
În C# sunt definite 9 tipuri de întregi : char, byte, sbyte, short, ushort, int, uint, long, ulong. Cu
excepția lui char, toate sunt folosite la calcule numerice.
Variabilele de tip int se utilizează în controlul buclelor, indexarea tablourilor, aritmetica normală
cu numere intregi. Se recomandă ca atunci când este nevoie de o valoare ( fără semn ) care
depășește domeniul lui int, să se folosească uint. În cazul valorilor mari este recomandat long, iar
la cele fara semn, ulong.
b) În virgulă mobilă
Tipurile în virgulă mobilă se utilizează pentru reprezentarea numerelor care au parte fracționară.
Există două tipuri : float, double.
c) Decimal
Tipul decimal este folosit în calculele monetare. El are avantajul că elimină erorile de rotunjire
atunci când se lucrează cu valori fracționare, pentru că poate reprezenta în mod precis până la 28
de poziții zecimale. Tipul decimal nu exista in C, C++, Java.
5
Programare orientată pe obiecte Curs 7
d) Tipuri Bool
Tipul bool reține valorile de adevăr ( “true” ) și fals ( “false” ). Orice expresie de tipul bool va lua
una din aceste valori.
Important: Nu se poate converti.
e) Caractere
In C#, pentru caractere se utilizează modelul Unicode.
Exemplu:
struct Persoana
{
public string nume;
public string prenume;
public int varsta;
}
Tipul enumerare
Tipul enumerare se definește de programator și se aseamănă cu cel din C++. Acest tip permite
folosirea numelor cărora li se atribuie o valoare. Este recomandată declararea și definirea
enumerărilor direct în interiorul unui spațiu de nume, pentru a putea fi folosită de toate clasele.
In cazul in care nu se specifică tipul enumerării, acesta este considera implicit int. ( [] – optional )
namespace tipulEnum
{
enum ZileSaptamana
{
Luni = 1,
Marti,
6
Programare orientată pe obiecte Curs 7
Miercuri,
Joi,
Vineri,
Sambata,
Duminica
}
}
Important: Implicit, valoarea primului membru din enumerare este 0. Tipurile enum sunt derivate
din clasa System.Enum, derivata din System.ValueType.
Tipurile nullable
Sunt tipuri valoare pentru care se pot memora valori posibile din aria tipurilor de baza, inclusiv
valoare null.
Valoarea unei variabile conține valoarea implicită a tipului, daca nu este initializată explicit. Se
folosesc atunci când se dorește ca valoarea implicită a variabilei să nu fie definită.
Exemplu:
Nullable<int> a ;
//Un alt mod de a declara o variabila de acest tip este:
int? a = null;
//iar verificarea se poate face in felul urmator:
Console.WriteLine(“valoarea variabilei este {0}”, a ?? “null”);
C++ vs C#
C++ este un limbaj de programare care are capabilități high-level (POO) și low-level(lucrul cu
pointerii, adresele de memorie etc). C++ este privit ca un “mid-level language”.
C# este un limbaj simplu, modern orientat obiect și “type-safe programming language” (ex.: nu
ești lăsat să faci unele declarații care în C++ generau erori gen “Access violation”)
1) În .Net este implementat Garbage Collector, “unealta” care permite gestionarea automată a
memoriei. Nu mai este obligatorie folosirea operatorilor “delete” sau “delete[]” din c++,
framework-ul se ocupa de memorie, decide dacă anumite zone de memorie si-au încetat activitatea
și le dealocă automat. Din acest motiv, de multe ori, destructorii în C# au doar un rol simbolic.
2) Codul C++ este compilat în cod assembly, pe cand codul c# este compilat in “Intermediate
language” (sau pe scurt IL), apoi acesta este compilat în executabil printr-o metoda Just-In-Time
Compilation. O altă mare diferență față de C++.
7
Programare orientată pe obiecte Curs 7
3) În C# obiectele simple precum int, float, double, sau struct-urile sunt create pe stiva, iar clasele
întotdeauna în coadă.
În C++ un șir este pur și simplu o serie de caractere. În C #, sirurile de caractere sunt obiecte ale
clasei String, clasă înzestrată cu o gamă largă de metode.
4) În C++ un tablou este doar un pointer. În C# tablourile sunt obiecte care includ metode și
proprietăți (exemplu: dimensiunea unui tablou poate fi obținută prin intermediul proprietății
Length). Mai mult, în C# este verificat fiecare indice utilizat pentru a accesa elementele tabloului.
Există diferențe și de sintaxă pentru declararea tablourilor: semnul "[]" apare în C# după tipul
elementelor tabloului în timp ce în C++ apare după variabilă.
Exemplu:
C#: int[] tablou;
C++: int tablou[5];
Dacă în C++ toate variabilele sunt transmise prin valoare (cu excepția cazului în care se utilizează
pointeri sau o referințe), în C# clasele sunt transmise prin referință și structurile sunt transmise prin
valoare, cu excepția cazului în care se folosește explicit modificatorul ref sau out.
8) În C# instrucțiunile if /else , while, for sunt la fel ca în C++. switch diferă prin faptul că este
obligatoriu să se pună break după fiecare case.
În C# se poate folosi foreach:
int[] v = new int { 1, 4, 7, 9, 11, 25, 6 };
foreach (int i in v)//aici se creaza de fiecare data un
obiect virtual int
if (i % 2 == 0)
Console.WriteLine(i);//echivalent cout<<i<<endl;
Această instrucțiune are dezavantajul că se crează obiecte virtuale și îngreaunează lucrul, dar
pentru procesoarele de astăzi nu mai este o problemă.
În C++ tipul bool este în esență un număr întreg pe când în C # nu există nici o conversie între
tipul bool și alte tipuri. Din acest motiv instrucțiunile conditionale (if, while etc) nu mai merg ca în
C++, spre exemplu:
int x = 4;
if (x){…} ;//!!!eroare, conditiile trebuie sa fie de tip bool
if (x != 0) ;//corect
bool b = true;
if (b) {…} ;// corect
8
Programare orientată pe obiecte Curs 7
10) În C# se poate folosi tipul object, care practic poate reține orice:
object o1 = “un text”;
object o2 = 12.3F;
float f = (float)o2;
object[] tab = new object[] { “alt text”, 100, null,
DateTime.Now };
11) În C#, la try-catch s-a mai adăugat blocul finally pentru cod sursă care trebuie executat
indiferent dacă o excepție este aruncată sau nu. Este foarte util spre exemplu la lucru cu baze de
date (conexiunile se închid întotdeauna în finally) sau stream-uri.
12) În C# se pot folosi proprietățile, care sunt o formă mai elegantă pentru metodele de tipul get,
set:
class mycls
{
int variabila;
public: int get(){return variabila;}
void set(int _var){variabila=_var;}
}
membrii suprascriși ai clasei de bază. Suprascrierea metodelor virtuale sau abstracte se face în mod
explicit folosind cuvântul rezervat override.
15) Dacă în C++ typedef este folosit pentru a crea denumiri mai scurte sau mai convenabile pentru
tipurile care au fost deja declarate, în C# se va utiliza directiva using.
16) În C++ directiva #define utilizată pentru a declara valori constante. În C# această directivă nu
poate fi utilizată în acest scop. În C # constantele sunt definite ca enumerări sau ca membri statici
ai unei clase sau structuri.
10