Sunteți pe pagina 1din 10

Programare orientată pe obiecte Curs 7

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

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.

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.

1
Programare orientată pe obiecte Curs 7

Visual studio este oferit în mai multe variante: Express, Professional, 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ş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

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 produs 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 (eliberarea automată a zonelor de
memorie asociate unor date devenite inutile).
Privitor la portabilitate, .NET Framework are la bază standardul Common Language
Infrastructure, ceea ce face ca aplicaţiile .NET să ruleze, în afară de Windows, şi pe unele tipuri
de Unix, Linux, Solaris, Mac OS X şi alte sisteme de operare.
Dintre avantajele utilizării platformei .NET Framework putem enumera:
 oferă instrumente pe care le putem folosi şi în alte programe;
 oferă acces uşor la baze 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 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

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
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();

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

4
Programare orientată pe obiecte Curs 7

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

//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 este 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 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.

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,
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];

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ă 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

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 pot 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
9
Programare orientată pe obiecte Curs 7

membrii suprascriși ai clasei de bază. Suprascrierea metodelor 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 # constantele sunt definite ca enumerări sau ca membri statici
ai unei clase sau structuri.

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

10