Documente Academic
Documente Profesional
Documente Cultură
Biblioteca de clase din cadrul de lucru .NET este o bibliotecă de clase orientate spre
obiecte care asigură toate instrumentele necesare scrierii programelor. Clasele din această
bibliotecă pot fi folosite din orice limbaj .NET deoarece funcţionează la nivelul limbajului IL.
Acest fapt asigură un nivel de interoperabilitate între limbaje. Această bibliotecă este formată
dintr-un set de clase, interfeţe, structuri şi enumerări, conţinute în peste 100 de spaţii de nume.
Numele spaţiilor de nume din .NET sunt formate din unul sau mai multe cuvinte, acestea
fiind separate prin “.” .
class Program
{
static void Main(string[] args)
{
//SN2.A.scrie();//error C2653: 'SN2' : is not a class or namespace name
SN1.A.scrie();
SN1.SN2.A.scrie();
SN1.SN2.SN3.A.scrie();
}
}
1
Programare orientată pe obiecte Curs 8
Spaţiul de nume IO
Spaţiul de nume System.IO pune la dispoziţie clase pentru lucrul cu fluxuri de
intrare/ieşire. Printre acestea se află: File, FileInfo, FileStream, Stream etc.
2
Programare orientată pe obiecte Curs 8
Utilizarea consolei
Pentru utilizarea consolei în cadrul proiectelor de tip CLR vom utiliza clasa Console din
spațiul de nume System. Aceasta reprezintă fluxul standard pentru intrări, ieșiri al aplicațiilor în
modul consolă. Această clasă nu poate fi moștenită.
Clasa Console are mai multe proprietăți și metode, dintre acestea amintind:
Proprietăți:
Nume Descriere
BackgroundColor Dă sau setează culoarea de fundal a consolei.
Observație:
WindowWidth+WindowLeft<= BufferWidth
WindowHeight+WindowTop<= BufferHeight
3
Programare orientată pe obiecte Curs 8
Metode:
Nume Descriere
Beep() Redă semnal sonor la difuzorul consolei.
WriteLine(expresie) Scrie expresie apoi scrie sfârșitul liniei. Expresie poate fi de tipulȘ
Boolean, Char, array<tipChar>, Decimal, Double, Int32, Int64,
Object, Single, String, UInt32, UInt64.
Exemplu:
Console.BackgroundColor=ConsoleColor.Blue;//ConsoleColor (este de tip enum) -
contine culorile disponibile pentru consola
Console.ForegroundColor=ConsoleColor.Red;
Console.Title="Exemplu pentru utilizarea consolei.";
Console.Clear();
Console.WriteLine("Care este numele tau?");
String nume=Console.ReadLine();
Console.WriteLine("Salut {0}, datele consolei sunt:",nume);
Console.WriteLine(" Buffer: {0} x {1}", Console.BufferHeight,Console.BufferWidth);
Console.WriteLine(" Window: {0} x {1}", Console.WindowHeight,
Console.WindowWidth);
4
Programare orientată pe obiecte Curs 8
5
Programare orientată pe obiecte Curs 8
Tratarea excepţiilor
Excepţiile reprezintă un mecanism de tratare a erorilor, care, faţă de tratarea erorilor prin
valori returnate oferă trei avantaje:
o Excepţiile nu pot fi ignorate: dacă o excepţie nu este tratată într-un punct al programului,
acesta îşi termină forţat execuţia;
o Nu este obligatoriu să fie tratate în punctul în care apar: erorile pot fi tratate în orice loc al
stivei de apeluri. Procedura de tratare (handler) a unei excepţii poate fi implementată în
rutina din care a fost lansată excepţia sau în orice rutină aflată deasupra acesteia în stiva de
apeluri. În timpul execuţiei, fiecare rutină este verificată pentru a vedea dacă
implementează o procedură corespunzătoare de tratare. Dacă nu este gasită nicio procedură
de tratare până în partea cea mai de sus a stivei de apeluri, programul se termină forţat.
o Excepţiile pun la dispoziţie o modalitate de semnalare a erorilor acolo unde nu pot fi
folosite valori returnate (ex. constructorii).
Atunci când apare o condiţie de eroare, programatorul poate genera o excepţie folosind
cuvântul cheie throw, excepţia fiind etichetată cu un set de informaţii care arată cu exactitate ce s-a
întâmplat.
Observaţie: La generarea unei erori execuţia normală se opreşte şi codul de tratare a
excepţiilor încorporat în program începe să caute o procedură de tratare. Dacă procedura curentă
nu conţine o procedură de tratare, codul de tratare a erorilor urcă un nivel în stiva de apeluri şi
caută o procedură de tratare potrivită.
#include "stdafx.h"
int rezultat=x/y;
Console.Write("Rezultat={0}",rezultat);
}
6
Programare orientată pe obiecte Curs 8
Împărţirea la zero a generat automat o excepţie. Deoarece aceasta nu a fost tratată în cod,
programul se termină şi ultima operaţie de afişare nu se mai face. Unei excepţii i se poate ataşa
orice tip (int, double, structuri sau obiecte etc.). În spaţiul de nume System sunt definite mai multe
clase de excepţii, derivate din clasa System.Exception. Printre acestea avem:
7
Programare orientată pe obiecte Curs 8
Excepţiile sunt interceptate şi prelucrate folosind construcţia try şi catch, care are sintaxa:
try{
//codul care ar putea genera erori
}
catch(Tip1 p1){
//tratare exceptie
}
...
catch(Tipn pn){
//tratare exceptie
}
Fiecare bloc catch are între paranteze rotunde tipul de excepţie care va fi interceptat şi
prelucrat de blocul de instrucţiuni.
Observaţie: Blocurile try şi catch formează o singură construcţie (nu se poate folosi un bloc
try fără cel puţin un bloc catch şi nu se poate folosi un bloc catch fără un bloc try). Între cele două
blocuri nu pot exista alte secvenţe de instrucţiuni. Se pot înlănţui oricâte blocuri catch, câte unul
pentru fiecare tip de excepţie ce se doreşte a fi tratată.
Clasele de excepţii formează o ierarhie bazată pe clasa System.Exception. Această ierarhie poate fi
folosită pentru simplificarea tratării erorilor.
Exemplu
Fie funcţia:
}
atunci rezultatul execuţiei va fi:
8
Programare orientată pe obiecte Curs 8
Se observă că mesajul Sfarsit test exceptii nu mai apare. Execuţia s-a întrerupt în
momentul apariţiei excepţiei.
Exemplu:
class Test{
String pv;
public Test(String p)
{
if (p == null || p == "")//Nu permitem ca pval sa fie null sau sirul vid.
throw new System.ArgumentException("Argumentul este null sau blank");
else
p = pv;
}
}
Important: Dacă dorim să captăm orice excepție putem folosi tipul Exception, care va capta
orice excepţie.
Exemplu:
try
{
int a=5,b;
Console.Write("Dati o valoare intreaga:");
b=Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Restul impartirii lui {0} la {1} este {2}.",a,b,a%b);
}
catch(ArithmeticException){
Console.WriteLine("Eroare aritmetica");
}
catch(Exception){
Console.WriteLine("Eroare.");
}
9
Programare orientată pe obiecte Curs 8
am fi obținut:
Observație: Clasa Convert din spațiul de nume System pune la dispoziție metode pentru
conversii intre tipuri de date. În programul anterior am folosit metoda ToInt32 din pentru a
converti un String la un int.
Alături de blocul catch mai putem întâlni și blocul finally care se execută întotdeauna şi poate fi
folosit pentru a face " curăţenie " după apariţia unei excepţii.
Exemplu:
Console.WriteLine("Test finally");
try{
Console.WriteLine("Apelam functia factorial cu n=3");
factorial(3);
}
catch(System.ArgumentException p){
Console.WriteLine("Exceptia a fost: {0}", p.Message);
}
finally{
Console.WriteLine("S-a executat blocul finally ");
}
try{
Console.WriteLine("Apelam functia factorial cu n=-5");
factorial(-5);
}
catch(System.ArgumentException p){
Console.WriteLine("Exceptia a fost: {0}", p.Message);
}
finally{
Console.WriteLine("S-a executat blocul finally ");
}
Console.WriteLine("Sfarsit test");
Test finally
Apelam functia factorial cu n=3
S-a executat blocul finally
10
Programare orientată pe obiecte Curs 8
Definirea proprietăţilor
Un principiu al programării orientate spre obiecte este acela că nu este indicat să se permită
accesul direct la datele membre ale claselor, recomandându-se mascarea datelor membre prin
declararea acestora de tipul private şi asigurând accesul la acestea prin folosirea funcţiilor membre.
Proprietăţile pun la dispoziţie o modalitate de implementare a datelor membre virtuale
pentru o clasa, fiind nişte metode speciale, declarate folosind cuvântul cheie property. Ele sunt
implementate folosind get şi set. Proprietăţile pot fi virtuale sau chiar pur virtuale şi nu este
obligatoriu ca ambele metode să aibă acelaşi specificator virtual. Dacă este implementată numai
metoda get se obţine o proprietate numai pentru citire, iar dacă este implementată numai metoda
set se obţine o proprietate numai pentru scriere. În metodele proprietăţi se pot folosi excepţiile
pentru tratarea erorilor. Sunt acceptate două tipuri de proprietăţi:
o Proprietăţi scalare – permit accesul la o singură valoare
o Proprietăţi indexate – permit accesul la proprietate ca şi cum aceasta ar fi o matrice,
folosind notaţia cu paranteze pătrate. Proprietăţile indexate sunt utile pentru clasele care au
ca membri colecţii de elemente. Şi proprietăţile indexate folosesc metodele get şi set pentru
implementare.
Exemplu:
class Complex{
private
float re,im;
public Complex(){
re=0;im=0;
}
public float Re{
get{return re;}
set{re=value;}
}
public float Im{
set{re=value;}
}
}
11
Programare orientată pe obiecte Curs 8
Clasa Math pune la dispoziție constante și metode statice pentru lucrul cu expresii
matematice (trigonometrice, logaritmice etc.). Această clasă face parte din spațiul de nume System
și este o clasă finală (nu poate fi moștenită).
Printre metodele clasei regăsim:
Nume Descriere
Abs(expresie) Întoarce valoarea absolută pentru argumentul primit ce poate fi de tipul:
Decimal, Double, Int16, Int32, Int64, IntSbyte, Single
Atan2(val1,val2) Întoarce unghiul a cărui tangentă este egală cu raportul dintre val1 și val2.
Floor Întoarce cel mai mare întreg mai mic sau egal cu argumentul primit, care poate
fi de tipul Decimal sau Double.
12
Programare orientată pe obiecte Curs 8
Max(val1,val2) Întoarce maximul dintre valorile primite, care pot fi de tipul: Byte, Decimal,
Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64
Min(val1,val2) Întoarce minimul dintre valorile primite, care pot fi de tipul: Byte, Decimal,
Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64
Round(expresie,nr) Face rotunjirea pentru expresie la nr zecimale. Expresie poate avea tipul:
Decimal, Double.
Sign(expresie) Întoarce o valoare care indică semnul pentru expresie, ce poate fi de tipul: Byte,
Decimal, Double, Int16, Int32, Int64, SByte, Single
Truncate(expresie) Calculează partea întreagă pentru expresie. Expresie poate avea tipul: Decimal,
Double.
Nume Descriere
E Constanta e.
PI Constanta π.
Exemplu:
class Punct{
String nume;
int x,y;
public Punct(String nume,int x,int y){
this.nume=nume;
this.x=x;
this.y=y;
13
Programare orientată pe obiecte Curs 8
}
public int X{
get{return x;}
set{x=value;}
}
public int Y{
get{return y;}
set{y=value;}
}
public String Text
get{return nume;}
set{nume=value;}
}
public double distanta(int x, int y) {
return Math.Sqrt(Math.Pow(this.x-x,2)+Math.Pow(this.y-y,2));
}
public double distanta(Punct P) {
return distanta(P.X,P.Y);
}
}
a = P1.distanta(P2);
b = P2.distanta(P3);
c = P1.distanta(P3);
perimetru = a + b + c;
semiperimetru = perimetru / 2;
arie = semiperimetru * (semiperimetru - a) * (semiperimetru - b) *
(semiperimetru - c);
arie = Math.Sqrt(arie);
Observație: Este de preferat crearea unei singure instanțe a clasei Random pentru generarea
mai multor numere în detrimentul generării numerelor cu mai multe instanțe ale clasei.
Nume Descriere
Next() Întoarce un număr aleatoriu nenegativ
Next(Int32) Întoarce un număr aleatoriu nenegativ mai mic decât valoarea specificată.
Exemplu:
int x,y;
Random r=new Random();
Console.WriteLine("Un numar intreg: {0}",r.Next());
x=20;
y=50;
Console.WriteLine("Un numar intreg din intervalul {0}..{1}:
{2}",x,y,r.Next(20,50));
Console.WriteLine("Un numar de tip double din intervalul (0,1):
{0}",r.NextDouble());
Console.WriteLine("Un numar de tip double din intervalul ({0},{1}):
{2}",x,y,x+r.NextDouble()*(y-x));
Exemplu:
Pentru lucrul cu șiruri de caractre vom folosi clasa String din spațiul de nume System. Ca și
constructori putem folosi:
String(Char*) - crează o instanță a clasei String pe baza unui pointer către un tablou ce
conține caractere Unicode
String(Char[]) - crează o instanță a clasei String pe baza unui tablou ce conține caractere
Unicode
Odată create, instanțele clasei String pun la dispoziție proprietatea Length pentru citirea
lungimii șirului de caractere și operatorul [...] pentru citirea codului elementului de pe o poziție
specificată. Pentru concatenarea șirurilor de caractere se poate folosi operatorul "+" sau metoda
Concat. O copie (clonă) a unei instanțe din clasa String se poate obține folosind metoda Clone.
16
Programare orientată pe obiecte Curs 8
Exemplu:
String s1="abcdefghij";
char[] c1={'a','b','c','d','e'};
String s2=new String(c1);
int nr=0;
for(int i=0;i<s1.Length;i++)
nr+=s1[i];
metoda Compare - folosită pentru compararea a două șiruri de caractere (are la bază
ordinea lexicografică)
Exemplu:
String s1="123";
String s2="121";
String.Compare(s1,s2);//1
String.Compare("a","ab");//-1
String.Compare("ab","ab");//0
String.Compare("abc","ab");//1
String.Compare("Ab","ab");//1
String.Compare("Ab","ab",true);//0-true, pentru a nu mai fi case
sensitive
Exemplu:
String s1="123";
String s2="abcd";
s1.EndsWith("23");//true
s2.StartsWith(s1);//false
s2.EndsWith("acd");//false
s2.EndsWith("cd");//true
s2.EndsWith("Cd");//false
s2.EndsWith("Cd",System.StringComparison.OrdinalIgnoreCase);//true
metoda Equals - folosită pentru a testa dacă avem egalitate între două șiruri de caractere
(pentru comparare se poate folosi enumerarea StringComparison)
Exemplu:
String s1="ABC";
String s2="abcd";
s2.Equals(s1);//false
17
Programare orientată pe obiecte Curs 8
String.Equals(s1+"D",s2);//false
String.Equals(s1+"D",s2,System.StringComparison.OrdinalIgnoreCase); //true
metoda IndexOf - folosită pentru a determina într-un șir de caractere indexul primei apariții
a valorii specificate (pentru comparare se poate folosi enumerarea StringComparison)
Exemplu:
String s1="ABCA";
String s2="abcd";
s1.IndexOf('B');//1
s2.IndexOf("cd");//2
s1.IndexOf("E");//-1
s2.IndexOf("Cd");//-1
s2.IndexOf("Cd",System.StringComparison.OrdinalIgnoreCase);//2
Exemplu:
String s1="ABCA";
s1.LastIndexOf('A');//3
metoda Insert - se folosește pentru a insera într-un șir valoarea specificată, în poziția
specificată
Exemplu:
String s1 = "ABCA";
String s2 = "abcd";
s1.Insert(2, s2);//"ABabcdCA"
s1.Insert(10, "123");//eroare, nu există pozitia cu indexul 10
Exemplu:
String s1="ABCD";
s1.Remove(1);//"A"- elimină tot de la poziția dată
s1.Remove(1,2);//"AD"- elimină numărul specificat de caractere,
începând cu poziția dată
metoda Replace - înlocuiește textul căutat (dacă este găsit) cu cel specificat
Exemplu:
String s1="ABCA";
s1.Replace('A','5');//"5BC5"
s1.Replace('a','5');//"ABCA"
s1.Replace("BC","123");//"A123A"
s1.Replace("Bc","123");//"ABCA"
18
Programare orientată pe obiecte Curs 8
Exemplu:
String s1 = "A/B/CD";
String[] s2 = s1.Split('/'); s2[0];//"A"
s2[1];//"B"
s2[2];//"CD"
Exemplu:
String s1="ABCD";
s1.Substring(1);//"BCD"- întoarce tot, începând cu poziția dată
s1.Substring(1,2);//"BC"- întoarce numărul specificat de
caractere, începând cu poziția dată
metodele ToLower respectiv ToUpper pot fi folosite pentru a scrie un șir folosind
caractere "mari" sau " mici".
Exemplu:
String s1="AbCd";
s1.ToLower();//"abcd"
s1.ToUpper();//"ABCD"
pentru eliminarea spațiilor dintr-un șir de caractere se pot utiliza metodele Trim, TrimEnd
sau TrimStart .
Exemplu:
| AB CD E |
|AB CD E |
|AB CD E|
| AB CD E|
Press any key to continue . . .
Observații:
1) Pentru a testa dacă un șir este Null sau gol(empty) se pot folosi metodele IsNullOrEmpty
și IsNullOrWhiteSpace
2) Este permisă utilizarea operatorilor == sau !=
Exemplu:
"abc"=="Abc";//false
"abc"!="Abc";//true
19