Programare orientată pe obiecte Curs 7 [632077]

Programare orientată pe obiecte Curs 7

1

Microsoft Visual Studio

Microsoft Visual Studio este un mediu de dezvoltare integrat ( integrated development
environment – IDE) de la Microsoft. Acesta poate fi folosit pentru a dezvolta aplicații consolă și
aplica ții cu interfață grafică pentru toate platformele suportate de Microsoft Windows (ex. .NET
Framework , Windows Mobile etc).

Istoricul versiunilor

Denumire Versiune Versiunea
.NET
Framework Anul
lansării
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 201 2 11.0 4.5 2011
Visual Studio 201 3 12.0 4.5.1 2013
Visual Studio 201 5 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 .

Microsoft Visual Studio oferă editor, compilator/debugger și mediu de proiectare
(designer) pentru mai multe limbaje de programare. Limbaje de programare incluse: Microsoft
Visual C ++, Microsoft Visual C #, Microsoft Visual Basic , Microsoft Visual Web Developer , Team
Foundation Server .

Limbaje anterioare: Visual FoxPro (eliminat în 2007), Visual SourceSafe (întrerupt
începând cu Visual Studio 2008), Microsoft Visual J++/ Microsoft Visual J # (întrerupt începând
cu Visual Studio 2008), Visual InterDev (înlocuit cu Microsoft Visual Web Developer).

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.

Programare orientată pe obiecte Curs 7

2 Visual studio este oferit în mai multe variante: Express, Profess ional, Premium, Ultimate,
Test Professional.

.NET Framework este o platformă /cadru (Framework) de dezvoltare software unitară ,
înzestrată cu un set mare de clase, structuri , enumerări etc., organizate într -un set de spații de nume
(namespaces ) bazate pe un limbaj comun.
.NET Framework este o componentă livrată împreună cu sistemul de operare Windows.
Ultima versiune de .NET Framework este .NET Framework 4.6 și este inclusă în Windows 10 .

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ștenire a, polimorfism ul ș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 core spunză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.

Programare orientată pe obiecte Curs 7

3 CLR include o mașină virtuală asemănătoare cu o mașină Java, ce execută instrucțiunile IL
rezultate în urma compilării. Mașina folosește un compilator special JIT (Just In Time) .
Compilatorul JIT analizează codul IL corespunzător apelului unei metode și produce codul mașină
adecvat și eficient. El recunoaște secvențele de cod pentru care s -a obținut deja codul mașină
adecvat, permițând reutilizarea acestuia fără recompilare, ceea ce face ca, pe parcursul rulării,
aplicațiile .NET să fie din ce în ce mai rapide. Faptul că programul IL p rodus de diferitele limbaje
este foarte asemănător are ca rezultat interoperabilitatea între aceste limbaje. Astfel, clasele și
obiectele create într -un limbaj specific .NET pot fi utilizate cu succes în altul. Pe lângă cele de mai
sus, CLR -ul se ocupă și de gestionarea automată a memoriei (eliberare a automată a zonelor de
memorie asociate unor date devenite inutile ).
Privitor la portabilitate, .NET Framework are la bază standard ul Common Language
Infrastructure , ceea ce face ca aplicațiil e .NET să ruleze , în afară de Windows, și pe unele tipuri
de Unix, Linux, Solaris, Mac OS X și alte sisteme de operare.
Dintre a vantaje le utilizării platformei .NET Framework putem enumera:
 oferă instrumente pe care le putem folosi și în alte programe;
 oferă acces ușor la b aze de date;
 permite realizarea desenelor sau a altor elemente grafice.
 spațiul de nume System .Windows .Forms conține instrumente (controale) ce permit
implementarea elementelor interfeței grafice cu utilizatorul;
 oferă clase care efectuează majoritatea sarcinilor uzuale cu care se confruntă,
reducând astfel timpul necesar dezvoltării aplicațiilor.

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 ec hipei 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 f undamentale 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ă „n esigure”.

Î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 compilator ului JIT (Just In Time), motorul
comun de po gramare transforma codul intermediar in cod executabil.

Programare orientată pe obiecte Curs 7

4 Gestionarea automată a memoriei

Prin intermediul operatorilor new și delete , în C ++, programatorul gestionează manual
memoria ceea ce conferă avantaje dar și dezavantaje.

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
programa torul 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 serv er web, un filesystem …
etc).
o riscul de a apela prea devreme operatorul delete –este o p roblemă mult mai gravă.

Exemplu:

//cream un obiect
Punct *P= new Punct();

//il transmitem unei funcții
oFunctie(P);
//folosim obiectul
P->daX();//!!!!!!obiectul a fost șters în funcție. EROARE!!!!!

void oFunctie(Punct *pct){
//folosește obiectul
pct->daX();
//s-a terminat de folosit obiectul???
delete pct;
}

Ca și Sun Microsystems în cazul limbajului Java, Microsoft a decis că dezavantajele
gestionării manuale a alocărilor făcute depășesc avantajele oferite, de aceea s-a trecut la
gestionarea automată a memoriei.
Se pot crea în continuare obiecte în mod dinamic, dar ștergerea obiectelor intră în
responsabilitatea sistemului, nu a programatorului. Sistemul urmărește referirile la obiecte și atunci
când un obiect nu mai este referit, devine un candidat pentru “colectarea gunoiului”.
Consecințe: nu se poate ști când se face colectarea gunoiului pentru un obiect.

