You are on page 1of 123

ATENTIE !

Scopul acestui document este de a


structura si de a prezenta pe scurt
notiunile discutate la curs.
Invatarea materiei, exclusiv pe
baza acestui material, reprezinta
o abordare superficiala.

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

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

Introducere .NET Framework


Fundamentele limbajului C#
Programare OO in C#
Reflection
Multi-threading
Streams
Sockets
Remoting
Programare DB ADO .NET
GUI Graphical User Interface
Web Programing & XML
Interop & Enterprise Service

1.

2.
3.
4.

5.

6.

7.

8.

9.
10.

Concepte Programare Orientata


Obiect. Comparatie C++ vs C#
Clase, obiecte si namespace
Compozitie/Derivare/Interfete
Observer/Delegate & Windows
Forms
Win Forms, Controale de baza,
Gestiune eveneimente Mouse +
Tastatura
Meniuri, Controale de tip bara,
Validare Controale, Fisiere
Controale complexe, ListView,
TreeView
Lucru cu ferestre multiple,
Aplicatii de tip MDI, Elemente de
grafica
Imprimare, Drag&Drop. Clipboard
ADO .NET, Controale Utilizator
2010 Catalin Boja

1.
2.
3.
4.
5.
6.
7.

Ion SMEUREANU, M. Dardala, A. Reveiu Visual


C# .NET, Editura CISON, Bucuresti 2004
K.M. Hussain Programming .NET with C#,
Rox Publishing House, USA 2001
Jesse Liberty Programming C# 2nd Edition,
OReilly Publishing House, USA 2002
Tom Archer Inside C#, Microsoft Press, USA
2001
Adrian Turtschi C# .NET Web Developers
Guide, Syngress Publishing House, USA 2002
ECMA TC39/TG2 C# Language Specification,
USA 2002
http://acs.ase.ro
2010 Catalin Boja

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

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

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

cshello.cs

Nu sunt permise functii/variabile globale

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

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{
public class BasicOp{
public static double Add(double op1, double op2){
return op1 + op2;
}
public static double Multiply(double op1, double op2){
return op1 * op2;
}
Imports Math
}
Imports System
}

C#

csc /t:library math.cs

math.dll

VB

Module MathTest
Sub Main()

vbc /r:math.dll mathtest.vb

mathtest.exe

Dim vb1 As Double = 20


Dim vb2 As Double = 30
Console.WriteLine("Suma celor 2 variabile este {0}, iar produsul este {1}.",
BasicOp.Add(vb1, vb2), BasicOp.Multiply(vb1, vb2))
End Sub
End Module
2010 Catalin Boja
14

class Abonat{ };
void main(){

C++

Abonat a1(2345, "Maria");


Abonat a2(231, "Ana");
a2 = a1;
Abonat* pa1 = new Abonat(112, "Ion");
Abonat* pa2 = new Abonat(128, "Vasile");
pa1 = pa2;
pa1->Afisare();
pa2->Afisare();
if(a1 == a2) cout << "\n\t VALORI: egale";
if(pa1 == pa2) cout<< "\n\t POINTER: egale";
else cout<< "\n\t POINTER: ! egale"
}

