Sunteți pe pagina 1din 147

Programarea

orientat obiect C#
Titular curs: Zatca A.

INTRODUCERE IN .NET
.NET este un cadru (Framework) de
dezvoltare software unitar care permite
realizarea, distribuirea i rularea aplicaiilor
desktop Windows i aplicaiilor WEB.
Tehnologia .NET pune laolalt mai multe
tehnologii i limbaje de programare (VB, C+
+, C#, J#) asigurnd reutilizarea codului n
programe, indiferent de limbajul de
programare utilizat.

INTRODUCERE IN .NET
Pentru a dezvolta aplicaii pe platforma
.NET este bine s avem 3 componente
eseniale:
un set de limbaje (C#, Visual Basic .NET,
Managed C++, Smalltalk, Perl, Pascal etc),
un set de medii de dezvoltare (Visual
Studio .NET, Visio),
o bibliotec de clase pentru crearea
serviciilor Web, aplicaiilor Web i
aplicaiilor desktop Windows

Arhitectura .NET
Framework

Componenta .NET Framework este format din compilatoare,


biblioteci i alte executabile utile n rularea aplicaiilor .NET.

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 obinut are extensia "exe", dar nu este
direct executabil, ci respect formatul unic
MSIL.
CLR include o main virtual asemntoare
cu o main Java, ce execut instruciunile IL
rezultate n urma compilrii.

Compilarea programelor

Maina folosete un compilator special JIT (Just In


Time).
Compilatorul JIT analizeaz codul IL corespunztor
apelului unei metode i produce codul main adecvat
i eficient.
El recunoate secvenele de cod pentru care s-a obinut
deja codul main permind reutilizarea acestuia fr
recompilare, ceea ce face ca, pe parcursul
rulrii,aplicaiile .NET s fie din ce n ce mai rapide.
Programul IL produs de diferitele limbaje este foarte
asemntor i are ca rezultat interoperabilitatea ntre
aceste limbaje.
Astfel, clasele i obiectele create ntr-un limbaj
specific .NET pot fi utilizate cu succes n altul.

Introducere n limbajul
C#

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
Principiile de baz ale programrii orientate pe
obiecte (NCAPSULARE, MOTENIRE,POLIMORFISM)
sunt elemente fundamentale ale programrii C#.
n mare, limbajul motenete sintaxa i principiile de
programare din C++.
Sunt o serie de tipuri noi de date sau funciuni diferite
ale datelor din C++, unele funciuni au fost adugate
(de exemplu, interfee i delegri), diversificate (tipul
struct), modificate (tipul string) sau chiar eliminate
(motenirea multipl i pointerii ctre funcii).

Crearea aplicaiilor
consol
Pentru a realiza aplicaii consol n mediul
de dezvoltare Visual Studio, trebuie s
instalm o versiune a acestuia eventual
mediul free Microsoft Visual C# 2008
Express Edition
Dup lansarea aplicaiei, din meniul File se
alege opiunea NewProject apoi alegem
ConsoleApplication, modificnd numele
aplicaiei n caseta Name.

Crearea aplicaiilor
consol

Crearea aplicaiilor
consol
Cnd creai o aplicaie consol, se
genereaz un fiier cu extensia .cs.
Extensia cs provine de la C Sharp.
Redenumirea lui se poate realiza din
fereastra Solution Explorer, pe care
o putei afia cu ajutorul combinaiei
de taste Ctrl+W,S sau din meniul
View.

Crearea aplicaiilor
consol

Codul surs generat este :

Completai funcia Main cu urmtoarea


linie de program:

Crearea aplicaiilor
consol
n scrierea programului suntei asistai de
IntelliSense, ajutorul contextual
Pentru compilarea programului, selectai
Build din meniul principal sau apsai tasta
F6.
n cazul n care avei erori, acestea sunt
afiate n fereastra Error List.
Efectund dublu-clic pe fiecare eroare n
parte, cursorul din program se poziioneaz
pe linia coninnd eroarea.

Crearea aplicaiilor
consol

Rularea programului se poate realiza n mai multe moduri:


rapid fr asisten de depanare (Start Without Debugging
Ctrl+F5)
rapid cu asisten de depanare (Start Debugging F5 sau cu
butonul din bara de instrumente)
rulare pas cu pas (Step Into F11 i Step Over F10)
rulare rapid pn la linia marcat ca punct de ntrerupere
(Toggle Breakpoint F9 pe linia respectiv i apoi Start
Debugging F6).
ncetarea urmririi pas cu pas (Stop Debugging Shift+F5)
permite ieirea din modul depanare i revenirea la modul
normal de lucru.
Toate opiunile i rulare i depanare se gsesc n meniul
Debug al mediului de programare.

Structura unui program


C#

un exemplu, devenit celebru, aprut pentru


prima dat n ediia din 1978 a crii The C
Programming Language a lui Brian W.
Kernighan i Dennis M. Ritchie

Structura unui program


C#

O aplicaie C# este format din una sau mai multe clase,


grupate n spaii de nume (namespaces).
Este obligatoriu ca doar una din aceste clase s conin un
punct de intrare (entry point), i anume metoda (funcia)
Main.
Spaiul de nume (Namespaces): din raiuni practice,
programele mari, sunt divizate n module, dezvoltate separat,
de mai multe persoane. Din acest motiv, exist posibilitatea de
a aprea identificatori cu acelai nume. Pentru a evita erori
furnizate din acest motiv, n limbajul C# se introduce noiunea
i cuvntul cheie namespace.
Fiecare mulime de definiii dintr-o librrie sau program este
grupat ntr-un spaiu de nume, existnd astfel posibilitatea de
a avea ntr-un program definiii cu nume identic, dar situate n
alte spaii de nume.

Structura unui program


C#

S comentm programul de mai sus:


linia 1: este o directiv care specific faptul c se
vor folosi clase incluse n spaiul de nume
System. n cazul nostru, se va folosi clasa
Console.
linia 3: spaiul nostru de nume
linia 5: orice program C# este alctuit din una
sau mai multe clase
linia 7: metoda Main, punctul de intrare n
program
linia 9: clasa Console, amintit mai sus, este
folosit pentru operaiile de intrare/ieire.
Aici se apeleaz metoda WriteLine din aceast
clas, pentru afiarea mesajului dorit pe ecran.

Structura unui program


C#

n C#, simplificat vorbind, un program poate


fi privit ca avnd mai multe straturi: avem
cod n interiorul metodelor, care, la rndul
lor, se afl n interiorul claselor, aflate n
interiorulnamespaces-urilor.

Structura unui program


C#
Convenie: S-a adoptat urmtoarea
convenie de scriere: n cazul n care
folosim nume compuse din mai multe
cuvinte, fiecare cuvnt este scris cu
majuscul: HelloWorld,WriteLine.
Aceast convenie poart numele de
Convenie Pascal.

Sintaxa limbajului
Comentarii
comentariu pe un rnd prin
folosirea //. Tot ce urmeaz dup
caracterele // sunt considerate, din acel
loc pn la sfritul rndului, drept
comentarii
comentariu pe mai multe rnduri prin
folosirea /* i */.

Sintaxa limbajului
Nume
numele trebuie s nceap cu o liter sau
cu unul dintre caracterele _ i @;
primul caracter poate fi urmat numai de
litere, cifre sau un caracter de subliniere;
numele care reprezint cuvinte cheie nu
pot fi folosite n alt scop dect acela
pentru care au fost definite;
cuvintele cheie pot fi folosite n alt scop
numai dac sunt precedate de @;

Sintaxa limbajului
Convenii pentru nume:
n cazul numelor claselor, metodelor, a
proprietilor, enumerrilor, interfeelor,
spaiilor de nume, fiecare cuvnt care
compune numele ncepe cu majuscul;
n cazul numelor variabilelor, dac numele
este compus din mai multe cuvinte, primul
ncepe cu minuscul, celelalte cu
majuscul.

Sintaxa limbajului

Constante
n C# exist dou modaliti de declarare a
constantelor: folosind const sau folosind
modificatorul readonly.
Constantele declarate cu const trebuie s fie
iniializate la declararea lor.
Exemplul 1:
Constantele declarate cu ajutorul lui readonly
sunt doar variabilele membre ale claselor,ele
putnd fi iniializate doar de ctre constructorii
claselor respective.

Sintaxa limbajului
Variabile
O variabil n C# poate s conin fie o
valoare a unui tip elementar, fie o referin
la un obiect.
C# este case sensitive, deci face
distincie ntre litere mari i mici.

Sintaxa limbajului

Expresii i operatori
Definiie: Prin expresie se nelege o secven
format din operatori i operanzi. Un operator
este un simbol ce indic aciunea care se
efectueaz, iar operandul este valoarea asupra
creia se execut operaia.
Operatorii se mpart n trei categorii:
Unari: - acioneaz asupra unui singur operand
Binari: - acioneaz ntre doi operanzi
Ternari: - acioneaz asupra a trei operanzi;
exist un singur operator ternar i acesta este ?:

Tabelul de prioriti

n tabel prioritatea descrete de la 0 la 13.

Sintaxa limbajului
Exemplul 4: folosind operatorul ternar ?:, s
se decid dac un numr citit de la
tastatur este pozitiv sau negativ.
Indicaii:
Sintaxa acestui operator este: (condiie) ?
(expr_1): (expr_2) cu semnificaia se
evalueaz condiie, dac ea este adevrat
se execut expr_1, altfel expr_2
int.Parse convertete un ir la int

Exemplul 4

Exemplul 4: rspunsul

n urma rulrii programului obinem:

Sintaxa limbajului

Opiuni de afiare
Pentru a avea control asupra modului de afiare a
informaiei numerice, se poate folosi urmtoarea
form a lui WriteLine():
unde sir este format din dou elemente:
caracterele afiabile obinuite coninute n mesaje
specificatorii de format ce au forma general
{nr_var,width:fmt} unde nr_var precizeaz
numrul variabilei (parametrului) care trebuie
afiat ncepnd cu 0, width stabilete limea
cmpului de afiare, iar fmt stabilete formatul

Exemplu:

Exemplu
Exemplul 8: n acest exemplu, formatul de afiare ales #.### va
produce afiarea cu trei zecimale a constantei PI

Metodele Write i WriteLine

Metodele Write i WriteLine primesc aceiai


parametri i au acelai comportament
Singura diferen este c WriteLine trece la un
rnd nou dup afiarea mesajului. Aceste metode
au dou forme:
a)pentru tipurile de baz
Aceast form permite afiarea direct a tipurilor
simple (int, char, double, ) i are sintaxa
Console.Write(valoare).
Exemple:
Console.Write("text");
Console.WriteLine(34);
char c = 'x';
Console.WriteLine(c);

