Sunteți pe pagina 1din 70

1

Cercul de programare .NET ADF


Common
Language Assemblies
Infrastructure (CLI)

.NET

Base Class Library


Metadata
(BCL)

2
 Cea mai importanta
componenta a
arhitecturii .NET
 Ofera o plaftorma de
dezvoltare de aplicatii
aproape independenta
de limbaj

3
 Contin codul IL, care pentru Windows insemna EXE si DLL-uri.
 Assembly-urile sunt unitatile de dezvoltare, versionare si
securitate .NET.
 Pot fi formate din unul sau mai multe fisiere, dar unul trebuie sa
contina manifestul (metadata) assembly-ului.
 Numele complet al assembly-ului contine:
 un text
 versiunea
 cultura
 public key-ul: un sir de caractere generat cand assembly-ul este creat,
este o valorea care identifica in mod unic numere si continului
assembly-ului, precum si o chere privata cunoscuta numai de creatorul
assembly-ului. 2 assembly-uri cu acelasi public key sunt identice.

4
 Informatii despre assembly:
 tipuri
 variabile
 metode

5
 cunoscuta si sub numele FCL (Framework Class
Library)
 librarie cu tipuri disponibile toturor limbajelor ce
folosesc .net framework.
 contine clase ce incapsuleaza metode pentru:
 lucrul cu fisiere
 interactiune cu baze de date
 etc.
6
Contin data direct in ele.
Sunt memorate pe stiva.
Valori

Tipuri
de date

Derivate din Contin adresa unor date (aka


System.Object Tipruri pointeri) pe stiva. Data e tinuta in o
referinta zona memorie numita heap.
Memoria e curatata prin Garbage
Collector. (!nu trebuie dealocare)

7
 Predefinite
 System.Int32 (int)
 System.Double (double)
 System.Byte (byte)
 System.Char (char)
 System.Boolean (bool)
 System.DateTime
 System.IntPtr – un tip a carui marime depinde de
platforma (adica de cantitatea de memorie adresabila de
platforma)

8
 Definite de utilizator
 Structuri: composite din valori, metode, proprietati
ex: Point
Point A = new Point(1,2);

!CONTIN DATA DIRECT

9
struct Punct
{
int x;
int y;

public Punct(int x, int y)


{
this.x = x; this.y= y;
}

public int getX()


{
return x;
}

public int Y
{
get {return y;}
set {y=value;}
}
}

10
 Enumerari: grupari de simboluri cu o legatura
intre ele si cu valori fixe
 enum Luna : int {Ianuarie, Februarie};

11
 Contin adresa datei, nu data propriuzisa deci prin
asignarea unei referinte la alta NU se copie data,
se copie referinta, deci ambele referinte vor
pointa la acceasi zona de memorie.

12
struct Punct class Punct
{ {
int x; int x;
int y; int y;

public Punct(int x, int y) public Punct(int x, int y)


{ {
this.x = x; this.y= y; this.x = x; this.y= y;
} }

public int getX() public int getX()


{ {
return x; return x;
} }

public int Y public int Y


{ {
get {return y;} get {return y;}
set {y=value;} set {y=value;}
} }
} }

13
 Punct punct1 = new Punct(1,2);
Punct punct2 = punct1;
Console.WriteLine(punct1.getX() + “ “ + punct1.Y);
punct2.Y = 3;
Console.WriteLine(punct2.getX() + “ “ + punct2Y);
Output:
12
13
 Daca schimbam struct cu class
Output:
13
13

14
 Cateva tipuri din Framework
 System.Object
 System.String
 System.Text.StringBuilder
 System.Array
 System.IO.Stream
 System.Exception

15
 String
string nume = “Ionel”;

nume += “Popescu”;

-> nume = “Ionel Popescu”;


! Exista operatori +, ==, !=, =
! Se aloca spatiu nou din memorie si se creaza un nou
string copie a nume si “Popescu”

16
 System.Text.StringBuilder
