Sunteți pe pagina 1din 122

ACADEMIA DE STUDII ECONOMICE

Facultatea de Cibernetic, Statistic i Informatic Economic

SUPORT CURS

Lect. dr. Ctlin BOJA


catalin.boja@ie.ase.ro
cladire CSIE, sala 2315
Activitate didactica: Curs 50% + Laborator 50%
11 activitati 11 activitati

Metodologia de evaluare:
Examen la calculator curs (50%)
Lucrare la calculator seminar 15-19 Martie 2010 (25%)
Evaluare proiect in 2 faze (10%)
3 grile curs (15%)

Obiectiv: Insusirea aspectelor practice si teoretice ale


limbajului C# si a tehnologiei .NET Forms

2010 Catalin Boja 3


1. Introducere .NET Framework 1. Concepte Programare Orientata
2. Fundamentele limbajului C# Obiect. Comparatie C++ vs C#
3. Programare OO in C# 2. Clase, obiecte si namespace
4. Reflection 3. Compozitie/Derivare/Interfete
5. Multi-threading
4. Observer/Delegate & Windows
6. Streams Forms
7. Sockets
5. Win Forms, Controale de baza,
8. Remoting
Gestiune eveneimente Mouse +
9. Programare DB ADO .NET
Tastatura
10. GUI Graphical User Interface
6. Meniuri, Controale de tip bara,
11. Web Programing & XML
Validare Controale, Fisiere
12. Interop & Enterprise Service
7. Controale complexe, ListView,
TreeView
8. Lucru cu ferestre multiple,
Aplicatii de tip MDI, Elemente de
grafica
9. Imprimare, Drag&Drop. Clipboard
10. ADO .NET, Controale Utilizator
2010 Catalin Boja 4
1. Ion SMEUREANU, M. Dardala, A. Reveiu Visual
C# .NET, Editura CISON, Bucuresti 2004
2. K.M. Hussain Programming .NET with C#,
Rox Publishing House, USA 2001
3. Jesse Liberty Programming C# 2nd Edition,
OReilly Publishing House, USA 2002
4. Tom Archer Inside C#, Microsoft Press, USA
2001
5. Adrian Turtschi C# .NET Web Developers
Guide, Syngress Publishing House, USA 2002
6. ECMA TC39/TG2 C# Language Specification,
USA 2002
7. http://acs.ase.ro
2010 Catalin Boja 5
Platforma .NET
Primul program C#
Mixed Programming
Comparatie C++ vs C#
Tipuri de date in C#
Conceptul de boxing / unboxing
Masive de date
Tipuri de date struct/enum si class
Argumentele metodei main
Mecanisme try-catch
Pointeri/Referinte
Definire clase
Proprietati

2010 Catalin Boja 6


VB.NET Managed C++ C# Alte limbaje C#

CLS - Common Language Specifications

Web Services / Web Forms Windows Forms

Data si XML

Base Class Library

CLR - Common Language Runtime


(debug, exception, type checking, JIT compiler,
garbage collector)

2010 Catalin Boja 7


Sursa
C# / J# / Managed C++, VB .NET

Compilare csc.exe, vbc.exe, cl.exe

=>
IL Interpreted Language
Procedura de asamblare csc.exe,
=>

vbc.exe, cl.exe

PE Portable Executable
(EXE sau DLL)
Assembly

Interpretat de CLR

2010 Catalin Boja 8


Nu sunt permise functii/variabile globale
cshello.cs
using System; Metoda Main nu trebuie apelata de un obiect

class Hello {
public static void Main(){
Console.WriteLine("Hello World.NET");
}
}

Start -> Visual Studio 2005 -> Tools -> Command Prompt
Compilare cu csc.exe cshello.cs 2010 Catalin Boja 9
vbhello.vb
Imports System
Module Hello
Sub Main()
Console.WriteLine("Hello World.NET")
End Sub
End Module

Start -> Visual Studio 2005 -> Tools -> Command Prompt
Compilare cu vbc.exe vbhello.vb 2010 Catalin Boja 10
mcpphello.cpp
#using <mscorlib.dll>
using namespace System;
void main()
{
Console::WriteLine(S"Hello World.NET");
}

Start -> Visual Studio 2005 -> Tools -> Command Prompt
Compilare cu cl.exe mcpphello.cpp 2010 Catalin Boja 11
jshello.js

import System;
Console.WriteLine("Hello World.NET");

Start -> Visual Studio 2005 -> Tools -> Command Prompt
Compilare cu jsc.exe jshello.js 2010 Catalin Boja 12
ilhello.il
.assembly Hello{ }
.method public static void run() il managed{
.entrypoint
ldstr "Hello World.NET"
call void
[mscorlib]System.Console::WriteLine(class
System.String)
ret
}

Start -> Visual Studio 2005 -> Tools -> Command Prompt
Compilare cu ilasm.exe ilhello.il 2010 Catalin Boja 13
namespace Math{ csc /t:library math.cs
public class BasicOp{ C#
public static double Add(double op1, double op2){
return op1 + op2; math.dll
}
public static double Multiply(double op1, double op2){
return op1 * op2;
}
Imports Math
}
}
Imports System
VB
Module MathTest
Sub Main()

vbc /r:math.dll mathtest.vb Dim vb1 As Double = 20