Metodele Write i WriteLine

b) cu formatare
Permite afiarea cu formatare .
Sintaxa utilizat este:
Console.Write(sir_formatare, parametri).

irul de formatare este compus din textul de afiat n care sunt introduse
elemente de forma {i} n locul unde trebuie inserate valorile parametrilor
(i ncepe de la 0 i reprezint poziia parametrului n list).
Exemple:
// declarare si initializare variabile
string nume = "Ionel";
int varsta = 7;
// afisare cu formatare
Console.WriteLine("{0} are {1} ani.", nume, varsta);
// Va afisa:
// Ionel are 7 ani.

Citirea datelor

Citirea datelor se face sub form de iruri de caractere


folosind sintaxa
var = Console.ReadLine();,
unde var este o variabil de tip string.
Citirea altor tipuri de date simple se face utiliznd metodele
statice Parse din tipul respectiv.
Exemple:
// declarare variabile
string nume;
int varsta;
Console.Write("Nume:");
// citire strings
nume = Console.ReadLine();
Console.Write("Varsta:");
// citire string si conversie la int
varsta = int.Parse(Console.ReadLine());

Sintaxa limbajului

Conversii
n C# exist dou tipuri de conversii numerice:
implicite
explicite.
Conversia implicit se efectueaz (automat) doar
dac nu este afectat valoarea convertit.

Exemplul 9: Exemplul urmtor realizeaz suma a


dou valori numerice fr semn cu reprezentare
pe 8 bii. Rezultatul va fi reinut pe 64 bii

Exemplul 9

Sintaxa limbajului

Tipuri de date
n C# exist dou categorii de tipuri de date:
tipuri valoare
- tipul simplu predefinit: byte, char, int, float
etc.
- tipul enumerare enum
- tipul structur - struct
tipuri referin
- tipul clas class
- tipul interfa interface
- tipul delegat delegate
- tipul tablou - array

Sintaxa limbajului
Observaie: Toate tipurile de date sunt
derivate din tipul System.Object
Toate tipurile valoare sunt derivate din
clasa System.ValueType, derivat la
rndul ei din clasa Object (alias pentru
System.Object).
Pentru tipurile valoare, declararea unei
variabile implic i alocarea de spaiu.

Sintaxa limbajului
Tipul valoare
Tipuri predefinite
Limbajul C# conine un set de tipuri
predefinite (int, bool etc.) i
permite definirea unor tipuri proprii
(enum, struct, class etc.)

Sintaxa limbajului

Tipul enumerare
Tipul enumerare, asemntor cu cel din C++, se
definete de ctre utilizator. Acest tip permite
utilizarea numelor care, sunt asociate unor valori
numerice.
Enumerrile nu pot fi declarate abstracte i nu pot fi
derivate.
Orice enum este derivat automat din clasa
System.Enum, derivat din System.ValueType.
n cazul n care nu se specific tipul enumerrii,
acesta este considerat implicit int.
Specificarea tipului se face dup numele enumerrii:

