122
SUPORT CURS Lect. dr. Cătălin BOJA [email protected] cladire CSIE, sala 2315 ACADEMIA DE STUDII ECONOMICE Facultatea de Cibernetică, Statistică şi Informatică Economică

Curs CS Catalin Boja

Embed Size (px)

DESCRIPTION

Curs CS (Nato)

Citation preview

Page 1: Curs CS Catalin Boja

SUPORT CURS

Lect. dr. Cătălin [email protected] CSIE, sala 2315

ACADEMIA DE STUDII ECONOMICEFacultatea de Cibernetică, Statistică şi Informatică Economică

Page 2: Curs CS Catalin Boja

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

3© 2010 Catalin Boja

Page 3: Curs CS Catalin Boja

1. Introducere .NET Framework2. Fundamentele limbajului C#3. Programare OO in C#4. Reflection5. Multi-threading6. Streams7. Sockets8. Remoting9. Programare DB ADO .NET10. GUI – Graphical User Interface11. Web Programing & XML12. Interop & Enterprise Service

1. Concepte Programare OrientataObiect. Comparatie C++ vs C#

2. Clase, obiecte si namespace 3. Compozitie/Derivare/Interfete4. Observer/Delegate & Windows

Forms 5. Win Forms, Controale de baza,

Gestiune eveneimente Mouse + Tastatura

6. Meniuri, Controale de tip bara, Validare Controale, Fisiere

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

4© 2010 Catalin Boja

Page 4: Curs CS Catalin Boja

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”, O’Reilly 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.ro5© 2010 Catalin Boja

Page 5: Curs CS 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

6© 2010 Catalin Boja

Page 6: Curs CS Catalin Boja

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

CLS - Common Language Specifications

Data si XML

Base Class Library

CLR - Common Language Runtime(debug, exception, type checking, JIT compiler,

garbage collector)

Web Services / Web Forms Windows Forms

7© 2010 Catalin Boja

Page 7: Curs CS Catalin Boja

SursaC# / 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

8© 2010 Catalin Boja

Page 8: Curs CS Catalin Boja

using System;class Hello {

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

}}

cshello.cs Nu sunt permise functii/variabile globale

Metoda Main nu trebuie apelata de un obiect

Start -> Visual Studio 2005 -> Tools -> Command PromptCompilare cu csc.exe cshello.cs

9© 2010 Catalin Boja

Page 9: Curs CS Catalin Boja

Imports SystemModule Hello

Sub Main()Console.WriteLine("Hello World.NET")

End SubEnd Module

vbhello.vb

Start -> Visual Studio 2005 -> Tools -> Command PromptCompilare cu vbc.exe vbhello.vb

10© 2010 Catalin Boja

Page 10: Curs CS Catalin Boja

#using <mscorlib.dll>using namespace System;void main(){

Console::WriteLine(S"Hello World.NET");}

mcpphello.cpp

Start -> Visual Studio 2005 -> Tools -> Command PromptCompilare cu cl.exe mcpphello.cpp

11© 2010 Catalin Boja

Page 11: Curs CS Catalin Boja

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

jshello.js

Start -> Visual Studio 2005 -> Tools -> Command PromptCompilare cu jsc.exe jshello.js

12© 2010 Catalin Boja

Page 12: Curs CS Catalin Boja

.assembly Hello{ }

.method public static void run() il managed{.entrypointldstr "Hello World.NET"call void [mscorlib]System.Console::WriteLine(class System.String)ret

}

ilhello.il

Start -> Visual Studio 2005 -> Tools -> Command PromptCompilare cu ilasm.exe ilhello.il

13© 2010 Catalin Boja

Page 13: Curs CS Catalin Boja

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 MathImports System

Module MathTestSub Main()

Dim vb1 As Double = 20Dim 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 SubEnd Module

vbc /r:math.dll mathtest.vb

csc /t:library math.cs

math.dll

mathtest.exe

C#

VB

14© 2010 Catalin Boja

Page 14: Curs CS Catalin Boja