using System;
public class Abonat{

public static void Main(){

C#

Abonat a1 = new Abonat(2345, "Maria");


Abonat a2 = new Abonat(231, "Ana");
a2 = a1;
a1.Afisare();
a2.Afisare();

if (a1 == a2) Console.WriteLine("\t POINTER:


egale");
else Console.WriteLine("\n POINTER: !
egale");
}
}
2010 Catalin Boja

15

obiecte gestionate prin valoare


si referinte;
o clasa poate contine atribute
dinamice gestionate de pointeri
destructorul are rol de a dezaloca
spatiul ocupat si pentru a evita
memory leak-uri
necesitate definire operator= si
constructor copiere pentru a evita
copierea implicita
string gestionat prin char*

obiecte gestionate doar prin


referinte
pointerii din C++ definiti cu * sunt
considerati unsafe si sunt indicati
doar pentru lucru cu COM-uri
dezalocarea memorie se face de
catre garbage collector-ul din CRL;
destructorul are roluri speciale;
operatorul
=
nu
se
mai
supraincarca;
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;
object Obiect = i

4 octeti : 123
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

HEAP

STIVA

int [ ] vect;
vect = new int[4];
int [ ] vect2 = {1,2,3,4};
int [ ] vect3 = new int[4] {1,2,3,4};

referinta null
referinta
referinta
referinta

Pers p1;
Pers [ ] vectPers;
vectPers = new Pers[4];

referinta null

vectPers = new Pers[4] {p1,p2,p3,p4};

16 octeti: 0,0,0,0
16 octeti: 1,2,3,4
16 octeti: 1,2,3,4

referinta null
referinta

16 octeti: null, null, null, null

referinta

16 octeti:

Pers p1
Pers p1
Pers p1
Pers p1
2010 Catalin Boja

21

SINTAXA: tip_data [ , ] nume_masiv;

int [,] matrice;


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

//matrice tablou

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


si class

stud1.cs, stud2.cs
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


si class

stud1.cs, stud2.cs
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,
for, while

hello1.cs, hello2.cs, hello4.cs, hello6.cs


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;
private float _profit;
private static int nrproduse;

//proprietate privata
//proprietate privata
//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
{
get {
return _profit;
}
set {
if(value>0) _profit=value;
}
}

Compilatorul
genereaza automat
public void set_Profit( float 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

referinta null
referinta

X octeti: valori

a1 = a2

referinta
referinta

X octeti: valori

a1 = new Auto(a2)

referinta
referinta

X octeti: valori
X octeti: valori

a1 = (Auto)a2.Clone()

referinta
referinta

X octeti: valori
X octeti: valori

Auto a1;
Auto a2 = new Auto();

Shallow copy

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)
{
return a+b;
}

eroare compilare double suma(int a, int 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
};
void main()
{
Test t1, t2, t3;
t1 = t2 + t3;
}

Test.operator+(t1,t2)
(supraincarcare prin
functie statica)

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++;
int vb3 = 10;
int vb4 = ++vb3
Exemplu: numerar.cs

-> vb2 = 10 si vb1 = 11;


-> vb4 = 11 si vb3 = 11
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
{}

Test t1 = new Test();


Test t2 = t1++;
Test t3 = ++t1;

++t1 sau t1++

referinta

X octeti: valori

referinta
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;
};
class Derivat : Baza{
int atribut_nou;
};

mostenire

2010 Catalin Boja

85

fiecare constructor este responsabil strict de zona


clasei pe care o reprezinta
constructor Baza

class Baza{
int atribut1;
int atribut2;
};
class Derivat : Baza{
int atribut_nou;
};

mostenire

constructor Baza

2010 Catalin Boja

Derivat

86

constructie obiect derivat = CONSTRUCTOR BAZA +


CONSTRUCTOR DERIVAT
class Baza{
Baza(){}
Baza(lista parametri){}
};

apel implicit Baza()

apel explicit
:base(lista parametri)

class Derivat : Baza{


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

class Derivat : Baza{

};

Derivat
2010 Catalin Boja

88

UPCASTING

void main(){
Derivat d1 = new Derivat();
Baza b1;
Baza b2 = d1;
}

referinta Derivat
referinta Baza

X octeti: valori

null

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;
b1.Metoda1(5);
d1.Metoda1(5);

forma metodei din


Baza;

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{

public virtual double PretProducator(){


return _cost*(1+_profit/100);
}
}

ProdusSpecial:Produs{

public override double PretProducator(){


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{

public double PretProducator(){


return _cost*(1+_profit/100);
}
}

ProdusSpecial:Produs{

public new double PretProducator(){


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

class Vehicol{

};

se implementeaza
cand intre clasa
derivata si clasa
de baza exista
relatia is a;

class Automobil : public Vehicol{

};
2010 Catalin Boja

97

Mostenire vs Includere

class Motor{

};
class Automobil{
Motor motor;
};

se implementeaza
cand intre clasa
principala si cea
inclusa exista o
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

contin metode
abstracte + atribute
+ metode neabstracte
o clasa poate deriva
doar o clasa de baza
(abstracta sau nu)
poate fi utilizata ca

VS

Interfete

contin doar metode


abstracte
o clasa poate deriva
mai multe interfete
poate fi utilizata ca
reference type

reference type

2010 Catalin Boja

107

int NrPuncte;
Punct * Puncte;
virtual double GetNrPuncte()=0;

virtual double Perimetru()=0;


virtual double Arie()=0;
IMasurabil

Punct

Model2D

int X;
int Y;

Dreptunghi

Patrat
char * DenumireModel

Cerc

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
Stack
HashTable

ArrayProdus.cs

2010 Catalin Boja

113

entitate 1

entitate 2

pointer functie

functie 1

date

pointer functie

functie 2

initializare
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 printrun 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
(handle)
event

lansare (raise) 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

myFireAlarm

HEAP

FireAlarm

FireEvent

null

COD

2010 Catalin Boja

120

FireAlarm myFireAlarm = new FireAlarm();


FireHandlerClass myFireHandler = new FireHandlerClass(myFireAlarm);
STIVA

myFireAlarm
myFireHandler

HEAP

FireAlarm
FireHandlerClass

FireEvent
nu are atribute

COD
FireHandlerClass. ExtinguishFire(object
sender, FireEventArgs fe)

prin constructor aboneaza la myFireAlarm.FireEvent


propria metoda ExtinguishFire

Exemplu: DelegatEvenimentFire.cs
2010 Catalin Boja

121

using System;
using System.Windows.Forms;
using System.Drawing;

obiect derivat din Form

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


de controale a formularului

public class Formular:Form{


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);
bnclick.Location = new Point(20,60);
bnclick.Click += new EventHandler(bnclick_Click);

obiect de tip Button

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

You might also like