Sintaxa limbajului
Folosirea tipului enumerare impune
urmtoarele observaii:
n mod implicit, valoarea primului membru
al enumerrii este 0, iar fiecare variabil
care urmeaz are valoarea (implicit) mai
mare cu o unitate dect precedenta.
valorile folosite pentru iniializri trebuie
s fac parte din domeniul de valori al
tipului enum
nu se admit referine circulare

Tipuri simple

Cele mai utilizate tipuri sunt:

Tipuri simple
Toate tipurile conin metoda ToString
(motenit din object i suprascris n
clasele derivate) care permite
transformarea valorii respective n string.
n cazul tipurilor numerice, transformarea
n string se poate face si cu formatare.
Tipurile numerice i tipul bool conin o
metod static numit Parse care permite
transformarea unui ir de caractere n
valoarea corespunztoare.

Exemple de utilizare:
// declarare si initializare variabile
int i = 7, j;
long l = 23L; // constanta de tip long
decimal valoareCont = 3213265465.454654654M;
bool unBoolean;
// conversii din string
unBoolean = bool.Parse("true");
j = int.Parse("236");
// conversii in string (cu 4 zecimale)
string strValoare = valoareCont.ToString("####.####");
// afisare variabile
Console.WriteLine("Contul are valoarea: " + strValoare);

TIPURI REFERIN

Variabilele de tip referin conin referine


(pointeri) spre datele propriu-zise, care se afla n
heap, pe cnd variabilele de tip valoare conin
valorile efective
Tipuri referin sunt clasele (class), interfeele
(interface), tablourile si delegrile (delegate).
Tipurile valorice sunt alocate pe stiv la
momentul declarrii, deci nu exist variabile cu
valoarea null.
Atribuirea i trimiterea ca parametru n funcii se
face prin copierea coninutului (valorii) variabilei;
copierea se face bit cu bit.

EXEMPLU

TIPURI REFERIN
Tipurile refereniale sunt alocate explicit
folosind operatorul new i sunt stocate n
heap.
Manipularea se face utiliznd referine.
Referinele sunt similare cu referinele din
C++, cu dou diferene:

nu trebuie iniializate la declarare i pot conine


valoarea null
obiectul pointat poate fi modificat la rulare

Exemplu

TIPURI REFERIN
Conversia dintre tipurile valorice i tipurile
refereniale se poate realiza prin
mecanismele de mpachetare i
despachetare (boxing i unboxing).
mpachetarea presupune copierea valorii
de pe stiv n heap i alocarea unei
referine la aceasta pe stiv.
Despachetarea presupune alocarea
spaiului pentru valoare pe stiv i
copierea coninutului de pe heap.

Exemplu:

Instruciuni condiionale,
de iteraie i de control
sunt instruciunile construite folosind
cuvintele cheie: if, else, do, while,
switch, case, default, for, foreach, in,
break, continue, goto
Instruciunea if
Instruciunea if are sintaxa:

Exemplu

Citindu-se dou numere ntregi, s se decid care dintre ele este mai mare

Instruciuni condiionale,
de iteraie i de control
Instruciunea switch
n cazul instruciunii switch n C/C++,
dac la finalul instruciunilor dintr-o
ramur case nu exist break, se trece la
urmtorul case. n C# se semnaleaz
eroare.
Instruciunea switch admite n C#
variabil de tip ir de caractere care s fie
comparat cu irurile de caractere din
case-uri

Exemplu:

Programul urmtor efectueaz calculele


corespunztoare pentru dou numere ntregi i unul dintre
semnele +,-,*,/ , % introduse de la tastatur .

In rezultat vom avea:

Instruciuni condiionale,
de iteraie i de control
Instruciunea while
Instruciunea while are sintaxa:
while (conditie) Instructiuni;

Ct timp conditie este ndeplinit se


execut Instructiuni.

Exemplu:S se afieze
numerele ntregi pozitive <=
10

Instruciuni condiionale,
de iteraie i de control
Instruciunea do while
Instruciunea do while are sintaxa:
do
Instructiuni;
while(conditie)

Se execut Instructiuni dup care se


verific conditie. Dac aceasta este
adevrat, ciclul se reia, altfel ciclul se
termin.

Exemplu

Exemplu: Asemntor cu exerciiul anterior, s se afieze numerele ntregi pozitive


<= 10
using System;
namespace Exemplul_32
{
class Program
{
static void Main(string[] args)
{
int n = 0;
do
{
Console.Write("{0,3}", n);
n++;
}
while (n <= 10) ;
Console.ReadLine();
}
}
}

Instruciuni condiionale,
de iteraie i de control
Instruciunea for
Instruciunea for are sintaxa:

for(initializareCiclu; conditieFinal;reinitializareCiclu)
Instructiune

Instruciuni condiionale,
de iteraie i de control

Exemplu: Ne propunem, s afim numerele pozitive <=10


using System;
namespace Exemplul_34
{class Program
{static void Main(string[] args)
{
for (int n = 0; n <= 10; n++)
{
Console.Write("{0,3}", n);
}
Console.ReadLine();
}
}
}

Instruciuni condiionale,
de iteraie i de control
Instruciunea foreach
O instruciune nou,in limbajul C#
Aceast instruciune enumer elementele
dintr-o colecie, executnd o instruciune
pentru fiecare element.
Elementul care se extrage este de tip
read-only, neputnd fi transmis ca
parametru i nici aplicat un operator care
s-i schimbe valoarea.

Instruciuni condiionale,
de iteraie i de control

un exemplu de folosire a lui foreach:


string s="Curs"+" de"+" informatica";
foreach(char c in s)
Console.Write(c);
S se mpart un ir de caractere n cuvinte. Se va afia numrul de cuvinte i fiecare cuvnt n parte
using System;
namespace Exemplul_37
{
class Program
{
static void Main(string[] args)
{
string sir = "Acesta este un sir";
char[] delimitator = { ' ', ',', '.', ':' };
Console.WriteLine("Sirul care va fi impartit in cuvinte \n{0}", sir);
string[] cuvant = sir.Split(delimitator);
Console.WriteLine("Sunt {0} cuvinte in text:", cuvant.Length);
foreach (string s in cuvant)
{
Console.WriteLine(s);
}
}
}
}

Instruciuni condiionale,
de iteraie i de control

Instruciuni condiionale,
de iteraie i de control

Instruciunile try-catch-finally i throw