Dim vb2 As Double = 30

Console.WriteLine("Suma celor 2 variabile este {0}, iar produsul este {1}.",


mathtest.exe BasicOp.Add(vb1, vb2), BasicOp.Multiply(vb1, vb2))
End Sub
End Module 2010 Catalin Boja 14
using System;
class Abonat{ };
public class Abonat{ C#

void main(){ C++ public static void Main(){
Abonat a1(2345, "Maria");
Abonat a2(231, "Ana");
a2 = a1;

Abonat* pa1 = new Abonat(112, "Ion");


X
Abonat a1 = new Abonat(2345, "Maria");
Abonat a2 = new Abonat(231, "Ana");
Abonat* pa2 = new Abonat(128, "Vasile");
a2 = a1;
pa1 = pa2;
a1.Afisare();
pa1->Afisare();
a2.Afisare();
pa2->Afisare();
if (a1 == a2) Console.WriteLine("\t POINTER:
if(a1 == a2) cout << "\n\t VALORI: egale";
egale");
if(pa1 == pa2) cout<< "\n\t POINTER: egale";
else Console.WriteLine("\n POINTER: !
else cout<< "\n\t POINTER: ! egale"
egale"); }
}
}
2010 Catalin Boja 15
obiecte gestionate prin valoare obiecte gestionate doar prin
si referinte; referinte
o clasa poate contine atribute pointerii din C++ definiti cu * sunt
dinamice gestionate de pointeri considerati unsafe si sunt indicati
destructorul are rol de a dezaloca doar pentru lucru cu COM-uri
spatiul ocupat si pentru a evita dezalocarea memorie se face de
memory leak-uri catre garbage collector-ul din CRL;
necesitate definire operator= si destructorul are roluri speciale;
constructor copiere pentru a evita operatorul = nu se mai
copierea implicita supraincarca;
string gestionat prin char* operatorul = implicit realizeaza
shallow copy;
constructorul de copiere necesar
pentru a face deep copy;
un nou tip valoric string;

2010 Catalin Boja 16


a. Tipuri de baza

1. Tipuri valorice

b. Tipuri introduse de struct si enum

2. Tipuri referentiale introduse prin class / interface / delegate

2010 Catalin Boja 17


Valori default in C#:
numeric (int, long, double, ) -> 0
bool -> false
char -> \0
enum -> 0
reference -> null

2010 Catalin Boja 18


Trecerea din valoare in referinta si invers se face prin impachetare / despachetare
(conceptul de boxing / unboxing)

class BoxUnbox
{
static void Main()
STIVA HEAP
{
int i = 123; 4 octeti : 123
object Obiect = i referinta 4 octeti: 123

Int32 I32 = i referinta ? octeti: 123

int j = (int) Obiect; 4 octeti : 123


}
}

2010 Catalin Boja 19


SINTAXA: tip_data [ ] nume_masiv;
reprezinta colectii indexate de obiecte;
diferit de masivul din C/C++
un obiect derivat din clasa Array
mosteneste o serie de metode:
BinarySearch()
Clear()
CopyTo()
Sort( )
Clone( )
mosteneste o serie de proprietati:
Length

2010 Catalin Boja 20


STIVA HEAP

int [ ] vect; referinta null


vect = new int[4]; referinta 16 octeti: 0,0,0,0
int [ ] vect2 = {1,2,3,4}; referinta 16 octeti: 1,2,3,4
int [ ] vect3 = new int[4] {1,2,3,4}; referinta 16 octeti: 1,2,3,4

Pers p1; referinta null


Pers [ ] vectPers; referinta null
vectPers = new Pers[4]; referinta 16 octeti: null, null, null, null

referinta 16 octeti: @ @ @ @
vectPers = new Pers[4] {p1,p2,p3,p4};
Pers p1
Pers p1
Pers p1
Pers p1
2010 Catalin Boja 21
SINTAXA: tip_data [ , ] nume_masiv;

int [,] matrice; //matrice tablou


matrice = new int[4,4];
int [2,2] matrice2 = {1,2,3,4};

int [ ][ ] matrice3 = new int[3]; //matrice zig-zag


matrice3[0] = new int[3];
matrice3[1] = new int[5];
matrice3[2] = new int[7];

2010 Catalin Boja 22


SINTAXA:
[acces] struct nume_struct [:interfete]
{ atribute + metode }
reprezinta colectii de atribute + metode;
este derivata din object
este un tip valoric (value type) definit de
utilizator
poate fi derivata din interfete
poate fi impachetata intr-un obiect (boxing)

2. Tipuri de date struct/enum stud1.cs, stud2.cs


si class

2010 Catalin Boja 23


SINTAXA:
enum nume_enum { lista constante }
reprezinta o colectie de constante;
implicit primul simbol are valoare 0
pot fi date valori explicite prin nume_simbol
= valoare
nu poate fi initializata cu valori numerice

2. Tipuri de date struct/enum stud1.cs, stud2.cs


si class

2010 Catalin Boja 24


SINTAXA:
public static void Main(string[ ] Args)
reprezinta un masiv de stringuri;
prima valoare NU este numele executabilului
trebuie validat numarul de parametrii

hello1.exe Popescu Gigel <-> Args =


{Popescu, Gigel }

1. Argumente main, try-catch, hello1.cs, hello2.cs, hello4.cs, hello6.cs


for, while
2010 Catalin Boja 25
Mecanisme try-catch-finally
Pointeri/Referinte parametrii pentru
funcii
Definire clase
Proprietati
Shallow copy vs Deep copy

2010 Catalin Boja 26


exceptie situatie in care prelucrarea anumitor
date de intrare nu este gestionata sau nu este
posibila (ex: impartire la 0, citire in afara unui
masiv) (ecuatie1.cs)
permite gestiunea situatiilor exceptionale care
conduc la terminarea imediata a programului
necesar pentru a realiza programe robuste si
fiabile
implementat prin try, catch si throw
permite gestiunea erorilor de sistem si a
erorilor definite de programator

2010 Catalin Boja 27


try
{//secventa prelucrari}
catch(exceptie_tip_1)
{ //secventa prelucrari specifice}
catch(exceptie_tip_2)
{//secventa prelucrari specifice}
catch(Exeption)
{ //secventa prelucrari generale}
finally
{//secventa prelucrari obligatorii}
2010 Catalin Boja 28
blocul try{}
contine secventa de prelucrari care genereaza
exceptii;
are asociat minim un bloc catch
intre blocul try si blocurile catch asociate nu
exista alte instructiuni
blocul catch( tip_exceptie exceptie)
gestioneaza o exceptie de tipul anuntat
tip_exceptie reprezinta instanta unei clase
derivate din Exception (ArithmeticException,
DivideByZeroException)
2010 Catalin Boja 29
blocul catch(Exception e)
gestioneaza toate tipurile de exceptii
blocul finally{}
contine secventa de prelucrari care se executa
indiferent daca blocul try a generat sau nu
exceptii si daca acestea au fost sau nu tratate in
blocurile catch;

2010 Catalin Boja 30


Blocurile catch sunt definite in ordine crescatoare a
generalitatii exceptiilor tratate
try { }
catch(exceptie_tip_1){}
catch(exceptie_tip_2){}

catch(Exception e){}

2010 Catalin Boja 31


Blocurile try-catch-finally pot fi
incluse in alte blocuri try;
Programatorul poate defini
propriile exceptii prin clase
derivate din Exception (ecuatie2.cs)
functia throw genereaza orice tip
de exceptie (ecuatie2.cs)
2010 Catalin Boja 32
Exceptie definita de programator:
public class ExceptieDiscriminant : Exception
{
public ExceptieDiscriminant(string Message)
: base(Message)
{
}
}

2010 Catalin Boja 33


subprogramale pot primi parametrii prin
valoare sau prin referinta
prin valoare -> copierea valorii parametrului
pe stiva functiei
prin referinta -> copierea adresei
parametrului pe stiva functiei
ATENTIE toate tipurile referentiale sunt
trimise doar prin referinte

2010 Catalin Boja 34


transferul parametrilor prin valoare
(interschimb1.cs)

public static void Interschimb(int p, int q){


int t = p;
p = q;
q = t;
}

2010 Catalin Boja 35


transferul parametrilor prin pointeri (*) -
(interschimb2.cs)
este considerat unsafe de catre compilator
toate metodele care lucreaza cu pointeri * au atributul
unsafe
sursa se compileaza cu optiunea /unsafe

public static unsafe void Interschimb(int* p,


int* q){
int t = *p;
*p = *q;
*q = t;
}
2010 Catalin Boja 36
transferul parametrilor prin referinte
(interschimb3.cs)
referintele sunt definite prin
ref parametrii de intrare/iesire
out parametrii de iesire

2010 Catalin Boja 37


transferul parametrilor prin referinte
(interschimb3.cs)

public static void Interschimb(ref int p, ref int q)


{
int t = p;
p = q;
q = t;
}

2010 Catalin Boja 38


subprogramele pot fi definite cu numar variabile de parametrii
(suma.cs)

public static double Suma(params double[] list)


{
double s = 0;
if (list.Length == 0) return s;
for(int i = 0;i<list.Length;i++)
{
s += list[i];
}
return s;
}

2010 Catalin Boja 39


Concepte legate de POO in C#:
fiecare obiect contine date (atribute/campuri) definite in clasa;
clasa defineste o serie de functii (metode/operatii) ce pot fi
aplicate obiectelor; acestea definesc interfata obiectului;
datele sunt ascunse in obiect si pot fi accesate numai prin
functii definite in clasa incapsulare;
obiectele sunt create prin instantierea clasei;
prin abstractizare (definire clasa) se decide ce atribute si ce
metode sunt suportate de obiecte;
starea obiectului este definita de atributele sale;
comportamentul obiectului este definit de metodele sale;
termenul de passing a message catre un obiect este echivalent
cu invocarea metodei;

2010 Catalin Boja 40


Concepte legate de POO in C#:

In C# toate
obiectele sunt
gestionate prin
referinte.
2010 Catalin Boja 41
Sintaxa definire:
[atribute] [tip_acces] class Nume_Clasa
[:clasa_baza]
{
tip_acces atribut1;
tip_acces atribut2;

tip_acces functie membra1;
};

2010 Catalin Boja 42


tip_acces:
public accesibile
private neaccesibile
protected accesibile claselor derivate
internal accesibile claselor din acelasi
assembly
protected internal

2010 Catalin Boja 43


atribute constante (clase1.cs):
definite prin const sau readonly
NU este permisa modificarea valorii odata ce
au fost initializate;
sintaxa:
class Test
{
public const int atribut_1 = 10;
public readonly int atribut_2;
}

2010 Catalin Boja 44


atribute constante definite
prin const:
sunt initializate doar la definire
NU este permisa modificarea valorii odata ce
au fost initializate;
sunt considerate variabile definite la nivelul
clasei si nu atribute ale unui obiect (static)
sunt accesate prin numele clasei

2010 Catalin Boja 45


atribute constante definite
prin readonly:
sunt initializate la definire sau in constructor
NU este permisa modificarea valorii odata ce
au fost initializate;
reprezinta forma echivalenta a variabilelor
const din C++

2010 Catalin Boja 46


atribute statice (clase1.cs):
definite prin static
definesc atribute ce nu apartin unui obiect
pot fi readonly
initializarea se face la definire sau prin
constructor static
sunt considerate variabile definite la nivelul
clasei si nu atribute ale unui obiect
sunt accesate prin numele clasei

2010 Catalin Boja 47


atribute statice (clase1.cs):
sintaxa:
class Test
{
public static int atribut_1 = 10;
public static readonly int atribut_2;
}

2010 Catalin Boja 48


Pointerul THIS:
reprezinta adresa obiectului care apeleaza
metoda membra a clasei;
toate functiile nestatice membre clasei
primesc implicit acest pointer;
se plaseaza pe prima pozitie in lista de
parametrii a metodei;

2010 Catalin Boja 49


functii membre:
definesc interfata obiectului;
permit accesul la atributele obiectului
incapsulare;
definesc comportamentul obiectului;
categorie speciala de functii: constructor,
destructor, constructor de copiere;
tipuri particulare: statice;

2010 Catalin Boja 50


functii membre statice:
definesc functii ce nu apartin unui obiect;
reprezinta functii globale ce apartin unei
clase de obiecte;
au acces DOAR la alti membrii statici ai clasei;
sunt apelate prin specificatorul de clasa
Nume_clasa.
NU primesc in lista de parametrii pointerul
THIS;

2010 Catalin Boja 51


functii constructor:
rol principal: alocarea spatiului aferent unui
obiect;
rol secundar: initializarea atributelor
obiectului;
tipuri:
implicit
cu parametrii

2010 Catalin Boja 52


functii constructor:
au denumire identica cu a clasei;
NU au tip returnat explicit deoarece
returneaza implicit adresa zonei de memorie
rezervata obiectului construit;
sunt definite pe zona publica a clasei;
forma implicita este generata de compilator
daca nu este definita de programator;

2010 Catalin Boja 53


functii constructor:
sintaxa:
class Nume_clasa {
public Nume_clasa( ){}
};
apel (deoarece obiectele sunt gestionate prin referinte, crearea
unui obiect se face cu operatorul new):

public static void Main () {


Nume_clasa obiect_1 = new Nume_clasa();
Nume_clasa obiect_2 = new Nume_clasa( parametrii
constructor)
}

2010 Catalin Boja 54


functii constructor - static:
rol principal: initializarea atributelor statice;
NU au atribut de acces
este apelat automat inainte de initializarea de
obiecte
NU pot fi apelati explicit
class Nume_clasa {
static Nume_clasa( ){}
};

2010 Catalin Boja 55


functii destructor:
rol principal: eliberarea resurselor gestionate
de un obiect si care au sens in logica problemei
de rezolvat (ex: inchidere conexiune baze de
date, inchidere fisier, etc);
au denumire identica cu a clasei; pentru a se
deosebi de constructor, numele lor este
prefixat de ~;
NU au tip returnat explicit;

2010 Catalin Boja 56


functii destructor:
NU au atribut de acces;
forma implicita este generata de compilator
daca nu este definita de programator;
sunt apelate implicit de catre garbage collector;
NU pot fi apelate explicit;
pot fi onlocuite cu metoda Dispose() (avantaj:
se poate apela)

2010 Catalin Boja 57


functii destructor:
sintaxa:
class Nume_clasa {
~Nume_clasa( ){}
};
apel implicit:
public static void Main () {
Nume_clasa obiect_1 = new Nume_clasa();
}

2010 Catalin Boja 58


constructor de copiere:
rol principal: alocarea spatiului aferent unui
obiect si initializarea acestuia cu valorile unui
obiect existent;
NU are forma implicita;
este apelat explicit;
importanta scazuta fata de versiunea din
C++

2010 Catalin Boja 59


constructor de copiere:
sintaxa:
class Nume_clasa {
public Nume_clasa(Nume_clasa ob_existent){}
};
apel explicit:
public static void Main (){
Nume_clasa obiect_1 = new Nume_clasa();
Nume_clasa obiect_2 = new Nume_clasa(obiect_1);
}

apel constructor copiere


2010 Catalin Boja 60
operator =

Limbajul C# NU permite
supraincarcarea
operatorului =

2010 Catalin Boja 61


operator =
rol principal: copiaza bit cu bit valoarea zonei
de memorie sursa in zona de memorie a
destinatiei (cele doua zone sunt identice ca
structura si tip);
in cazul obiectelor C#, copiaza valoarea
referintei obiectului sursa in referinta obiectul
destinatie

2010 Catalin Boja 62


operator =
apel explicit :
class Nume_clasa {

};

public static void Main () {


Nume_clasa obiect_1 = new Nume_clasa();
Nume_clasa obiect_2() = new Nume_clasa();
obiect_2 = obiect_1;
}

2010 Catalin Boja 63


permit accesul (citire / scriere) la atributele
private ale clasei
presupun validarea datelor de intrare
sunt definite in zona publica
contin 2 metode
metoda de citire se numeste get
metoda de scriere se numeste set;

2010 Catalin Boja 64


au forma unei structuri de date ce contine 2
metode
sintaxa:
public tip_atribut nume_proprietate{
get{ return }
set{ }
}

2010 Catalin Boja 65


metoda get trebuie sa returneze o valoare de
tipul tip_atribut;
metoda set primeste implicit un parametru
numit value de tip tip_atribut;
sintaxa de utilizare a proprietatii este
identica cu cea a atributului

ob1.nume_proprietate = valoare;
valoare = ob1.nume_proprietate;

2010 Catalin Boja 66


public class Produs
{
private double _cost; //proprietate privata
private float _profit; //proprietate privata
private static int nrproduse; //proprietate statica
}

Accesul la membrii privati se realizeaza prin metode de tip proprietate:

//proprietate pentru _profit


public float get_Profit() { return _profit;}
public float Profit { Compilatorul
get { genereaza automat
return _profit;
} public void set_Profit( float value){
set { if(value>0) _profit=value;
if(value>0) _profit=value; }
}
}
2010 Catalin Boja 67
Shallow copy
copiere de adrese intre 2 obiecte;
realizata implicit prin operatorul =
Deep copy
copiere de continut intre 2 obiecte
realizata explicit prin metode specializate
(constructor copiere, Clone, etc)

Exemplu: copy.cs

2010 Catalin Boja 68


Implementare metoda Clone
definire metoda proprie
supradefinire metoda Clone din ICloneable

2010 Catalin Boja 69


STIVA HEAP

Auto a1; referinta null


Auto a2 = new Auto(); referinta X octeti: valori

Shallow copy
referinta
a1 = a2
referinta X octeti: valori

referinta X octeti: valori


a1 = new Auto(a2)
referinta X octeti: valori

referinta X octeti: valori


a1 = (Auto)a2.Clone()
referinta X octeti: valori
Deep copy
2010 Catalin Boja 70
Supraincarcare operatori / conversii
implicite/explicite
Derivare/mostenire
Interfete / clase abstracte
Mecanism virtualizare (virtual ->
override/new)
Supraincarcare indexer + suport foreach

2010 Catalin Boja 71


supraincarcare functii (overloading):

implementeaza conceptul de polimorfism (acelasi lucru, mai


multe interpretari)
atribuirea unui simbol (nume functie) mai multe semnificatii;
diferenta se face in functie de semnatura functiei = numarul
si tipul parametrilor;
tipul returnat NU reprezinta criteriu de selectie la apel

int suma(int a, int b) eroare compilare double suma(int a, int b)


{ {
return a+b; return a+b;
situatie ambigua }
}

2010 Catalin Boja 72


supraincarcare operatori:
sunt implementati prin functii statice:
sunt functii care se numesc operator [simbol]

class Test{

}; interpretare Test.operator+(t1,t2)
void main() (supraincarcare prin
{ functie statica)
Test t1, t2, t3;
t1 = t2 + t3;
}
2010 Catalin Boja 73
restrictii supraincarcare operatori:
NU schimba precedenta operatorilor
NU schimba asociativitatea
conserva cardinalitatea (numarul parametrilor)
NU creaza operatori noi
formele supraincarcate nu se compun automat
NU se supraincarca = . ?: -> new is sizeof
typeof [ ] ( ) += -=
+= este evaluat prin operatorul +

2010 Catalin Boja 74


recomandari supraincarcare operatori:
daca se supraincarca == atunci si Equals ()
mostenita de la object si !=
daca se supraincarca un operator de
comparatie atunci toti >, <, >=, <=
operatorul [ ] nu se supraincarca dar pot fi
definite metode de tip indexer

Exemplu: numerar.cs 2010 Catalin Boja 75


supraincarcare operatori unari ++ si --:
2 forme: prefixata si postfixata;
prin functie membra statica;
cele 2 forme (post si pre) sunt tratate unitar de
catre compilatorul de C# pentru ca lucram cu
referinte

int vb1 = 10;


int vb2 = vb1++; -> vb2 = 10 si vb1 = 11;
int vb3 = 10;
int vb4 = ++vb3 -> vb4 = 11 si vb3 = 11
Exemplu: numerar.cs 2010 Catalin Boja 76
supraincarcare operatori unari ++ si --:
class Test{

public static Test operator++ (Test t )
{
//prelucrari
return t;
}
};

2010 Catalin Boja 77


supraincarcare operatori unari ++ si
--:
class Test ++t1 sau t1++
{}

Test t1 = new Test();


referinta X octeti: valori

Test t2 = t1++; referinta

Test t3 = ++t1; referinta

2010 Catalin Boja 78


supraincarcare operatori binari +, -, *, /:
au intotdeauna 2 parametri;
comutativitatea operatiei matematice nu are
sens in C# (trebuie definita explicit)
prin functie statica publica;

Exemplu: numerar.cs 2010 Catalin Boja 79


supraincarcare operator cast:
are intotdeauna 1 parametru;
numele castului reprezinta tipul returnat;
nu are tip returnat explicit;
prin functie statica;
folosit la conversia intre diferite tipuri de date;
ATENTIE in C# operatorul are 2 forme de
supraincarcat explicit sau implicit;

Exemplu: numerar.cs 2010 Catalin Boja 80


supraincarcare operator cast:
class Test{
public int valoare;

public static implicit operator int () { return valoare;}
public static explicit operator int () { return valoare;}
};
void main(){
Test t;
int vb1 = t; //cast implicit
int vb2 = (int) t; //cast explicit
}

2010 Catalin Boja 81


supraincarcare operator [ ] (indexer):
este o proprietate
pentru ca nu are nume se noteaza cu this ;
este folosit pentru a permite acces in citire /
scriere pe elementele unui sir de valori din
zona privata a obiectului;
indexul nu este obligatoriu de tip numeric;

Exemplu: randomlist.cs 2010 Catalin Boja 82


supraincarcare operator [ ] (indexer):
public class RandomList{
private int[] list;

public int this[int index] {


get {
if (index >= 0 || index < list.Length) return
list[index];
else return 0;
}
set {
if (index >= 0 || index < list.Length) list[index] =
value;
}
}

2010 Catalin Boja 83


se implementeaza cand intre clasa derivata si clasa de baza exista relatia is a;
-este permisa derivarea doar dintr-o singura clasa de baza:

public class ProdusSpecial : Produs


{ private float _discount;

}

-apelul constructorului din clasa de baza se face prin base:

public ProdusSpecial(double cost,float profit, float discount):base(cost,profit)


{
if(discount>0) _discount=discount;
}

2010 Catalin Boja 84


prin derivare noua clasa primeste de la clasa de baza
toate metodele + atributele

class Baza{
int atribut1;
int atribut2;
}; mostenire
class Derivat : Baza{
int atribut_nou;
};
2010 Catalin Boja 85
fiecare constructor este responsabil strict de zona
clasei pe care o reprezinta
constructor Baza
class Baza{
int atribut1;
int atribut2;
}; mostenire
Derivat
class Derivat : Baza{
int atribut_nou;
};
constructor Baza
2010 Catalin Boja 86
constructie obiect derivat = CONSTRUCTOR BAZA +
CONSTRUCTOR DERIVAT

class Baza{
Baza(){}
apel implicit Baza()
Baza(lista parametri){}
};
apel explicit
class Derivat : Baza{ :base(lista parametri)
Derivat(){};
SAU
Derivat() : base (lista parametri) {}
}; 2010 Catalin Boja 87
UPCASTING este permisa transformarea
implicita a obiectelor (referinte in C#) derivat
in obiecte (referinte) de tip baza

class Baza{
Baza

};
X
class Derivat : Baza{
Derivat

};
2010 Catalin Boja 88
UPCASTING

void main(){
Derivat d1 = new Derivat(); referinta Derivat X octeti: valori

Baza b1; referinta Baza null

Baza b2 = d1; referinta Baza

2010 Catalin Boja 89


pot fi definite functii cu acelasi header in clasa
de baza si in clasa derivata

class Baza{
int Metoda1(int a){}
};
apel explicit metoda baza
class Derivat : Baza{
int atribut_nou;
int Metoda1(int a){}
int Metoda2(int a){ base.Metoda1(a);}
}; 2010 Catalin Boja 90
UPCASTING + redefinire metode (nevirtuale)

void main(){
Derivat d1 = new Derivat()

Baza b1 = d1; forma metodei din


Baza;
b1.Metoda1(5);
d1.Metoda1(5);
}

2010 Catalin Boja 91


functii VIRTUALE:
permit redefinirea (override) sau ascunderea (new)
functiei din clasa de baza in clasa derivata

class Baza{
public virtual int Metoda1(int a){}
};

class Derivat : Baza{


int atribut_nou;
public [override | new ] int Metoda1(int a){}
};
2010 Catalin Boja 92
functii VIRTUALE:
versiunea functiei se stabileste la momentul
executiei (late binding) in functie de
modalitatea de redefinire (override vs new)
fiecare clasa contine o tabela de pointeri la
functii virtuale;
fiecare obiect primeste un pointer la tabela de
pointeri la functii virtuale
daca se realizeaza UPCASTING se apeleaza
metoda din clasa derivata pentru override si
metoda din clasa de baza pentru new

2010 Catalin Boja 93


-supradefinirea este permisa doar daca in clasa de baza metoda este anuntata
virtual, iar in clasa derivata este anuntata override;

public class Produs{


ProdusSpecial:Produs{


public virtual double PretProducator(){
public override double PretProducator(){
return _cost*(1+_profit/100);
double pret = base.PretProducator();
}
return pret*(1-_discount/100);
}
}
}

static void Main(string[] args)


{
ProdusSpecial ps = new ProdusSpecial(40,15,10);
Console.WriteLine(" Pretul de producator al produsului special este {0}",ps.PretProducator());

// evidentiere late-binding
Produs RP=ps;
Console.WriteLine(" Pretul de producator al produsului special este {0}", RP.PretProducator());

2010 Catalin Boja 94


-ascunderea unei metode din clasa derivata (evitare late-binding) se face
declarand metoda new (nu este obligatoriu ca metoda din clasa de baza sa fie
anuntata virtual)
public class Produs{ ProdusSpecial:Produs{

public double PretProducator(){ public new double PretProducator(){
return _cost*(1+_profit/100); double pret = base.PretProducator();
} return pret*(1-_discount/100);
} }
}

static void Main(string[] args)


{
ProdusSpecial ps = new ProdusSpecial(40,15,10);
Console.WriteLine(" Pretul de producator al produsului special este {0}",ps.PretProducator());

// evidentiere early-binding
Produs RP=ps;
Console.WriteLine(" Pretul de producator al produsului special este {0}", RP.PretProducator());

2010 Catalin Boja 95


POLIMORFISM (acelasi lucru, mai multe
interpretari) :
SUPRAINCARCAREA (OVERLOADING) de functii
in cadrul unei clase
SUPRADEFINIRE (REDEFINIRE) (OVERRIDE si
NEW) de functii virtuale in clasele derivate

2010 Catalin Boja 96


Mostenire vs Includere
se implementeaza
cand intre clasa
class Vehicol{ derivata si clasa
de baza exista
};
relatia is a;
class Automobil : public Vehicol{

};
2010 Catalin Boja 97
Mostenire vs Includere

class Motor{
se implementeaza
}; cand intre clasa
principala si cea
class Automobil{ inclusa exista o
Motor motor; relatie has a;
};
2010 Catalin Boja 98
-operatorul is este utilizat pentru a testa daca un obiect reprezinta instanta
a unei anumite clase;
-operatorul as face conversie de la obiect de baza la obiect derivat; daca
conversia nu poate avea loc returneaza null;
-conversia obiect baza la obiect derivat se face si prin cast; daca conversia
nu poate avea loc se returneaza System.InvalidCastException

Produs[] stoc={new Produs(100,10),new ProdusSpecial(45,10,5),new Produs(70,12),new


ProdusSpecial(50,4,10)};
double ValoareStocSpecial=0;
foreach(Produs p3 in stoc)
if(p3 is ProdusSpecial){
ProdusSpecial prodSpec = p3 as ProdusSpecial;
// ProdusSpecial prodSpec = (ProdusSpecial) p3;
ValoareStocSpecial+=prodSpec.PretVanzare();
}

2010 Catalin Boja 99


functii VIRTUALE PURE - ABSTRACTE:
functii virtuale ce nu au corp definit in clasa in
care sunt anuntate
sunt definite prin expresia

abstract tip_acces tip returnat nume_functie(


parametrii );

IMPUN redefinirea (overriding) functiei in clasa


derivata (daca nu se doreste abstractizarea
clasei derivat)
IMPUN definirea clasei de tip abstract;
2010 Catalin Boja 100
functii VIRTUALE PURE - ABSTRACTE:
abstract class Baza_abstracta{
public abstract int Metoda1(int a) ;
};

class Derivat : Baza{


pubic override int Metoda1(int a){}
};

2010 Catalin Boja 101


CLASE abstracte:
clase ce contin minim o functie virtuala pura
(abstracta);
rol de interfata pentru clase care trebuie sa
defineasca o serie de metode comune
un contract intre proprietarii mai multor clase
prin care se impune definirea unor serii de
metode comune;
contractul se incheie prin derivarea din clasa
abstracta;

2010 Catalin Boja 102


CLASE abstracte:
NU este permisa instantierea claselor
abstracte;
utilizate ca suport pentru derivare
abstract class Baza_abstracta{
int atribut1;
public abstract int Metoda1(int a);
};
void main(){
Baza_abstracta ba1;
Baza_abstracta ba1 = new Baza_abstracta;
}
2010 Catalin Boja 103
CLASE sealed (inchise):
NU este permisa derivarea claselor sealed;

sealed class Baza {


int atribut1;

};
class Derivat : Baza { }

2010 Catalin Boja 104


INTERFETE:
clase ce contin numai functii abstracte;
rol de interfata pentru clase care trebuie sa
defineasca o serie de metode comune
un contract intre proprietarii mai multor clase
prin care se impune definirea unor serii de
metode comune;
contractul se incheie prin derivarea din
interfata;
se definesc prin interface (inlocuieste class)

2010 Catalin Boja 105


INTERFETE:

interface class IOperatii {


void Operatie1( );
void Operatie2( );
}; supradefinire metode interfata
class Baza : IOperatii {
public void Operatie1() {}
public void Operatie2() {}
}

2010 Catalin Boja 106


Clase abstracte VS Interfete
contin metode contin doar metode
abstracte + atribute abstracte
+ metode neabstracte o clasa poate deriva
o clasa poate deriva mai multe interfete
doar o clasa de baza
poate fi utilizata ca
(abstracta sau nu)
reference type
poate fi utilizata ca
reference type

2010 Catalin Boja 107


int NrPuncte; virtual double Perimetru()=0;
Punct * Puncte; virtual double Arie()=0;
virtual double GetNrPuncte()=0;
IMasurabil
Punct Model2D
int X;
int Y;

Dreptunghi Cerc

Patrat
char * DenumireModel 2010 Catalin Boja 108
Arrays, Collections
Clase speciale (ArrayList / Stack / Queue /
HashTable)
Exemplu CallBack (amintire C++ cu
pointeri la functii)
Delegat
Eveniment
Forms

2010 Catalin Boja 109


Collection Interfaces
IEnumerable
ICollection
IComparer IComparable

asigura un standard in definirea de clase tip


colectie

2010 Catalin Boja 110


IEnumerable
ofera suport pentru operatorul foreach
foreach(tip_element element in colectie) {}

for(int i = 0;i< colectie.Count ;i++)


{ tip_element element = colectie[i]; }

se bazeaza pe definirea si utilizarea unui


iterator

2010 Catalin Boja 111


IEnumerable
defineste metoda:
public IEnumerator GetEnumerator( )
IEnumerator
defineste metodele:
public object Current()
public bool MoveNext()
public void Reset()
clasa derivata gestioneaza atributele:
referinta catre container
pozitia curenta
Exemplu: randomlist.cs si randomlist2.cs
2010 Catalin Boja 112
Collections:
Array
ArrayList
Queue ArrayProdus.cs
Stack
HashTable

2010 Catalin Boja 113


entitate 1 entitate 2

pointer functie functie 1


date functie 2

initializare
pointer functie pointer functie
functie 1
date functie 2

CALL functie
CALLBACK functie 1
functie 2
REZULTAT
2010 Catalin Boja 114
DELEGATE
un nou tip de referinta in C#
delegate tip_return nume_referinta (lista
parametrii);
echivalent pointerului la functie din C++
tip_return (* nume_pointer) (lista parametrii);
faciliteaza definirea pointerilor la functii
nume_referinta pFunctie;

2010 Catalin Boja 115


EVENT
reprezinta un vector/lista de delegati
(pointeri de functii)
event tip_delegate nume_event;
faciliteaza executia tututor functiilor printr-
un singur apel
nume_event([parametrii]);

Exemplu: DelegatC++.cpp si DelegatCS.cs 2010 Catalin Boja 116


EVENT
suporta operatorii aritmetici += si -= pentru
adaugare/stergere de delegati din eveniment

eveniment += new TipDelegate(metoda)

Exemplu: DelegatC++.cpp si DelegatCS.cs 2010 Catalin Boja 117


- un eveniment reprezinta un mesaj trimis de un obiect pentru a anunta o actiune
(user interaction - mouse click, button click sau program logic - functie din program)

prelucrare
lansare (raise) event (handle)
event
event sender event receiver

- in modelul de tratare a evenimentului din .NET, obiectul care lanseaza


evenimentul nu stie ce obiect sau ce metoda va primi si va gestiona (handle); din
acest motiv este nevoie de un element intermediar intre sursa si detinatie delegat
(pointer la functie)

Exemplu: DelegatEvenimen1.cs Fanfara.cs 2010 Catalin Boja 118


Pentru a lansa un eveniment este nevoie de 3 componente:
obiect ce lanseaza event-ul;
tip delegat ce defineste event-ul;
obiect ce defineste continutul mesajului

delegat defineste evenimentul


Ex: public delegate void FireEventHandler(object
sender, FireEventArgs fe);
event data parametrii
Ex: class FireEventArgs: EventArgs

event sender lanseaza evenimentul


Ex: class FireAlarm{ }
2010 Catalin Boja 119
FireAlarm myFireAlarm = new FireAlarm();

STIVA HEAP

myFireAlarm FireAlarm FireEvent null

COD

2010 Catalin Boja 120


FireAlarm myFireAlarm = new FireAlarm();
FireHandlerClass myFireHandler = new FireHandlerClass(myFireAlarm);

STIVA HEAP

myFireAlarm FireAlarm FireEvent

myFireHandler FireHandlerClass -

nu are atribute

COD prin constructor aboneaza la myFireAlarm.FireEvent


propria metoda ExtinguishFire
FireHandlerClass. ExtinguishFire(object
sender, FireEventArgs fe)
Exemplu: DelegatEvenimentFire.cs

2010 Catalin Boja 121


using System;
obiect derivat din Form
using System.Windows.Forms;
using System.Drawing;

public class Formular:Form


{
public Formular()
{
Text = Exemplu Formular";
Size = new Size(400,400);
}
public static void Main()
{
Application.Run(new Formular());
}
}

caracteristici gestionate prin


proprietati
csc/t:winexe /r:System.dll /r:System.Drawing.dll /r:System.Windows.Forms.dll Formular.cs
2010 Catalin Boja 122
using System.Windows.Forms;
Adaugare control la colectia
public class Formular:Form{ de controale a formularului
private Button bnclick;

public Formular2(){
Text = "Test Formular";
Size = new Size(400,400);

bnclick = new Button();


bnclick.Text = "Click Me";
bnclick.Size = new Size(60,24); obiect de tip Button
bnclick.Location = new Point(20,60);
bnclick.Click += new EventHandler(bnclick_Click);

Controls.Add(bnclick);
}
private void bnclick_Click(object sender, EventArgs ev) abonare la event-ul Click al
{} clasei Button
}

metoda handler event Click

2010 Catalin Boja 123

S-ar putea să vă placă și