Programare orientată pe obiecte Curs 7

5 Tipuri fundamentale de date în C#

Limbajul C# include dou ă categorii de tipuri de date : tipuri valorice si tipuri referin ță.
Conform MSDN , tipurile valoare se clasifica astfel :

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 in tregi. Se recomand ă ca atunci c ând e ste 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 fra cționare, pentru c ă poate reprezenta în mod precis p ână la 28
de pozi ții zecimale. Tipul decimal nu exista in C, C++, Java.

Programare orientată pe obiecte Curs 7

6 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 .

//declararea unei variabile char cu valoare implicita ' \0'
char ch;
ch = 'b';
//afisarea valorii din standardul UNICODE pentru un caracter
//are loc conversia catre un int

Console.WriteLine( "Valoarea lui {0} in standardul UNICODE este
{1}",ch,(int)ch);
Structura – tip valoare propriu
Acest tip e ste asemantor cu cel din C++. Deoarece este un tip valoric, va fi stocat în stiv ă. Atât
timp c â structura este rezonabil ă în ceea ce priveste m ărimea, nu vor fi probleme cu administrarea
memoriei. O structura poate con ține declara ții de constante, c âmpuri, metode, propriet ăți,
indexatori, operatori, constructori.
Exemplu:
struct Persoana
{
public string nume;
public str ing prenume;
public int varsta;
}

Tipul enumerare
Tipul enumerare se define ște de program ator și se aseam ănă cu cel din C++. Acest tip permite
folosirea numelor c ărora li se atribuie o valoare. Este recomandat ă declara rea și defini rea
enumer ărilor direct în interiorul unui spa țiu de nume, pentru a putea fi folosit ă de toate clasele.

Sintaxa pentru a defini o enumerare este :
[atribute] [modificatori] enum NumeEnum : [tip]
In cazul in care nu se specific ă tipul enumer ării, acesta este considera implicit int. ( [] – optional )
namespace tipulEnum
{
enum ZileSaptamana
{
Luni = 1,
Marti,

Programare orientată pe obiecte Curs 7

7 Miercuri,
Joi,
Vineri,
Sambata,
Duminica
}
}

Important : Implicit, valoare a 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++.

Programare orientată pe obiecte Curs 7

8 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 s intaxă 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];
5) Pointerii sunt permiși în C #, dar numai în mod ”unsafe” .
6) În C# metodele și variabilele globale nu sunt acceptate . Metodele și variabilele trebuie să fie
conținute într -o clasă sau într-o structură . Metoda Main () în C# este declarată în mod diferit față de
funcția main () din C++. În C# numele acestei metode începe cu majusculă și este întotdeauna de
tip static . Diferă și argumentele din linia de comandă.
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.
În C # delegații sunt aproximativ la fel cu pointerii de funcții din C++ .
7) C# suportă operatori noi, cum ar fi is și typeof . De asemenea sunt suportate diferite
funcționalități pentru unii operatori logici . Supraîncărcarea operatorilor se realizează în mod diferit
în C #.

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ă fiecar e 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 a stă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

Programare orientată pe obiecte Curs 7

9
9) În C# exist ă două mari tipuri de date: value type și refference type .
Tipurile simple precum int, float, double , bool, precum și struct sunt value type :
valueType x=new valueType ();
valueType y=x;//se face copierea bit cu bit din x in y

Clasele și tipurile ce deriva din object sunt refference type:
myClass c= new myClass();
myClass c1=c;//nu se va face copiere bit cu bit, c1 va fi o
referinta pt c

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;}
}

public class Employee
{
private int age;
public int Age
{
get { return age; }
set { age = value; }//value este cuvant cheie, si
se refera la valoare trimisa
//se poate lasa doar get -ul, doar set -ul
//se pot face get-uri si seturi mai complicate gen
return Math.Pow(age,3);
}
}
13) În C++ clasele și structurile sunt practic identice în timp ce în C # ele sunt destul de diferite . În
C# clasele pot implementa orice număr de interfețe , dar nu po t face moștenire multiplă (pot
moșteni de la o singură clasă de bază ). În C# structurile nu acceptă moștenire , și nu acceptă
constructori expliciți (unul este prevăzut în mod implicit ). De asemenea , în C# nu se poate deriva
decât cu public . În C#, într -o clasa derivată, se poate utiliza cuvântul rezervat base pentru a apela

Programare orientată pe obiecte Curs 7

10 membrii suprascriși ai clasei de baz ă. Suprascrierea metode lor virtuale sau abstracte se face în mod
explicit folosind cuvântul rezervat override .

14) În C# compilarea condiționată se realizează prin directivele pentru procesor . Nu se utilizează
fișiere antet .
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 # constante le sunt definite ca enumer ări sau ca membri static i
ai unei clase sau struct uri.

17) In C# locul template -urilor este luat de tipurile și metodele generice.

Similar Posts