Prin excepie se nelege un obiect care ncapsuleaz informaii
despre situaii anormale. Ea se folosete pentru a semnala
contextul n care apare o situaie special.
Exemple: erori la deschiderea unor fiiere a cror nume este
greit, mprire la 0 etc.
Aceste erori se pot manipula astfel nct programul s nu se
prbueasc.
Cnd o metod ntlnete o situaie dintre cele menionate mai
sus, se va arunca o excepie care trebuie sesizat i tratat.
Limbajul C# poate arunca ca excepii obiecte de tip
System.Exception .
Aruncarea excepiilor se face cu instruciunea throw
Prinderea i tratarea excepiilor se face folosind un bloc catch.
Pot exista mai multe blocuri catch, fiecare dintre ele prinde i
trateaz o excepie.
Pentru a garanta c un anumit cod se va executa indiferent dac
totul decurge normal sau apare o excepie, acest cod se va pune
n blocul finally care se va executa n orice situaie.

Tablouri
Masivele sunt structuri de date omogene i
continue.
n C#, masivele sunt tipuri refereniale
derivate din clasa abstract System.Array
Dimensiunea masivelor este stabilit la
crearea acestora i nu poate fi modificat
pe parcurs.
Limbajul suport att masive
unidimensionale, ct i masive
multidimensionale.

Tablouri

Fiind clase, masivele au o serie de


proprieti i metode, dintre care cele mai
importante sunt:

Length: numrul total de elemente din masiv;


Rank: numrul de dimensiuni ale masivului;
Clone(): creeaz o copie a masivului; Atenie:
n cazul tipurilor refereniale sunt copiate
numai referinele, nu i obiectele referite;
Copy(), CopyTo(): copiaz seciuni din masiv
n alt masiv;

Tablouri

Tablouri unidimensionale

La declararea unui tablou, se creeaz o instan a clasei .NET,


System.Array.
Compilatorul va traduce operaiile asupra tablourilor, apelnd metode ale
System.Array.
Declararea unui tablou unidimensional se face astfel:

Tip[] nume;

Iniializarea se poate face la momentul declarrii sub forma


tip[] nume = {lista valori};
sau ulterior sub forma
nume = new tip[] {lista valori};.
n cazul n care se dorete doar alocarea memoriei se poate folosi
nume = new tip[dimensiune];
n acest caz se va aloca memorie, iar elementele vor fi iniializate cu
valorile implicite (null pentru tipuri refereniale, 0 pentru tipurile numerice,
).
Se pot face n acelai timp operaiile de declarare, instaniere i iniializare

Exemple:

// un vector de intregi
int[] vector1;
// initializare vector
vector1 = new int[] {5, 23, 66};
// declarare si initializare
double[] vector2 = {34.23, 23.2};
// accesarea elementelor
double d = vector2[0];
vector2[1] = 5.55;
// alocare memorie fara initializarea elementelor
string[] vector3 = new string[3];
// afisarea elementelor
for (int i = 0; i < vector1.Length; i++)
Console.WriteLine("vector1[{0}]={1}", i, vector1[i]);
// copierea elementelor
int[] vector4 = new int[vector1.Length];
vector1.CopyTo(vector4, 0); // 0 = pozitia de start

Exemplu:

int[] v = new int[] {1,2,3);


Sau
int[] v = {1,2,3);
Exemplul : Crearea, sortarea i afiarea unui
vector:
int[] v = new int[5] { 10, 2, 4, 8, 6 };
Array.Sort(v); //sortarea crescatoare a
vectorului v
for (int i = 0; i < v.Length; i++) //afisarea
vectorului v
Console.Write("{0,3}", v[i]);
Afiarea se poate face i cu ajutorul lui foreach:
foreach (int i in v)
Console.Write("{0,3}",i);

Tablouri
multidimensionale

Tablouri multidimensionale
n cazul tablourilor cu mai multe dimensiuni facem
distincie ntre tablouri regulate i tablouri neregulate
(tablouri de tablouri)
Declararea n cazul tablourilor regulate
bidimensionale se face astfel:
Tip[,] nume;

iar instanierea:
nume = new Tip[Linii,Coloane];

Accesul:
nume[indice1, indice2]

Exemple:

// declarare si alocare masiv tridimensional


int[,,] cub = new int[5,2,7];
// accesare elemente
cub[0,0,0] = 3;
int k = cub[3,1,5];
// declarare si initializare matrice
int[,] matr =
{
{ 4, 23, 5, 2 },
{ 1, 6, 13, 29 }
};
// afisare masiv bidimensional
for (int i = 0; i < matr.GetLength(0); i++)
{
for (int j = 0; j < matr.GetLength(1); j++)
Console.Write(" {0}", matr[i,j]);
Console.WriteLine();
}

Exemplu:

Declararea instanierea i iniializarea


int[,] mat = new int[,] {{1,2,3},{4,5,6},{7,8,9}};

Sau
int[,] mat = {{1,2,3},{4,5,6},{7,8,9}};

Exemplu:

n cazul tablourilor neregulate (jagged array) declararea se face:


Tip [][] nume; //tablou neregulat cu doua
//dimensiuni
iar instanierea i iniializarea:
Tip [][] nume = new Tip[][]
{
new Tip[] {sir_0},
new Tip[] {sir_1},
...
new Tip[] {sir_n}
};
Sau
Tip [][] nume = {
new Tip[] {sir_0},
new Tip[] {sir_1},
...
new Tip[] {sir_n}
};
Acces
nume[indice1][indice2]

iruri de caractere

Pentru reprezentarea irurilor de caractere, n


limbajul C#, tipul de date utilizat este clasa
System.String (sau aliasul string).
Se definesc dou tipuri de iruri:
regulate
de tip Verbatim
Tipul regulat conine ntre ghilimele zero sau mai
multe caractere, inclusiv secvene escape.
string a = "Acesta este un sir de caractere";
string b = "";
string nume = "Gigel";

iruri de caractere
Limbajul C# introduce, pe lng irurile
regulate i cele de tip verbatim. n cazul
n care folosim multe secvene escape,
putem utiliza irurile verbatim.
Aceste iruri se folosesc n special n cazul
n care dorim s facem referiri la fiiere, la
prelucrarea lor, la regitri.
Un astfel de ir ncepe cu simbolul @
naintea ghilimelelor de nceput.

Exemplu:

Reprezentarea unor
caractere speciale

iruri de caractere
Concatenarea irurilor de
caractere
Pentru a concatena iruri de
caractere folosim operatorul +
Compararea irurilor de
caractere
Pentru a compara dou iruri de
caractere vom utiliza operatorii
== i !=.

Funcii importante
pentru iruri