class Abonat{ … };void main(){

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"}

C++using System;public class Abonat{

…public static void Main(){

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"); }}

XC#

15© 2010 Catalin Boja

Page 15: Curs CS Catalin Boja

• obiecte gestionate prin valoaresi referinte;• o clasa poate contine atributedinamice gestionate de pointeri• destructorul are rol de a dezalocaspatiul ocupat si pentru a evitamemory leak-uri• necesitate definire operator= siconstructor copiere pentru a evitacopierea implicita•string gestionat prin char*

• obiecte gestionate doar prinreferinte• pointerii din C++ definiti cu * suntconsiderati unsafe si sunt indicatidoar pentru lucru cu COM-uri• dezalocarea memorie se face decatre garbage collector-ul din CRL;destructorul are roluri speciale;• operatorul = nu se maisupraincarca;• operatorul = implicit realizeazashallow copy;• constructorul de copiere necesarpentru a face deep copy;• un nou tip valoric – string;

16© 2010 Catalin Boja

Page 16: Curs CS Catalin Boja

a. Tipuri de baza

b. Tipuri introduse de struct si enum

1. Tipuri valorice

2. Tipuri referentiale – introduse prin class / interface / delegate

17© 2010 Catalin Boja

Page 17: Curs CS Catalin Boja

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

18© 2010 Catalin Boja

Page 18: Curs CS Catalin Boja

int i = 123;object Obiect = i

int j = (int) Obiect;

STIVA HEAP

4 octeti : 123referinta

4 octeti : 123

4 octeti: 123

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

class BoxUnbox{

static void Main(){

}}

Int32 I32 = i referinta ? octeti: 123

19© 2010 Catalin Boja

Page 19: Curs CS Catalin Boja

•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

20© 2010 Catalin Boja

Page 20: Curs CS Catalin Boja

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

STIVA HEAP

referinta nullreferintareferintareferinta

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

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

referinta nullreferinta

referinta

16 octeti: null, null, null, null

16 octeti: @ @ @ @

Pers p1Pers p1Pers p1

Pers p1

Pers p1; referinta null

21© 2010 Catalin Boja

Page 21: Curs CS Catalin Boja

22© 2010 Catalin Boja

• SINTAXA: tip_data [ , ] nume_masiv;

int [,] matrice; //matrice tabloumatrice = 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];

Page 22: Curs CS Catalin Boja

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

23© 2010 Catalin Boja

Page 23: Curs CS Catalin Boja

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

24© 2010 Catalin Boja

Page 24: Curs CS Catalin Boja

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

25© 2010 Catalin Boja

Page 25: Curs CS Catalin Boja

Mecanisme try-catch-finally Pointeri/Referinte – parametrii pentru funcţii

Definire clase Proprietati Shallow copy vs Deep copy

26© 2010 Catalin Boja

Page 26: Curs CS Catalin Boja

exceptie – situatie in care prelucrarea anumitordate de intrare nu este gestionata sau nu esteposibila (ex: impartire la 0, citire in afara unuimasiv) (ecuatie1.cs)

permite gestiunea situatiilor exceptionale careconduc la terminarea imediata a programului

necesar pentru a realiza programe robuste sifiabile

implementat prin try, catch si throw permite gestiunea erorilor de sistem si a

erorilor definite de programator

27© 2010 Catalin Boja

Page 27: Curs CS Catalin Boja

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}

28© 2010 Catalin Boja

Page 28: Curs CS Catalin Boja

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 instructiuniblocul catch( tip_exceptie exceptie) gestioneaza o exceptie de tipul anuntat tip_exceptie reprezinta instanta unei clase

derivate din Exception (ArithmeticException, DivideByZeroException)

29© 2010 Catalin Boja

Page 29: Curs CS Catalin Boja

blocul catch(Exception e) gestioneaza toate tipurile de exceptiiblocul 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;

30© 2010 Catalin Boja

Page 30: Curs CS Catalin Boja

Blocurile catch sunt definite in ordine crescatoare a generalitatii exceptiilor tratate

try { … }catch(exceptie_tip_1){…}catch(exceptie_tip_2){…}…catch(Exception e){…}

31© 2010 Catalin Boja

Page 31: Curs CS Catalin Boja

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)

32© 2010 Catalin Boja

Page 32: Curs CS Catalin Boja

Exceptie definita de programator:public class ExceptieDiscriminant : Exception{

public ExceptieDiscriminant(string Message): base(Message)

{}

}

33© 2010 Catalin Boja

Page 33: Curs CS Catalin Boja

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

34© 2010 Catalin Boja

Page 34: Curs CS Catalin Boja

transferul parametrilor prin valoare (interschimb1.cs)

public static void Interschimb(int p, int q){int t = p;p = q;q = t;

}

35© 2010 Catalin Boja

Page 35: Curs CS Catalin Boja

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;

}