StringBuilder sb = new StringBuilder(30);
sb.Append(“Ionel”);
sb.Append(“Popescu”);

!Nu exista operatori

17
 Array
int[] ar = {3 ,1, 2};
string[] siruri = {“ana”, “are”, “mere”};
Point[] puncte = new Point[100];

Sortare: Array.Sort(ar); Array.Sort(siruri);

18
 Stream-uri
 La capitolul urmator .

19
 Exceptii: evenimente care intrerup functionarea
normala a programului.
!Nu trebuie sa opreasca functionarea normala a
programului => trebuie prinse si tratate
 Prinderea si tratarea : try – catch – finally

20
StreamReader sr = new StreamReader(“text.txt”);
try
{
Console.WriteLine(sr.ReadToEnd());
}
catch (Exception ex)
{
Console.WriteLine(“Eroare:”+ex.Message);
}
finally
{
sr.close
}

21
Clase

OOP

Mostenire Polimorfism

22
 Clasa este o “macheta” sau un prototip dupa care
sunt create obiecte. Ea defineste caracteristicile
abstracte ale unui obiect(cum arata, ce culoare
are) si functiile pe care le are aceasta (ce gust
are).
 Obiectul este deci o instantiere a unei clase.
 Clasa in c# contine variabile, metode si
proprietati.
23
 Proprietatile ofera o modalitate usoara si flexibila de acces la date private clasei,
folosite pentru a le citii scrie sau modifica.

class MyClass
{
private int x;
public int X
{
get
{
return x;
}
set
{
x = value;
}
}
} 24
Derivare
DVD

Hard Unitati de stocare


Disk la calculatoare CDROM

USB
Memory
Stick

25
 UnitateDeStocare
 Capacitate
 Viteza
 Culoare
 Modalitate de interfatare cu calculatorul (SATA, PATA)
 Rezistenta la impact 

26
 DVD
 Numar de layere (dual layer, single layer)
 +R/-R

 USB Memory Stick


 Numar de scrieri
 Tipul memoriei interne

27
 Interfete: definesc un set comun de membri pe care toate clasele care folosesc interfata trebuie sa le
implementeze. Mai clar: un grup de metode fara implementare (doar prototip)
 Ex:
interface IMessage
{
bool Send();
string Mesaj{get; set;}
}
class SMS:IMessage
{
string mesaj;
public bool Send()
{
return true;
}

public string Mesaj


{
get{return mesaj;}
set{mesaj = value;}
}
} 28
 In C#:
 Toate obiectele mostenesc System.Object
 Ex : ToString()
 la clasa Punct
 public override string ToString()
{
return x.ToString() + “ “ + y.ToString();
}
 Ex : System.Exception: mostenit de toate exceptiile
public class ExceptiaMea: System.Exception
{
public override string Message
{
get { return “Aceasta este exceptia mea”;}
}
}

29
 Clase abstracte: clase asemanatoare cu
interfetele, dar pot contine implementare la
metode.
 La fel ca si interfetele nu pot fi instantizate.

30
 Inseamna capacitatea de a intelege sau folosii in
mod diferit acelasi obiect in functie de contextul
in care ne aflam.
 In practica inseamna ca putem avea metode cu
acelasi nume care fac lucruri diferite. 

31
 Metodele, proprietatile si clasele in C# pot avea mai
multi modificatori de acces.
 Clasele
 public
 internal -> interne altor clase, accesibile numai in acelasi
assembly
 Metode si proprietati
 public
 private
 protected
 internal -> accesibile numai in acelasi assembly
32
 Clase partiale: clase definite in mai multe fisiere:
ex form.Designer. Puneti partial
 Clase generice: definim tipul lasand unele detalii
nespecificate.
Ex: List<int> = new List<int>();
Motive pt folosit generice: Se reduc erorile si se
creste performanta. Vom vorbi la un capitol
urmator mai in detaliu despre generice.
33
 Functii delegate: Clasa care contine o referinta la o metoda. Mai clar un pointer la functie in C++, dar este