Clasa String pune la dispoziia utilizatorului mai multe metode i proprieti care permit prelucrarea
irurilor de caractere.
metode de comparare:
- Compare
- CompareOrdinal
- CompareTo
metode pentru cutare:
- EndsWith
- StartsWith
- IndexOf
- LastIndexOf
metode care permit modificarea irului curent prin obinerea unui nou ir:
- Concat
- CopyTo
- Insert
- Join
- PadLeft
- PadRight
- Remove
- Replace
- Split
- Substring
- ToLower
- ToUpper
- Trim
- TrimEnd
- TrimStart
Proprietatea Length returneaz un ntreg care reprezint lungimea (numrul de caractere) irului.

Stocarea informaiilor n
fiiere

Administrarea fiierelor
Pentru accesarea unui fiier de pe disc se folosesc
funcii din spaiul de nume System.IO.
n acest spaiu exist mai multe clase: File,
StreamWriter, BinaryReader i BinaryWriter.
Aceste clase sunt folosite pentru operaiile de
intrare-ieire cu fiiere.
Obiectul File este o reprezentare a unui fiier de
pe disc, iar pentru a-l utiliza trebuie s l
conectm la un flux (stream).
Limbajul C# ofer dou tipuri de fiiere: fiiere
text i fiiere binare.

Stocarea informaiilor n
fiiere
Fiierele de ieire necesit
utilizarea unui obiect
StreamWriter.
Funcia CreateText(), ce face
parte din clasa File, deschide un
fiier i creeaz obiectul
StreamWriter.

Exemplu

Exemplu(continuare)

Tipuri de date obiectuale.


ncapsulare

Un tip de date abstract (ADT) este o entitate


caracterizat printr-o structur de date i un
ansamblu de operaii aplicabile cestor date.
Numim instan a unui tip de date abstract o
concretizare a tipului respectiv, format din
valori efective ale datelor
Vom numi metode operaiile implementate n
cadrul tipului de date abstract
Numim membri ai unui tip de date obiectual
datele i metodele definite mai sus

Tipuri de date obiectuale.


ncapsulare

Principalul tip obiectual ntlnit n majoritatea