36© 2010 Catalin Boja

Page 36: Curs CS Catalin Boja

transferul parametrilor prin referinte (interschimb3.cs)

referintele sunt definite prin◦ ref – parametrii de intrare/iesire◦ out – parametrii de iesire

37© 2010 Catalin Boja

Page 37: Curs CS Catalin Boja

transferul parametrilor prin referinte (interschimb3.cs)

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

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

}

38© 2010 Catalin Boja

Page 38: Curs CS Catalin Boja

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;

}

39© 2010 Catalin Boja

Page 39: Curs CS Catalin Boja

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;

40© 2010 Catalin Boja

Page 40: Curs CS Catalin Boja

Concepte legate de POO in C#:

In C# toate obiectele sunt gestionate prin

referinte.41© 2010 Catalin Boja

Page 41: Curs CS Catalin Boja

Sintaxa definire:[atribute] [tip_acces] class Nume_Clasa

[:clasa_baza]{

tip_acces atribut1;tip_acces atribut2;…tip_acces functie membra1;

};

42© 2010 Catalin Boja

Page 42: Curs CS Catalin Boja

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

assembly protected internal

43© 2010 Catalin Boja

Page 43: Curs CS Catalin Boja

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;

}

44© 2010 Catalin Boja

Page 44: Curs CS Catalin Boja

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

45© 2010 Catalin Boja

Page 45: Curs CS Catalin Boja

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++

46© 2010 Catalin Boja

Page 46: Curs CS Catalin Boja

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

47© 2010 Catalin Boja

Page 47: Curs CS Catalin Boja

atribute statice (clase1.cs):sintaxa:

class Test{public static int atribut_1 = 10;public static readonly int atribut_2;

}

48© 2010 Catalin Boja

Page 48: Curs CS Catalin Boja

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;

49© 2010 Catalin Boja

Page 49: Curs CS Catalin Boja

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;

50© 2010 Catalin Boja

Page 50: Curs CS Catalin Boja

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;

51© 2010 Catalin Boja

Page 51: Curs CS Catalin Boja

functii constructor: rol principal: alocarea spatiului aferent unui

obiect; rol secundar: initializarea atributelor

obiectului; tipuri:

implicit cu parametrii

52© 2010 Catalin Boja

Page 52: Curs CS Catalin Boja

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;

53© 2010 Catalin Boja

Page 53: Curs CS Catalin Boja

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)}

54© 2010 Catalin Boja

Page 54: Curs CS Catalin Boja

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( ){…}};

55© 2010 Catalin Boja

Page 55: Curs CS Catalin Boja

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;

56© 2010 Catalin Boja

Page 56: Curs CS Catalin Boja

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)

57© 2010 Catalin Boja

Page 57: Curs CS Catalin Boja

functii destructor: sintaxa:

class Nume_clasa {~Nume_clasa( ){…}

}; apel implicit:

public static void Main () {Nume_clasa obiect_1 = new Nume_clasa();}

58© 2010 Catalin Boja

Page 58: Curs CS Catalin Boja

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++

59© 2010 Catalin Boja

Page 59: Curs CS Catalin Boja

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

60© 2010 Catalin Boja

Page 60: Curs CS Catalin Boja

operator =

Limbajul C# NU permite supraincarcarea operatorului =

61© 2010 Catalin Boja

Page 61: Curs CS Catalin Boja

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

62© 2010 Catalin Boja

Page 62: Curs CS Catalin Boja

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;}

63© 2010 Catalin Boja

Page 63: Curs CS Catalin Boja

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;

64© 2010 Catalin Boja

Page 64: Curs CS Catalin Boja

au forma unei “structuri de date” ce contine 2 metode

sintaxa:public tip_atribut nume_proprietate{

get{ return … }set{ }

}

65© 2010 Catalin Boja

Page 65: Curs CS Catalin Boja

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;

66© 2010 Catalin Boja

Page 66: Curs CS Catalin Boja

public class Produs{

private double _cost; //proprietate privataprivate float _profit; //proprietate privataprivate static int nrproduse; //proprietate statica

}

