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
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
Introducere n limbajul
C#
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
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
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
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
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
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
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
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
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
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:
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:
Instruciuni condiionale,
de iteraie i de control
Instruciunea while
Instruciunea while are sintaxa:
while (conditie) 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)
Exemplu
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
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
Instruciuni condiionale,
de iteraie i de control
Instruciuni condiionale,
de iteraie i de control
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
Tablouri
Tablouri unidimensionale
Tip[] nume;
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:
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:
Exemplu:
Sau
int[,] mat = {{1,2,3},{4,5,6},{7,8,9}};
Exemplu:
iruri de caractere
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)
Suprancrcare
Motenire
Motenire
Motenire
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.
Clase
Modificatorii de acces in
C#
Clase
Clase
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
Date
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
Date
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
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
Constructori i
destructori
Constructori
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
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
Evenimente i delegri
Operatori
Colecii
Metode generice
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
Principiile motenirii
}
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
Principiile motenirii
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
Tratarea excepiilor n
C#
Tratarea excepiilor n
C#
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
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
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