mediilor de dezvoltare (Visual Basic, Delphi, C++,
Java, C#) poart numele de clas (class).
O instan a unui tip obiectual poart numele de
obiect
Tipurile de date obiectuale respect principiul
ncapsulrii.
Modificatorul static plasat la definirea unui
membru al clasei face ca acela s fie un membru
de clas, nu unul de tip instan.
Membrii statici sunt unici, fiind accesai n comun
de toate instanele clasei. Mai mult, membrii
statici pot fi referii chiar i fr a crea vreo
instan a clasei respective.

Suprancrcare

Prin suprancrcare se nelege posibilitatea de


a defini n acelai domeniu de vizibilitate mai
multe funcii cu acelai nume, dar cu parametri
diferii ca tip i/sau ca numr.
Suprancrcarea permite obinerea unor efecte
diferite ale apelului n contexte diferite
Ansamblul format din numele funciei i lista sa
de parametri reprezint o modalitate unic de
identificare numit semntur sau amprent.
Apelul unei funcii care beneficiaz, prin
suprancrcare, de dou sau mai multe semnturi
se realizeaz prin selecia funciei a crei
semntur se potrivete cel mai bine cu lista de
parametri efectivi (de la apel)

Motenire

Pentru tipurile de date obiectuale class


este posibil o operaie de extindere sau
specializare a comportamentului unei clase
existente prin definirea unei clase noi ce
motenete datele i metodele clasei de
baz, cu aceast ocazie putnd fi redefinii
unii membri existeni sau adugai unii
membri noi. Operaia mai poart numele
de derivare

Motenire

Ca i n Java, n C# o subclas poate moteni de


la o singur superclas, adic avem de-a face cu
motenire simpl; aceeai superclas ns poate
fi derivat n mai multe subclase distincte.
O subclas, la rndul ei, poate fi superclas
pentru o alt clas derivat.
O clas de baz mpreun cu toate clasele
descendente (direct sau indirect) formeaz o
ierarhie de clase.
n C#, toate clasele motenesc de la clasa de
baz Object.

Motenire

n contextul mecanismelor de motenire trebuie


amintii modificatorii abstract i sealed aplicai
unei clase, modificatori ce oblig la i respectiv se
opun procesului de derivare.
Astfel, o clas abstract trebuie obligatoriu
derivat, deoarece direct din ea nu se pot obine
obiecte prin operaia de instaniere, n timp ce o
clas sigilat (sealed) nu mai poate fi derivat
O metod abstract este o metod pentru care
nu este definit o implementare, aceasta urmnd
a fi realizat n clasele derivate din clasa curent
care trebuie s fie i ea abstract (virtual pur,
conform terminologiei din C++).
O metod sigilat este o metod care nu mai
poate fi redefinit n clasele derivate din clasa
curent.

Polimorfism. Metode
virtuale
Un obiect polimorfic este cel capabil s ia
diferite forme, s se afle n diferite stri,
s aib comportamente diferite.
Polimorfismul obiectual, care trebuie s
fie abstract, se manifest n lucrul cu
obiecte din clase aparinnd unei ierarhii
de clase, unde, prin redefinirea unor date
sau metode, se obin membri diferii
avnd ns acelai nume.

Structura unei aplicaii


orientat pe obiecte n C#
Toate componentele limbajului sunt
ntr-un fel sau altul, asociate noiunii de
clas.
Programul nsui este o clas avnd
metoda static Main() ca punct de
intrare, clas ce nu se instaniaz.
Chiar i tipurile predefinite byte, int
sau bool sunt clase sigilate derivate din
clasa ValueType din spaiul System

Clase

O clas este o structur care conine date


constante si variabile, funcii (metode,
proprieti, evenimente, operatori suprancrcai,
operatori de indexare, constructori, destructor i
constructor static) i tipuri imbricate.
Clasele sunt tipuri refereniale
Clasele se declar asemntor cu cele din C++,
cu unele mici deosebiri de sintax (declaraiile de
clase nu se termin cu ;, modificatorii de acces
(public, private, ) se aplic pe fiecare element n
parte).
Cuvntul cheie this este prezent n continuare,
dar este folosit ca o referin (nu mai are sintaxa
de pointer).

Modificatorii de acces in
C#

Modificatorii de acces in C# sunt:

public: accesibil din interiorul i din exteriorul clasei


protected: accesibil numai din interiorul clasei i a
claselor derivate
internal: accesibil din interiorul din exteriorul clasei dar
numai n cadrul assembly-ului (proiectului in VS)
protected internal: accesibil numai din interiorul clasei
i a claselor derivate n cadrul assembly-ului (proiectului
in VS)
private: accesibil numai din interiorul clasei

n cazul in care nu se specific nici un modificator


de acces, atunci membrul este considerat private.
Modificatorii de acces pot fi aplicai att
membrilor clasei ct i claselor n ansamblu.

Clase

Clase

O aplicaie C# este format din una sau mai multe clase,


grupate n spaii de nume -namespaces.
n mod obligatoriu, doar una dintre aceste clase conine un
punct de intrare entry point, i anume metoda Main.
Sintaxa:
[atribut][modificatorAcces] class
[identificator][:clasaBaza]
{
corpul_clasei
}
unde:
atribut este opional, reprezentnd informaii declarative
cu privire la entitatea definit
modificatorAcces - este opional, iar n cazul n care
lipsete se consider public

Clase
identificator - este numele clasei
clasaBaza - este opional, fiind
numele clasei de baz, din care
deriv clasa actual.

Exemplu

Se consider clasa IncludeClase care include ase clase avnd modificatori de acces
diferii. Se pune problema vizibilitii lor din exterior

Clase

Corpul clasei - este alctuit din:


date
funcii
Att datele ct i funciile pot avea ca modificatori de
acces:

Date

Datele situate ntr-o clas sunt desemnate sub numele de


variabile sau atribute.
Datele pot fi de orice tip, inclusiv alte clase
Declararea datelor se face:
[modificatorAcces] tipData nume;

unde:
modificatorAcces - este opional. Implicit este private.
tipData - reprezint tipul datei obiectului pe care vrem
s-l atribuim.
nume - se refer la numele dat de utilizator obiectului
respectiv.
Datele pot fi:
constante,
cmpuri

Date

Valoarea unei constante se declar prin cuvntul const.


Sintaxa este:
[modificator] const tip identificator = expresieConstanta
unde tip poate fi: bool, decimal, sbyte, byte, short,
ushort, int, uint, long, ulong, char, float, double,
enum, string
Constanta mai poate avea ca modificator de acces: new,
public, protected, internal, protected internal,
private.
Exemplu
class Constante
{ public const int MAX = 100;
const string SALUT = "Buna ziua!";
public const double MIN = MAX / 3.2;
}

Date

Cmpul - reprezint o dat variabil a unei clase.


n afar de modificatorii menionai mai sus, se
mai adaug: new, readonly, volatile, static.
Opional, cmpurile pot fi iniializate cu valori
compatibile.
Un astfel de cmp se poate folosi fie prin
specificarea numelui su, fie printr-o calificare
bazat pe numele clasei sau al unui obiect.
Sintaxa este:
tip identificator [=valoare]

Exemplu
class Camp
{
public int varsta;
protected string nume;
private int id = 13;
int a; //implicit private
static void Main(string[] args)
{
Camp obiect = new Camp();
obiect.a = 1;
}
}

Date .Cmpuri de
instan

n cazul n care ntr-o declaraie de cmp


nu este inclus modificatorul static, atunci
respectivul cmp se va regsi n orice
obiect de tipul clasei curente care va fi
instaniat.
Deoarece un astfel de cmp are o valoare
specific fiecrui obiect, accesarea lui se
va face folosind numele obiectului:
obiect.a = 1;

Date. Cmpuri statice

Dac ntr-o declaraie de cmp apare


specificatorul static, cmpul respectiv va aparine
clasei.
Accesarea unui astfel de cmp din exteriorul
clasei se poate face doar prin intermediul numelui
de clas:
class Camp
{
public static int a = 13;
static void Main(string[] args)
{
Camp.a++;
}
}

Date. Cmpuri volatile

Cmpurile volatile se declar cu ajutorul


cuvntului volatile, care poate fi ataat
doar urmtoarelor tipuri:
byte, sbyte, short, ushort, int, uint,
char, float, bool
un tip enumerare care are tipul: byte,
sbyte, short, ushort, int, uint
un tip referin

Exemplu de clas:

// declaratie clasa
class Persoana
{
// declaratii atribute
public string Nume;
public int Varsta;
// constructor
public Persoana(string nume, int varsta)
{
Nume = nume; // echivalent cu this.Nume = nume;
Varsta = varsta;
}
// metoda
public void Afiseaza()
{
Console.WriteLine("{0} ({1} ani)", Nume, Varsta);
}
}
public class AplicatieTest
{
public static void Main()
{
// creare obiect
Persoana pers = new Persoana("Popescu Maria", 23);
// accesare atribute
string nume = pers.Nume;
// accesare metoda
pers.Afiseaza();
}
}

Funcii

Funciile pot fi:


Constructori
Destructori
Metode
Proprieti
Evenimente
Indexatori
Operatori

Constructori i
destructori

Constructorul este o funcie care face parte din corpul unei


clase.
Corpul constructorului este format din instruciuni care se
execut la crearea unui nou obiect al clasei respective
pot exista mai muli constructori care se pot diferenia prin
lista lor de parametri
constructorii nu pot fi motenii
dac o clas nu are definit niciun constructor, se va asigna
automat constructorul fr parametri al clasei de baz
(clasa object, dac nu este precizat clasa de baz)
Instanierea presupune declararea unei variabile de tipul
clasei respective i iniializarea acesteia prin apelul
constructorului clasei (unul dintre ei, dac sunt definii mai
muli) precedat de operatorul new

Constructori

Constructorii sunt funcii care folosesc la iniializarea unei


instane a clasei.
Constructorii au acelai nume cu al clasei.
Constructorul poate avea un modificator de acces i nu
returneaz nimic.
Sintaxa este:
modificatorAcces numeConstructor([parametri])[:initializator]
[{
corp_constructor
}]

unde:
initializator permite invocarea unui constructor anume,
nainte de executarea instruciunilor care formeaz corpul
constructorului curent.
Iniializatorul poate lua dou forme:
base([parametri]) sau this([parametri]).
Dac nu se precizeaz niciun iniializator,implicit se va
asocia base( ).

Constructori

Exemplu
class Elev
{
public Elev() //constructor
{
}
}
O clas poate conine mai muli constructori, difereniai dup numrul i tipul de
parametri
Exemplu
class Elev
{
public string nume;
public Elev() //constructor
{
nume = "";
}
public Elev(string Nume) //constructor
{
nume = Nume;
}
}

Constructori

Apelul unui constructor se face automat la instanierea clasei prin operatorul new.
Exemplu
class Exemplu
{
Elev elev = new Elev();
}
Constructor cu doi parametri
using System;
namespace Complex
{
class Complex
{
private int re;
private int im;
//constructor cu doi parametri
public Complex(int i, int j)
{
re = i;
im = j;
}
public void Afis()
{
Console.WriteLine(re + "+" + im + "i");
}
}
...

Destructor
Corpul destructorului este format din
instruciuni care se execut la distrugerea
unui obiect al clasei respective.
Numele destructorului coincide cu numele
clasei, fiind precedat de caracterul ~.
Destructorul nu are parametri i nici
modificator de acces.
Destructorul este apelat automat.
ntr-o clas exist un singur destructor.
Destructorul nu poate fi motenit.

Exemplu

Metode

Metoda este un membru al unei clase care implementeaz o


aciune.
Metoda poate admite parametri i returna valori.
Tipul returnat de ctre o metod poate fi unul predefinit (int, bool
etc.) sau de tip obiect (class).
n cazul n care metoda nu returneaz nimic, tipul este void.
Metodele pot fi supradefinite (suprancrcate), adic se pot defini
mai multe metode, care s poarte acelai nume, dar s difere prin
numrul i tipul de parametri.
Valoarea returnat de ctre o metod nu poate s fie luat n
considerare n cazul supradefinirii
Sintaxa este:
modificatorAcces tipReturnat numeMetoda([parametri])
[{
corp_Metoda
}]

Metode

unde:
modificatorAcces - este opional. n cazul n care lipsete se
consider implicit private.
modificatorAcces poate fi orice modificatorAcces amintit,
precum i new, static, virtual, sealed, override, abstract,
extern
tipReturnat poate fi un tip definit sau void.
numeMetoda - poate fi un simplu identificator
parametri - lista de parametri formali este o succesiune de
declarri desprite prin virgule,
declararea unui parametru are sintaxa:
[atribut][modificator] tip nume
Modificatorul unui parametru poate fi ref (parametru de
intrare i ieire) sau out (parametru care este numai de
ieire). Parametrii care nu au niciun modificator sunt
parametri de intrare.

Metode
Numele metodei trebuie s difere de
numele oricrui alt membru care nu este
metod.
La apelul metodei, orice parametru trebuie
s aib acelai modificator ca la definire
Invocarea unei metode se realizeaz prin:
[nume_obiect].[nume_metoda] pentru
metodele nestatice
[nume_clas].[nume_metoda] pentru
metodele statice

Proprieti
Proprietatea este un membru al clasei care ne permite s accedem
sau s modificm caracteristicile unui obiect sau al clasei.
Sintaxa este:
[atribut]modificatorAcces tipReturnat numeProprietate
{
get
{
}
set
{
}
}
modificatorAcces - poate fi orice modificatorAcces amintit
tipReturnat - poate fi orice tip valid n C#, el specificnd tipul
folosit de accesorii get(tipul valorii returnate) i set (tipul valorii
atribuite).

Exemplu

Evenimente i delegri

Evenimentele sunt membri ai unei clase ce permit clasei sau


obiectelor clasei s fac notificri, adic s anune celelalte
obiecte asupra unor schimbri petrecute la nivelul strii lor.
Clasa furnizoare a unui eveniment public (pune la dispoziia
altor clase) acest lucru printr-o declarare event care asociaz
evenimentului un delegat, adic o referin ctre o funcie
necunoscut creia i se precizeaz doar antetul, funcia urmnd a
fi implementat la nivelul claselor interesate de evenimentul
respectiv.
Este modul prin care se realizeaz comunicarea ntre obiecte.
Tehnica prin care clasele implementeaz metode (handler-e) ce
rspund la evenimente generate de alte clase poart numele de
tratare a evenimentelor.
Sintaxa:
[atribut][modificatorAcces]even tipDelegat nume
unde:
modificatorAcces - este la fel ca n cazul metodelor
tipDelegat este un tip de date, derivat din clasa sigilat
Delegate din spaiul System.

Evenimente i delegri

Definirea unui tipDelegat se realizeaz


astfel:

Un delegat se poate defini i n afara clasei


generatoare de evenimente i poate servi i
altor scopuri n afara tratrii evenimentelor

Operatori

Operatorul este un membru care definete semnificaia unei expresii


operator care poate fi aplicat unei instane a unei clase
Sintaxa:
[atribut] modificatorOperator declaratieDeOprator corpOperator

Operatorii trebuiesc declarai publici sau statici.


Parametrii operatorilor trebuie s fie de tip valoare. Nu se admit
parametri de tip ref sau out.
n antetul unui operator nu poate aprea, de mai multe ori, acelai
modificator.
Se pot declara operatori: unari, binari i de conversie.
Exemplu:
public static Complex operator -(Complex c)
{
Complex temp = new Complex();
temp.x = -c.x;
temp.y = -c.y;
return temp;
}

Colecii

Un vector reprezinta cel mai simplu tip de


colectie. Singura sa deficien este faptul c
trebuie cunoscut dinainte numrul de elemente
coninute.
Spaiul de nume System.Collections pune la
dispoziie un set de clase de tip colecie.
Clasele din acest spaiu de nume reprezint
containere de elemente de tip Object care i
gestioneaz singure necesarul de memorie
Exemplu:
ArrayList myCollection = new ArrayList();
myCollection.Add(client);
client = myCollection[0] as Client;

Clase i funcii generice


Clase generice sunt blocuri de cod
parametrizate care permit scriere unui cod
general, ce poate fi ulterior adaptat
automat la cerintele specifice ale
programatorului.
genericele sunt abloane (templates) sau
modele care ajut la reutilizarea codului.
Ele descriu clase i metode care pot lucra
ntr-o manier uniform cu tipuri de valori
diferite.

Metode generice

S presupunem c dorim s scriem o metod care s


realizeze interschimbarea valorilor a dou variabile.
Variantele sunt:
1. scrierea unei metode pentru fiecare tip al variabilelor:
neelegant, cod mult
2. scrierea unei metode care s foloseasc un Object pe
post de variabil auxiliar; dac se face apelul pentru 2
variabile de tip ir de caractere, apare eroare
Singurul mod adecvat de rezolvare a problemei este
folosirea unei metodegenerice, ca mai jos:
void Swap<T>(ref T a, ref T b)
{
T aux;
aux = a;
a = b;
b = aux;
}

Derivarea claselor
(motenire) Principiile
motenirii
Prin utilizarea motenirii se poate
defini o clas general care
definete trsturi comune la un
ansamblu de obiecte.
Aceast clas poate fi motenit
de ctre alte clase specifice,
fiecare dintre acestea adugnd
elemente care-i sunt unice ei.

Principiile motenirii

O clas care este motenit se numete clas de


baz sau superclas, iar o clas care o
motenete pe aceasta se numete clas
derivat, sau subclas, sau clas
descendent.
Pe baza a ceea ce am amintit, putem spune c o
clas derivat este o versiune specializat sau
extins a clasei de baz.
Clasa derivat motenete toate elementele clasei
de baz i-i adaug altele proprii.
Clasa derivat nu poate s tearg nici un
membru al clasei de baz.

Principiile motenirii

Definirea unei clase derivate se face folosind


sintaxa:
class ClasaDerivata : ClasaDeBaza
{

}
O clas derivat poate la rndul ei s fie clas de
baz pentru o alt clas. n acest fel se poate
defini noiunea de ierarhie de clase.
Limbajul C#, spre deosebire de C++, admite doar
motenirea simpl, n sensul c derivarea se
admite doar dintr-o clas de baz, fiind permis
doar derivarea public

Principiile motenirii
n contextul mecanismelor de motenire
trebuie amintii modificatorii abstract i
sealed aplicai unei clase, modificatori ce
oblig la i respectiv se opun procesului de
derivare.
Astfel, o clas abstract trebuie obligatoriu
derivat, deoarece direct din ea nu se pot
obine obiecte prin operaia de instaniere,
n timp ce o clas sigilat (sealed) nu mai
poate fi derivat

Exemplu

Accesibilitatea membrilor
motenii
Deseori, n procesul derivrii, avem nevoie
de acces la membrii motenii ai clasei de
baz.
Pentru aceasta se va folosi o expresie de
tip base access.
De exemplu, dac MembruB este un
membru al clasei de baz, pentru a-l folosi
ntr-o clasa derivat vom folosi, n
aceasta, o expresie de forma:
base.MembruB

Accesibilitatea membrilor
motenii

apelul din clasa derivat a unui membru al clasei de baz

Principiile motenirii

Utilizarea cuvntului cheie protected


Cuvntul cheie protected permite restrngerea accesului
unui membru al clasei de baz doar la clasele sale derivate.
Membrii protejai motenii devin n mod automat protejai.
Virtual i override
O clas declarat virtual implic faptul c o metod
implementat n ea poate fi redefinit n clasele derivate.
Doar metodele virtuale ne statice i/sau private pot fi
redefinite ntr-o clas derivat.
Aceste metode trebuie s aib aceeai signatur (nume,
modificator de acces, tip returnat i parametri).
Pentru declararea unei metode ca fiind virtual se folosete
cuvntul cheie virtual.
n clasele derivate se va folosi cuvntul cheie override
pentru redefinirea metodei virtuale din clasa de baz

New
Exist cazuri n care n loc s redefinim o
metod avem nevoie s specificm c
metoda clasei derivate este o
implementare nou a respectivei metode.
Pentru aceasta vom folosi new cu
semnificaia c metoda are aceeai
signatur cu a celei din clasa de baz, dar
dorim s mascm definirea ei n clasa de
baz.

Exemplu

Interfee

Interfeele sunt foarte importante n


programarea orientat pe obiecte, deoarece
permit utilizarea polimorfismului ntr-un sens
mai extins.
Definiie: O interfa este o component a
aplicaiei, asemntoare unei clase, care
declar prin membrii si (metode, proprieti,
evenimente i indexatori) un comportament
unitar aplicabil mai multor clase,
comportament care nu se poate defini prin
ierarhia de clase a aplicaiei

Tratarea excepiilor n
C#

Definiie: O excepie este un obiect care ncapsuleaz


informaii despre o situaie anormal.
Excepia se folosete pentru a semnala contextul n care
apare acea situaie deosebit
Observaie: Nu trebuie confundat termenul de excepie cu
cel de eroare sau bug.
Chiar dac programatorul elimin toate bug-urile din
programul su pot aprea erori pe care el nu le poate
preveni:
ncercare de deschidere a unui fiier inexistent
mpriri la zero
etc.
n cazul n care o metod ntlnete o astfel de excepie,
atunci respectiva excepie va trebui prins n vederea
tratrii (rezolvrii) ei.

Tratarea excepiilor n
C#

n C# se pot arunca ca excepii obiecte de tip


System.Exception sau derivate ale lui.
Pe lng ierarhia de excepii pe care limbajul C# o are inclus,
programatorul i poate crea propriile sale tipuri excepie.

Tratarea excepiilor n
C#

Instruciunea throw
Programatorul poate s-i compun modaliti
proprii de aruncare a erorilor folosind
instruciunea throw:
throw new NumeExceptie(exceptie);
unde:
NumeExceptie trebuie s fie numele unei clase
apropiate de excepia avut n vedere
excepie este un mesaj care apare n cazul n
care apare excepia, iar aceasta nu este prins cu
catch

Polimorfism

Noiunea de polimorfism. Un obiect polimorfic


este cel capabil s ia diferite forme, s se afle n
diferite stri, s aib comportamente diferite.
Polimorfismul obiectual, care trebuie s fie
abstract, se manifest n lucrul cu obiecte din
clase aparinnd unei ierarhii de clase, unde, prin
redefinirea unor date saumetode, se obin
membri diferii avnd ns acelai nume.
Pentru a permite acest mecanism, metodele care
necesit o decizie contextual, se declar ca
metode virtuale (cu modificatorul virtual).
n mod curent, n C# modificatorului virtual al
funciei din clasa de baz, i corespunde un
specificator override al funciei din clasa derivat
ce redefinete funcia din clasa de baz.

Polimorfism
O metod ne-virtual nu este polimorfic
i, indiferent de clasa creia i aparine
obiectul, va fi invocat metoda din clasa
de baz.
Limbajul C# admite trei tipuri de
polimorfism:
polimorfism parametric
polimorfism ad-hoc
polimorfism de motenire

Polimorfismul
parametric
Aceast form de polimorfism este
preluat de la limbajele neobiectuale:
Pascal, C.
Prin aceast form de polimorfism, o
funcie va prelucra orice numr de
parametri.
Pentru aceasta se va folosi un parametru
de tip params.

Polimorfismul ad-hoc
Acest tip de polimorfism se mai numete i
suprancrcarea metodelor.
Prin acest mecanism se pot defini n
cadrul unei clase mai multe metode, toate
avnd acelai nume, dar cu tipul i
numrul de parametri diferii.
La compilare, n funcie de parametri
folosii la apel, se va apela o funcie sau
alta.

Polimorfismul de
motenire

n cazul acestui tip de motenire se discuta ntr-o


ierarhie de clase.
n acest caz ne se pune problema apelrii
metodelor, avnd aceeai list de parametri
formali, metode ce fac parte din clase diferite
Modificatorul new
n cazul n care se dorete ca o metod dintr-o
clas derivat s aib aceeai semntur cu o
metod dintr-o clas de baz, dar s nu fie
considerat o suprascriere a ei, vom folosi
modificatorul new

Polimorfismul de
motenire
Metoda sealed
O metod avnd tipul override
poate fi declarat sealed.
n acest fel ea nu mai poate fi
suprascris ntr-o clas derivat

Programare vizual
Spunem c o aplicaie este vizual dac
dispune de o interfa grafic sugestiv i
pune la dispoziia utilizatorului instrumente
specifice de utilizare (drag, clic, hint etc)
Realizarea unei aplicaii vizuale nu const
doar n desenare i aranjare de controale, ci
presupune n principal stabilirea unor decizii
arhitecturale, decizii ce au la baz unul
dintre modelele arhitecturale de baz.

Mediul de dezvoltare
Visual C#

Pag 134