//proprietate pentru _profit

public float Profit {get {return _profit;}set {if(value>0) _profit=value;}

}

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

public float get_Profit() { return _profit;}

public void set_Profit( float value){if(value>0) _profit=value;

}

Compilatorul genereaza automat

67© 2010 Catalin Boja

Page 67: Curs CS Catalin Boja

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

68© 2010 Catalin Boja

Page 68: Curs CS Catalin Boja

Implementare metoda Clone◦ definire metoda proprie◦ supradefinire metoda Clone din ICloneable

69© 2010 Catalin Boja

Page 69: Curs CS Catalin Boja

Auto a1;Auto a2 = new Auto();

a1 = a2

STIVA HEAP

referinta nullreferinta

referintareferinta

X octeti: valori

X octeti: valori

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

X octeti: valori

a1 = (Auto)a2.Clone() referintareferinta X octeti: valori

X octeti: valori

Shallow copy

Deep copy

70© 2010 Catalin Boja

Page 70: Curs CS Catalin Boja

Supraincarcare operatori / conversii implicite/explicite

Derivare/mostenire Interfete / clase abstracte Mecanism virtualizare (virtual ->

override/new) Supraincarcare indexer + suport foreach

71© 2010 Catalin Boja

Page 71: Curs CS Catalin Boja

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;}

double suma(int a, int b){

return a+b;}

eroare compilare

situatie ambigua

72© 2010 Catalin Boja

Page 72: Curs CS Catalin Boja

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

class Test{…

};void main(){

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

}

Test.operator+(t1,t2)interpretare(supraincarcare prin

functie statica)

73© 2010 Catalin Boja

Page 73: Curs CS Catalin Boja

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 +

74© 2010 Catalin Boja

Page 74: Curs CS Catalin Boja

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.cs75© 2010 Catalin Boja

Page 75: Curs CS Catalin Boja

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.cs76© 2010 Catalin Boja

Page 76: Curs CS Catalin Boja

supraincarcare operatori unari ++ si --:

class Test{…public static Test operator++ (Test t ) {

//prelucrarireturn t;

}};

77© 2010 Catalin Boja

Page 77: Curs CS Catalin Boja

supraincarcare operatori unari ++ si --:

class Test{…}

Test t1 = new Test();Test t2 = t1++;Test t3 = ++t1;

referinta

referinta

X octeti: valori

referinta

++t1 sau t1++

78© 2010 Catalin Boja

Page 78: Curs CS Catalin Boja

supraincarcare operatori binari +, -, *, /: au intotdeauna 2 parametri; comutativitatea operatiei matematice nu are

sens in C# (trebuie definita explicit) prin functie statica publica;

Exemplu: numerar.cs79© 2010 Catalin Boja

Page 79: Curs CS Catalin Boja

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.cs80© 2010 Catalin Boja

Page 80: Curs CS Catalin Boja

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 implicitint vb2 = (int) t; //cast explicit

}

81© 2010 Catalin Boja

Page 81: Curs CS Catalin Boja

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.cs82© 2010 Catalin Boja

Page 82: Curs CS Catalin Boja

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;

}}

83© 2010 Catalin Boja

Page 83: Curs CS Catalin Boja

public class ProdusSpecial : Produs{ private float _discount;

…}

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

-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;}

84© 2010 Catalin Boja

Page 84: Curs CS Catalin Boja

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

85© 2010 Catalin Boja

Page 85: Curs CS Catalin Boja

fiecare constructor este responsabil strict de zona clasei pe care o reprezinta

class Baza{int atribut1;int atribut2;

};class Derivat : Baza{

int atribut_nou;};

mostenire

constructor Baza

constructor Baza

Derivat

86© 2010 Catalin Boja

Page 86: Curs CS Catalin Boja

constructie obiect derivat = CONSTRUCTOR BAZA + CONSTRUCTOR DERIVAT

class Baza{Baza(){…}Baza(lista parametri){…}

};

class Derivat : Baza{Derivat(){…};SAUDerivat() : base (lista parametri) {…}

};

apel implicit Baza()

apel explicit:base(lista parametri)

87© 2010 Catalin Boja

Page 87: Curs CS Catalin Boja

