Download - Suport Curs de c#
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, reprezintao abordare superficiala.
SUPORT CURS
Lect. dr. Cătălin [email protected] CSIE, sala 2315
ACADEMIA DE STUDII ECONOMICEFacultatea de Cibernetică, Statistică şi Informatică Economică
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
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
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
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
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
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
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
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
#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
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
.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
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
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
• 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
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
Valori default in C#:◦ numeric (int, long, double, …) -> 0◦ bool -> false◦ char -> ’\0’◦ enum -> 0◦ reference -> null
18© 2010 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
•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
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
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];
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
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
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
Mecanisme try-catch-finally Pointeri/Referinte – parametrii pentru funcţii
Definire clase Proprietati Shallow copy vs Deep copy
26© 2010 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
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
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
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
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
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
Exceptie definita de programator:public class ExceptieDiscriminant : Exception{
public ExceptieDiscriminant(string Message): base(Message)
{}
}
33© 2010 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
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
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
transferul parametrilor prin referinte (interschimb3.cs)
referintele sunt definite prin◦ ref – parametrii de intrare/iesire◦ out – parametrii de iesire
37© 2010 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
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
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
Concepte legate de POO in C#:
In C# toate obiectele sunt gestionate prin
referinte.41© 2010 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
tip_acces: public – accesibile private – neaccesibile protected – accesibile claselor derivate internal – accesibile claselor din acelasi
assembly protected internal
43© 2010 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
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
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
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
atribute statice (clase1.cs):sintaxa:
class Test{public static int atribut_1 = 10;public static readonly int atribut_2;
}
48© 2010 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
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
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
functii constructor: rol principal: alocarea spatiului aferent unui
obiect; rol secundar: initializarea atributelor
obiectului; tipuri:
implicit cu parametrii
52© 2010 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
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
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
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
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
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
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
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
operator =
Limbajul C# NU permite supraincarcarea operatorului =
61© 2010 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
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
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
au forma unei “structuri de date” ce contine 2 metode
sintaxa:public tip_atribut nume_proprietate{
get{ return … }set{ }
}
65© 2010 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
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
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
Implementare metoda Clone◦ definire metoda proprie◦ supradefinire metoda Clone din ICloneable
69© 2010 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
Supraincarcare operatori / conversii implicite/explicite
Derivare/mostenire Interfete / clase abstracte Mecanism virtualizare (virtual ->
override/new) Supraincarcare indexer + suport foreach
71© 2010 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
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
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
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
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
supraincarcare operatori unari ++ si --:
class Test{…public static Test operator++ (Test t ) {
//prelucrarireturn t;
}};
77© 2010 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
CLASE sealed (inchise): NU este permisa derivarea claselor sealed;
sealed class Baza {int atribut1;…
};class Derivat : Baza { }
104© 2010 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
INTERFETE:
interface class IOperatii {void Operatie1( );void Operatie2( );
};class Baza : IOperatii {
public void Operatie1() {…}public void Operatie2() {…}
}
supradefinire metode interfata
106© 2010 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
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
Arrays, Collections Clase speciale (ArrayList / Stack / Queue /
HashTable) Exemplu CallBack (amintire C++ cu
pointeri la functii) Delegat Eveniment Forms
109© 2010 Catalin Boja
Collection Interfaces IEnumerable ICollection IComparer – IComparable
asigura un standard in definirea de clase tip colectie
110© 2010 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
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
Collections: Array ArrayList Queue Stack HashTable
ArrayProdus.cs
113© 2010 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
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
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
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
- 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
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
FireAlarm myFireAlarm = new FireAlarm();
myFireAlarm FireEventFireAlarm null
HEAPSTIVA
COD
120© 2010 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
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
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