type safe.

public delegate int functieComparare (object x, object y);


// == int (*functieComparare)(object x, object y);

public int myCmpFunc(object x, object y) { ... }

public void sort()


{
functieComparare foo = new functieComparare (myCmpFunc);
if (foo(x, y) < 0)
System.Console.WriteLine(“X mai mic decat Y");
else
if (foo(x, y) = 0)
System.Console.WriteLine(“X este egal cu Y");
else
System.Console.WriteLine(“X mai mare decat Y");
}

34
 Evenimente: un mesaj trimis de un obiect pentru a
semnala o actiune. Ex: apasarea butonului dreapta la
mouse este un eveniment.
 Obiectul care declanseaza evenimentul: event
sender
 Obiectul care receptioneaza si trateaza evenimentul:
event receiver
 In comunicarea prin evenimente sender-ul nu stie
care este metoda care va receptiona si trata
evenimentul (pot fi una, mai multe si se pot schimba
aleator). Aici intervin functiile delegate.
35
 Raspunderea la un eveniment:
private void button1_Click(object sender, EventArgs e)
{
//cod
}

this.button1.Click += new System.EventHandler(this.button1_Click);


 Ridicarea unui eveniment:
 Pas1: Functia delegata:
public delegate void MyEventHandler(object sender, EventArgs e);
 Pas2: Evenimentul:
public event MyEventHandler MyEvent;
 Pas3: Legare si invocare
MyEventHandler handler = MyEvent;
EventArgs e = new EventArgs();
if (handler!=null)
handler(this,e);
 Putem deriva clasa EventArgs
36
 Atribute: Descriu o metoda, tip sau proprietate in o
modalitate care poate fi verificata prin Reflection.
 Exemple de folosire:
 declara capabilitati ale clasei
 descriu assembly-ul (nume, titlu)
 Ex:
[assembly: AssemblyTitle(“.NET ADF Test”)]
[assembly:
FileIOPermission(SecurityAction.RequestMinimum,
Read = @”C:\boot.ini”)]
37
 TypeForwarding: Permite mutarea unui tip din un
assembly in alt assembly.

versiunea 2
versiunea 1

tip1 tip1 v2
tip2 tip2 v2
38
 double i=1.2;
 int j = i;
 C# impiedica in mod normal conversiile prin care
se pierd date
 j = (int)i; -> OK -> se pierd date == narrowing
conversion => este nevoie de cast
 i = j; -> OK -> nu se pierd date == widening
conversion
39
 type.ToString();
transforma din orice in string
 type.Parse();
Ex: int nr = int.Parse(“12121”);
transforma din string in tip
 type.TryParse() , type.TryParseExact()
verifica daca se poate face conversia
 System.Convert
Conversii intre tipuri care implementeaza IConvertible

40
Valoare Valoare

Referinta Referinta

Boxing Unboxing

41
 Pentru implementare de conversi custom
 cast
 supraincarcam ToString, Parse
 implementam IConvertible
 implementam o clasa de tip TypeConverter (nu trebuie
la examenul de certificare  )

42
 Ex:
class Complex : IConvertible
{
double x;
double y;

public Complex(double x, double y)


{
this.x = x;
this.y = y;
}

public bool IConvertible.ToBoolean(IFormatProvider provider)


{
if( (x != 0.0) || (y != 0.0) )
return true;
else
return false;
}
….
}

Folosire:
Complex numar = new Complex(1,2);
bool notIsZero = Convert.ToBoolean(numar);
43
2
FileInfo

FIleSystemInfo

DirectoryInfo

45
Attributes

Full Name
FileSystemInfo
Name

Exists

46
FileInfo

Open (OpenRead,
Directory IsReadOnly DirectoryName CopyTo OpenWrite, Create
OpenText)

47
 ex:
FileInfo file = new FileInfo(@”text.txt”);
file.CopyTo(“ion.txt”);

48
DirectoryInfo

Parent Create CreateSubdirectory GetDirectories GetFiles

49
 ex:
aplicatia dir  simplificita:

DirectoryInfo director = new DirectoruInfo(@“C:\”);


foreach (FileInfo file in director.GetFiles())
{
Console.WriteLine(file.Name);
}
50
 DriveInfo: informatii despre drive.
 Proprietati: AvailableFreeSpace, DriveFormat, …
 Metode: GetDrives() (statica)
 Enumerarea DriveType: CDRom, Fixed, Network,
Ram, Removable, Unknow, NoRootDirectory

51
 Path: manipularea unui path (deci si a unui nume
de fisier)
 Ex: schimbarea extensiei.
 Metode: ChangeExtension, GetExtension,
GetFileName … (toate statice)

52
 Clasa FileSystemWatcher: monitorizeaza
directoarele
 Proprietati: EnableRasingEvents, Filter,
IncludeSubdirectories, NotifyFilter, Path
 Metode: WaitForChanged
 Evenimente: Changed, Created, Deleted,
Renamed

53
FileStream

Modalitatea de acces la date


MemoryStream
secvential sau aleator in .NET

Stream-uri BufferedStream

CanRead, CanWrite, Close,


NetworkStream
Read, Flush, Read, ReadByte,
Seek, Write, WriteByte

GZipStream

54
 Majoritatea operatiilor folosesc clasa File.
Aceasta e folosita la deschidere, inchidere,
operatii simple (verificarea existentei).
 File creaza FileStream
 putem scrie usor in FileStream cu StreamReader
si StreamWriter.
 StreamReader si StreamWriter pot manipula
orice stream (incl. MemoryStream,
BufferedStream).
55
 clasa File
 Metode:
 Copy
 Create -> returneaza FileStream
 CreateText -> returneaza StreamWriter
 Move
 Open -> returneaza FileStream
 OpenText -> returneaza StreamReader
 ReadAllBytes -> creaza un array de bytes din fisier
 ReadAllLines -> creaza array de linii citite din fisier
 ReadAllText -> un string mare
 Write ---||---
 Toate Read, Write operatii atomice
56
 Clasa Directory este similara cu DirectoryInfo

57
 Deschiderea unui fisier text:
FileStream file = File.Open(“file.txt”, FileMode.Open, FileAcces.Read);
 enumerarea FileMode
 Open
 Append
 Create
 CreateNew
 OpenOrCreate
 Truncate
 enumerarea FileAcces:
 Read
 Write
 ReadWrite

58
 StreamReader
 Proprietati: BaseStream, CurrentEncoding,
EndOfStream
 Metode: Close, Peek, Read, ReadBlock, ReadLine,
ReadToEnd
 StreamWriter
 Proprietati: BaseStream, Encoding, NewLine,
AutoFlush
 Metode: Close, Write, WriteLine

59
 Citire fisier text
StreamReader sr = new StreamReader(file);
string text = sr.ReadToEnd();
sr.Close();
 Scriere fisier text
StreamWriter sw = new StreamWriter ();
sw.WriteLine(“ana are mere mari si frumoase”);
sw.Close();
60
 StreamReader deriva din TextReader si
StreamWriter din TextWriter
 TextReader, TextWriter sunt clase abstracte ce
reprezinta baza tuturor operatiilor de citire,
scriere text pe streamuri
 Exista si StringReader si StringWriter. Acestea
functioneaza ca StreamReader respectiv Writer,
dar pe obiecte de tip string aflate in memorie
(asemanator cu un StringBuilder)
61
 MemoryStream: Stream in memorie
 Poate fi folosit de StreamReader,Writer exact ca un
FileStream
 NU trebuie specificata cantitatea de memorie dorita
 BufferedStream
 Imbunatateste operatiile de scriere si citire folosind buffere
 sunt construite din FileStream
 ex: BufferedStream buff = new BufferedStream(file);
 Poate fi folosit de StreamReader,Writer exact ca un
FileStream
62
 Exista 2 tipuri: GZipStream, DeflateStream
 Amandoua folosesc acelasi algoritm dar
GZipStream are header-ul mai mare deci va
putea fi despachetat de aplicatii ca
WinZip,WinRar, WinAce, etc.
 Nu pot fi comprimate fisiere mai mari de 4GB 
 Folosibile exact ca si FileStream respectiv
MemoryStream
63
 ex: Comprimare data cu un GZipStream

FileStream fileIN = File.OpenRead(“test.in”);


FileStream fileOUT = File.Create(“test.zip”);
GZipStream zip = new GZipStream(fileOUT, CompressionMode.Compress);
// daca doream decompresie era CompressionMode.Decompress
int byteul = fileIN.ReadByte();
while (byteul != -1)
{
zip.WriteByte((byte)byteul));
byteul = fileIN.ReadByte();
}

In loc de GZipStream puteam folosi cu acelasi cod DeflateStream


64
 ex: Decomprimare data cu un GZipStream

FileStream fileIN = File.OpenRead(“test.zip”);


FileStream fileOUT = File.Create(“test.out”);
GZipStream zip = new GZipStream(fileIN, CompressionMode.Decompress);
int byteul = fileIN.ReadByte();
while (byteul != -1)
{
fileOUT.WriteByte((byte)byteul));
byteul = fileIN.ReadByte();
}

In loc de GZipStream puteam folosi cu acelasi cod DeflateStream


65
Click-Once AppDomain Assembly
Application Level Store Level Store
Level Store • Machine • Machine
• Machine • User • User
• User

66
 Folosim 2 clase:
 IsolatedStorageFile: similar cu File
 IsolatedStorageFileStream: similar cu FileStream

File IsolatedStorageFile
GetStore
Open (Machine, User for
Application, Assembly,
AppDomain)
67
 clasa IsolatedStorageFile ofera metode de
management a spatiului de memorie obtinut:
 CreateDirectory
 DeleteDirectory
 DeleteFile
 GetDirectoryNames
 GetFileNames
 Remove

68
 Creare store:
 pas1: alegem ce fel de spatiu de stocare dorim (machine level, user level) si cui este
adresat (Assembly, AppDomain, Click-Once Application)
 ex: IsolatedStorageFile machineStore =
IsoalatedStorageFile.GetMachineStoreForAssembly();
 ex: IsolatedStorageFile userStore = IsoalatedStorageFile.GetUserStoreForAssembly();
 Citire, scriere date in store:
 citire: IsolatedStorageFileStream userStream = new
IsolatedStorageFileStream(“UserSettings.set”,FileMode.Create, userStore);
 urmeaza citire normala, ca la orice stream (StreamReader … )
 scriere: IsolatedStorageFileStream userStream = new
IsolatedStorageFileStream(“UserSettings.set”,FileMode.Open, userStore);
 scriere ca la orice stream (StreamWriter … )
 !Cand deschideri un fisier in un store NU se verifica existenta fisierelui (cum se
face la File cu .Exists). Pentru a face verificarea om folosi metoda
GetFileNames:
 string[] files = userStore.GetFileNames(“UserSettings.set”)
if (files.Length == 0) // nu exista fisierul
 Despre securatatea in IsolatedStorage vom vorbi la capitolul de securitate. 69
 Faceti un program care sa monitorizeze un director pe
disc.
 In momentul in care se vor crea in directorul respectiv
fisiere cu o anumita extensie programul vostru le va
sterge si va loga operatia (numele fisierului, ora si data
stergeri) in format text, iar fisierul va fi arhivat.
 Fiecare utilizator din sistem va avea logul lui.
 OBS:
 Utilizatorul va putea specifica directorul care este monitorizat si
tipul de fisiere monitorizat.
 Aplicatia nu are drepturi de scriere in directorul propriu, program
files, windows, in radacina discului
70

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