UPCASTING – este permisa transformarea implicita a obiectelor (referinte in C#) derivat in obiecte (referinte) de tip baza

class Baza{…

};

class Derivat : Baza{…

};Derivat

Baza

X

88© 2010 Catalin Boja

Page 88: Curs CS Catalin Boja

UPCASTING

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

Baza b2 = d1;}

referinta Derivat

referinta Baza

X octeti: valori

referinta Baza

null

89© 2010 Catalin Boja

Page 89: Curs CS Catalin Boja

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

class Baza{int Metoda1(int a){…}

};class Derivat : Baza{

int atribut_nou;int Metoda1(int a){…}int Metoda2(int a){ base.Metoda1(a);}

};

apel explicit metoda baza

90© 2010 Catalin Boja

Page 90: Curs CS Catalin Boja

UPCASTING + redefinire metode (nevirtuale)

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

Baza b1 = d1;

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

}

forma metodei din Baza;

91© 2010 Catalin Boja

Page 91: Curs CS Catalin Boja

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){…}

};92© 2010 Catalin Boja

Page 92: Curs CS Catalin Boja

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

93© 2010 Catalin Boja

Page 93: Curs CS Catalin Boja

public class Produs{…

public virtual double PretProducator(){return _cost*(1+_profit/100);}

}

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

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-bindingProdus RP=ps;Console.WriteLine(" Pretul de producator al produsului special este {0}", RP.PretProducator());

94© 2010 Catalin Boja

Page 94: Curs CS Catalin Boja

public class Produs{…

public double PretProducator(){return _cost*(1+_profit/100);}

}

-ascunderea unei metode din clasa derivata (evitare late-binding) se facedeclarand metoda new (nu este obligatoriu ca metoda din clasa de baza sa fieanuntata virtual)

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-bindingProdus RP=ps;Console.WriteLine(" Pretul de producator al produsului special este {0}", RP.PretProducator());

95© 2010 Catalin Boja

Page 95: Curs CS Catalin Boja

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

96© 2010 Catalin Boja

Page 96: Curs CS Catalin Boja

Mostenire vs Includere

class Vehicol{…

};

class Automobil : public Vehicol{…

};

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

97© 2010 Catalin Boja

Page 97: Curs CS Catalin Boja

Mostenire vs Includere

class Motor{…

};

class Automobil{Motor motor;

};

se implementeaza cand intre clasa principala si cea inclusa exista o relatie has a;

98© 2010 Catalin Boja

Page 98: Curs CS Catalin Boja

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();}

-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

99© 2010 Catalin Boja

Page 99: Curs CS Catalin Boja

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;100© 2010 Catalin Boja

Page 100: Curs CS Catalin Boja

functii VIRTUALE PURE - ABSTRACTE:abstract class Baza_abstracta{public abstract int Metoda1(int a) ;};

class Derivat : Baza{pubic override int Metoda1(int a){…}};

101© 2010 Catalin Boja

Page 101: Curs CS Catalin Boja

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;

102© 2010 Catalin Boja

Page 102: Curs CS Catalin Boja

CLASE abstracte: NU este permisa instantierea claselor

abstracte; utilizate ca suport pentru derivareabstract class Baza_abstracta{

int atribut1;public abstract int Metoda1(int a);

};void main(){Baza_abstracta ba1;Baza_abstracta ba1 = new Baza_abstracta;}

103© 2010 Catalin Boja

Page 103: Curs CS Catalin Boja

CLASE sealed (inchise): NU este permisa derivarea claselor sealed;

sealed class Baza {int atribut1;…

};class Derivat : Baza { }

104© 2010 Catalin Boja

Page 104: Curs CS Catalin Boja

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)

105© 2010 Catalin Boja

Page 105: Curs CS Catalin Boja

INTERFETE:

interface class IOperatii {void Operatie1( );void Operatie2( );

};class Baza : IOperatii {

public void Operatie1() {…}public void Operatie2() {…}

}

supradefinire metode interfata

106© 2010 Catalin Boja

Page 106: Curs CS Catalin Boja

Clase abstracte contin metode

abstracte + atribute + metode neabstracte

o clasa poate deriva doar o clasa de baza (abstracta sau nu)

poate fi utilizata ca reference type

Interfete contin doar metode

abstracte o clasa poate deriva

mai multe interfete poate fi utilizata ca

reference type

VS

107© 2010 Catalin Boja

Page 107: Curs CS Catalin Boja

Model2D

Dreptunghi Cerc

Patrat

IMasurabil

virtual double Perimetru()=0;virtual double Arie()=0;

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

Punctint X;int Y;

char * DenumireModel 108© 2010 Catalin Boja

Page 108: Curs CS Catalin Boja

Arrays, Collections Clase speciale (ArrayList / Stack / Queue /

HashTable) Exemplu CallBack (amintire C++ cu

pointeri la functii) Delegat Eveniment Forms

109© 2010 Catalin Boja

Page 109: Curs CS Catalin Boja

Collection Interfaces IEnumerable ICollection IComparer – IComparable

asigura un standard in definirea de clase tip colectie

110© 2010 Catalin Boja

Page 110: Curs CS Catalin Boja

IEnumerable ofera suport pentru operatorul foreachforeach(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

111© 2010 Catalin Boja

Page 111: Curs CS Catalin Boja

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.cs112© 2010 Catalin Boja

Page 112: Curs CS Catalin Boja

Collections: Array ArrayList Queue Stack HashTable

ArrayProdus.cs

113© 2010 Catalin Boja

Page 113: Curs CS Catalin Boja

entitate 1

pointer functiedate

entitate 2

functie 1functie 2

pointer functiedate

functie 1functie 2

initializare pointer functie

CALL functie

functie 1functie 2

CALLBACK

REZULTAT114© 2010 Catalin Boja

Page 114: Curs CS Catalin Boja

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 functiinume_referinta pFunctie;

115© 2010 Catalin Boja

Page 115: Curs CS Catalin Boja

EVENT reprezinta un vector/lista de delegati

(pointeri de functii)event tip_delegate nume_event;

faciliteaza executia tututor functiilor printr-un singur apelnume_event([parametrii]);

Exemplu: DelegatC++.cpp si DelegatCS.cs116© 2010 Catalin Boja

Page 116: Curs CS Catalin Boja

EVENT suporta operatorii aritmetici += si -= pentru

adaugare/stergere de delegati din eveniment

eveniment += new TipDelegate(metoda)

Exemplu: DelegatC++.cpp si DelegatCS.cs117© 2010 Catalin Boja

Page 117: Curs CS Catalin Boja

- 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)

event sender event receiver

lansare (raise) eventprelucrare (handle)

event

- in modelul de tratare a evenimentului din .NET, obiectul care lanseazaevenimentul nu stie ce obiect sau ce metoda va primi si va gestiona (handle); dinacest motiv este nevoie de un element intermediar intre sursa si detinatie – delegat(pointer la functie)

Exemplu: DelegatEvenimen1.cs Fanfara.cs118© 2010 Catalin Boja

Page 118: Curs CS Catalin Boja

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

event sender – lanseaza evenimentulEx: class FireAlarm{ }

delegat – defineste evenimentulEx: public delegate void FireEventHandler(object

sender, FireEventArgs fe);event data – parametrii

Ex: class FireEventArgs: EventArgs

119© 2010 Catalin Boja

Page 119: Curs CS Catalin Boja

FireAlarm myFireAlarm = new FireAlarm();

myFireAlarm FireEventFireAlarm null

HEAPSTIVA

COD

120© 2010 Catalin Boja

Page 120: Curs CS Catalin Boja

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

myFireAlarm FireEventFireAlarm

HEAPSTIVA

COD

myFireHandler -FireHandlerClass

nu are atribute

prin constructor aboneaza la myFireAlarm.FireEventpropria metoda ExtinguishFireFireHandlerClass. ExtinguishFire(object

sender, FireEventArgs fe)Exemplu: DelegatEvenimentFire.cs

121© 2010 Catalin Boja

Page 121: Curs CS Catalin Boja

using System;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());}

}

obiect derivat din Form

caracteristici gestionate prin proprietati

csc/t:winexe /r:System.dll /r:System.Drawing.dll /r:System.Windows.Forms.dll Formular.cs122© 2010 Catalin Boja

Page 122: Curs CS Catalin Boja

using System.Windows.Forms;

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);

Controls.Add(bnclick);}private void bnclick_Click(object sender, EventArgs ev){…}}

obiect de tip Button

abonare la event-ul Click al clasei Button

Adaugare control la colectia de controale a formularului

metoda handler event Click

123© 2010 Catalin Boja