Documente Academic
Documente Profesional
Documente Cultură
namespace ConsoleAppNetFramework
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
Includerea spaţiilor de nume -
implicit
// clasa Program generata in .NET 6
Console.WriteLine("Hello, World!");
• se pot obţine:
– prin implementarea explicită de către utilizator al unui constructor
simplu, fără nici un parametru; constructorii fără parametri implementaţi
explicit în cadrul clasei pot include (sau nu!) anumite secvenţe de
instrucţiuni (de regulă, iniţalizări)
//constructor fără parametri implementat explicit
public Punct() { …. }
pt pt_copie
x 20 x
y 30 y
pt_alta_copie ???
Exemplu – Laboratorul 1
student_01: Student date: Date_univ
nume
prenume
adresa
an_nastere
date_univ
student_01.date_univ = date;
student_02: Student student_02.date_univ = date;
nume
prenume
adresa
an_nastere student_02.date_univ = new Date_univ(date);
date_univ
Finalizers - Destructori
• Finalizers (cunoscuţi anterior ca destructori) sunt utilizaţi în procesul de
distrugere a unei instanţe a unui obiect => efectuează operaţii necesare de
“curăţare” a memoriei
• destructorii nu se moştenesc; de fapt, se poate defini un singur destructor
pentru o clasǎ, fǎrǎ parametri
• destructorii în C# nu pot fi apelaţi în mod explicit, ei sunt apelaţi automat;
• programatorul nu are nici un control asupra momentului cînd destructorul
este apelat pentru cǎ acest lucru este realizat de cǎtre colectorul de deşeuri
(garbage collector) care, dacǎ considerǎ cǎ un obiect poate fi distrus,
apeleazǎ destructorul (dacǎ existǎ).
• Garbage Collector => situațiile în care trebuie implementat un destructor
sunt destul de rare
~Punct()
{
//afisare in fereastra output
System.Diagnostics.Debug.WriteLine
("Acum s-a apelat destructorul clasei Punct!");
}
Destructorii şi metoda Finalize
• destructorii C# sunt convertiţi către un apel la metoda Finalize
(care nu poate fi apelată direct din C#) a clasei System.Object
~Nume_destructor()
{
// cod destructor
}
Obs. variabila tablou creată dispune de o serie de metode (clasa System.Array) prin care
se pot realiza diferite operaţii asupra elementelor tabloului.
Console.WriteLine( "Dimensiunea tabloului =
"+tab_uni.GetLength(0));
https://learn.microsoft.com/en-us/dotnet/api/system.object?view=net-6.0
Exemplu - clasa Baza
Baza
internal class Baza
{
public int? Camp_Baza { get; set; }
public Baza() Derivata
{
Camp_Baza = 0;
Console.WriteLine("Constructorul clasei Baza fara parametru");
}
public Baza(int p)
{
Camp_Baza = p;
Console.WriteLine("Constructorul clasei Baza cu parametru int {0} ", p);
}
public void Afisare() => Console.WriteLine("Clasa Baza cu parametrul
Camp_Baza {0}", Camp_Baza);
public void Metoda_Baza() => Console.WriteLine("Metoda proprie a clasei Baza");
}
Exemplu - clasa Derivata
internal class Derivata:Baza
{
int? Camp_Derivata { get; set; }
public Derivata()
{
Camp_Derivata = 0;
Console.WriteLine("Constructorul clasei Derivata fara parametru");
}
public Derivata(int b, int d) : base(b)
{
Camp_Derivata = d;
Console.WriteLine("Constructorul clasei Derivata
cu parametri {0} {1}", b,d);
}
public void Afisare()
{
base.Afisare();
Console.WriteLine("Clasa derivata cu Camp_Derivata {0}", Camp_Derivata);
}
public void Metoda_Derivata() => Console.WriteLine("Metoda proprie
a clasei Derivata");
}
Exemplu – Main
//cream obiecte
Baza obj_baza1 = new Baza();
Baza obj_baza2 = new Baza(5);
Derivata obj_deriv1 = new Derivata();
Derivata obj_deriv2 = new Derivata(7, 8);
Console.WriteLine();
//apelam metode
obj_baza2.Afisare();
obj_deriv2.Afisare();
obj_deriv1.Metoda_Derivata();
obj_deriv1.Metoda_Baza();
Punct
Patrat Cerc
Dreptunghi
Exemplu – clasa Punct
internal class Punct
{
//proprietatea X
public int X { get; set; }
//proprietatea Y
public int Y { get; set; }
//constructori pentru clasa Punct
public Punct()
{ }
public Punct(int x, int y)
{
this.X = x;
this.Y = y;
}
//metoda cu acelasi nume!!!
public void Deseneaza() => Console.WriteLine("Coordonatele punctului
desenat sunt: x={0} , y={1}", this.X, this.Y);
}
Exemplu – clasa Patrat
internal class Patrat:Punct
{
public int Latura { get; set; }
//constructori pentru clasa Patrat
public Patrat()
{ }
public Patrat
(int x, int y, int latura) : base(x, y)
{
this.Latura = latura;
}
//metoda cu acelasi nume!!
public void Deseneaza()
=> Console.WriteLine("Coordonatele patratului desenat sunt:
x={0} , y={1}, latura={2}\n", this.X, this.Y, this.Latura);
}
Exemplu – clasa Dreptunghi
internal class Dreptunghi:Punct
{
public int Lungime { get; set; }
public int Latime { get; set; }
//constructori pentru clasa Dreptunghi
public Dreptunghi()
{ }
public Dreptunghi(int x, int y, int lungime, int latime) : base(x, y)
{
this.Lungime = lungime;
this.Latime = latime;
}
//metoda cu acelasi nume!!
public void Deseneaza()
=> Console.WriteLine("Coordonatele dreptunghiului desenat sunt:
x={0} , y={1}, lungime={2} latime={3}\n",
this.X, this.Y, this.Lungime, this.Latime);
}
Exemplu – clasa Cerc
internal class Cerc:Punct
{
public int Raza { get; set; }
public Cerc()
{ }
public Cerc(int x, int y, int raza) : base(x, y)
{
this.Raza = raza;
}
//metoda cu acelasi nume!!
public void Deseneaza()
=> Console.WriteLine("Coordonatele cercului desenat sunt:
x={0} , y={1}, raza={2}\n",
this.X, this.Y, this.Raza);
}
Exemplu – Main
//cream obiecte
//apel implicit la constructorul fara parametru al clasei Punct
Patrat p0 = new Patrat();
Cerc c0 = new Cerc();
Dreptunghi d0 = new Dreptunghi();
}
Exemplu – clasa Dreptunghi
internal class Dreptunghi:Punct
{
public int Lungime { get; set; }
public int Latime { get; set; }
//constructori pentru clasa Dreptunghi
public Dreptunghi()
{ }
public Dreptunghi(int x, int y, int lungime, int latime) : base(x, y)
{
this.Lungime = lungime;
this.Latime = latime;
}
public override string IsA { get { return "Dreptunghi"; }}
public override void Deseneaza()
=> Console.WriteLine("Coordonatele dreptunghiului desenat sunt:
x={0} , y={1}, lungime={2} latime={3}\n",
this.X, this.Y, this.Lungime, this.Latime);
}
Exemplu – clasa Cerc
internal class Cerc:Punct
{
public int Raza { get; set; }
public Cerc()
{ }
public Cerc(int x, int y, int raza) : base(x, y)
{
this.Raza = raza;
}
public override string IsA { get { return “Cerc"; }}
public override void Deseneaza()
=> Console.WriteLine("Coordonatele cercului desenat sunt:
x={0} , y={1}, raza={2}\n",
this.X, this.Y, this.Raza);
}
Polimorfism - exemplu
//cream obiecte
Punct pt = new Punct(5, 7); Patrat patrat = new Patrat();
Cerc cerc = new Cerc(); Dreptunghi dreptunghi = new Dreptunghi();
Apare în general în cadrul clasei => Sunt implicate două clase cu relație de
supraîncărcarea metodei poate necesita sau moștenire => suprascrierea metodei necesită
nu moștenire întotdeauna moștenire
Patrat Cerc
Dreptunghi
Polimorfismul
şi colecţiile de obiecte
internal class MultimeGrafica
{ //dimensiune colectie
public static int DIM { get;} = 20;
//contor elemente colectie
public int Count { get; set; } = 0;
//structura de date interna care stocheaza elementele colectiei
Punct[] elemente = new Punct[DIM];
//adauga un element multimii
public void Adauga(Punct p)
{ elemente[Count++] = p; }
//returneza elementele colectiei ca string
public override string? ToString()
{
string? rez = string.Empty;
for (int i = 0; i < 20; i++)
if (elemente[i] is Punct) rez+=elemente[i].ToString();
return rez;
}
Polimorfismul
şi colecţiile de obiecte
//element de indexare (acces prin index int)
public Punct this[int index]
{ get
{
if ((index >= 0) && (index < DIM))
return elemente[index];
else return null;
}
set
{
if ((index >= 0) && (index < DIM))
{
elemente[index] = value;
Count++;
}
}
}
}
Elemente de indexare
• elementele de indexare sunt specifice • elementul de indexare C# nu are
colecţiilor de obiecte şi permit accesul nume: pentru a-l specifica se
mulţimilor de obiecte pe bază de utilizeazǎ cuvîntul cheie this =>
index, ca si când ar fi memorate valoarea indexatǎ este accesibilǎ
într-un tablou doar prin indexarea numelui
• mulţimile de obiecte pot fi instanţei.
reprezentate de un set finit de membri
ai unei clase, tablouri de obiecte sau public Nume_clasa this
structuri de date complexe [int index]
{
• indiferent de reprezentarea internă a get
clasei respective (structura de date {
utilizată), datele pot fi obţinute într-o //aici se returneaza o valoare
manieră consistentă prin intermediul }
elementelor de indexare set
{
• elementele de indexare pot fi //aici se seteaza o valoare
read/write, read-only, write/only }
}
Utilizarea elementelor de indexare
Patrat patrat = new Patrat(8, 3, 20);
Cerc cerc = new Cerc(7, 10, 40);
Dreptunghi dreptunghi = new Dreptunghi(2, 7, 30, 50);
//defineste un obiect MultimeGrafica
MultimeGrafica m_gr = new MultimeGrafica();
//adaugam elemente colectiei prin metoda Adauga
m_gr.Adauga(patrat);
m_gr.Adauga(cerc);
m_gr.Adauga(dreptunghi);
//afisam elementele colectiei
Console.WriteLine(m_gr.ToString());
//acceseaza pe baza de index elementele din MultimeGrafica
for (int i = 0; i < MultimeGrafica.DIM; i++)
{
Console.WriteLine((m_gr[i] is null) ?
string.Empty : " X= " + m_gr[i].X + " Y= " + m_gr[i].Y);
}
Utilizarea elementelor de indexare
Patrat altpatrat = new Patrat(10, 30, 15);
Cerc altcerc = new Cerc(9, 11, 20);
Dreptunghi altdreptunghi = new Dreptunghi(3, 5, 20, 35);
//adaugare elemente prin index
m_gr[4] = altpatrat;
m_gr[5] = altcerc;
m_gr[6] = altdreptunghi;
Console.WriteLine(m_gr.ToString());
for (int i = 0; i < MultimeGrafica.DIM; i++)
{
Console.WriteLine((m_gr[i] is null)
? string.Empty : m_gr[i].ToString());
}
Clasa MultimeGrafica revizuită
internal class MultimeGrafica
{ //contor elemente colectie
public int Count { get; set; } = 0;
//structura de date interna care stocheaza elementele colectiei
//(Punct, Patrat, Dreptunghi, Cerc)
Punct[] elemente;
//initializare prin constructor
public MultimeGrafica(int count, Punct[] elemente)
{
this.elemente = elemente;
this.Count = count;
}
//adauga un element multimii
public void Adauga(Punct p)
{
elemente[Count++] = p;
}
Clasa MultimeGrafica revizuită
//returneza elementele colectiei ca string
public override string? ToString()
{
string? rez = string.Empty;
foreach(var elem in elemente) rez+=elem.ToString()+"\n";
return rez;
}
//returneaza toate elementele pentru care isA returneaza s
// index string!
public IEnumerable<Punct> this[string s]
{
get => elemente.Where(elem => elem.IsA == s);
}
}
Utilizare clasa MultimeGrafica
revizuită
Punct[] elemente_initial =
{ new Punct(5, 7), new Dreptunghi(20, 7, 3,3),
new Patrat(5, 7, 10), new Cerc(20, 3, 7), new Punct(21, 7) };
MultimeGrafica m_gr = new MultimeGrafica(5, elemente_initial);
//afiseaza colectia creata initial
Console.WriteLine(m_gr.ToString());
//doar elementele pentru care isA returneaza sirul "Punct"
foreach (Punct p in m_gr["Punct"]) p.Deseneaza();
Colecţii în .NET
• în majoritatea cazurilor se vor utiliza clasele de colecţie predefinite în .NET
în loc de a defini propria clasă de colecţie
• există două tipuri de colecții disponibile în C#: colecții non-generice și
colecții generice.
• spațiul de nume System.Collections conține tipurile de colecții non-
generice, iar spațiul de nume System.Collections.Generic include
tipuri de colecții generice
Colecţii non-generice .NET
Colecţii non-generice .NET
• ArrayList – tablou a cǎrui dimensiune creşte pe mǎsurǎ ce este necesar
• Hashtable – o colecție de perechi cheie/valoare organizate pe baza unei
tabele de dispersie (memorare pe baza cheii hashcode)
• Queue – o colecție de obiecte de tipul FIFO (coadǎ)
• SortedList – o colecție de perechi cheie/valoare sortate pe baza cheii şi
accesibile pe baza cheii şi pe baza unui index
• Stack - o colecție de obiecte de tipul LIFO (stivǎ)
• ......
• https://docs.microsoft.com/en-
us/dotnet/api/system.collections?view=net-6.0
Colecţii non-generice .NET
ArrayList
• ArrayList este unul din tipurile aşa numite de colecţie non-generice puse la
dispoziţie de .NET
• public class ArrayList : IList, ICollection,
IEnumerable, ICloneable
• constructori:
public ArrayList ()
public ArrayList (ICollection c);
public ArrayList (Int32 capacity);
• proprietăţi: Capacity, Count, Item, etc.
• metode (parţial):
public virtual int Add (Object value);
public virtual int BinarySearch (Object value);
public virtual bool Contains (Object item);
public virtual bool Equals (Object obj);
public virtual void Remove (Object obj);
public virtual void Insert(int index, Object obj);
public virtual void Sort();
Colecţii non-generice .NET
ArrayList
• exemplul anterior utilizând ArrayList: nu mai este necesară definirea
clasei MultimeGrafica, se utilizează direct clasa ArrayList
// iterare cu foreach
foreach (int i in lista_intregi) { Console.Write(i + " "); }
// iterare cu foreach
foreach (string i in lista_siruri) { Console.Write(i + " "); }
Colectii generice .NET
• spaţiul de nume System.Collection.Generic defineşte colecţii generice
• colecţiile generice rezolvă problemele specifice cele non-generice, în sensul
că acestea sunt puternic tipizate (type safe). Rezultă următoarele avantaje ale
utilizării structurilor generice ȋn programarea orientată pe obiecte :
– performanţa ridicată prin evitarea eventualelor conversii de tip, cu efect
negativ asupra performanţelor
– siguranţa tipurilor prin verificarea, ȋncă din fază de compilare dacă tipurile
utilizate sunt ȋn conformitate cu tipul sub cu care clasa generică a fost
instanţiată
– reutilizarea codului – pentru mai multe tipuri de date se utilizează aceeaşi
secvenţă de cod
– sunt de preferat a fi utilizate în locul claselor de colecţie
non-generice
– implementează una sau mai multe dintre interfeţele generice de dar
marea majoritate implementează Icollection<T> şi Ienumerable<T>
Colecţii şi tipuri generice .NET
System.Collection.Generic – clase, interfete, etc.
• List<T> - implementează o listă de elemente accesibile prin index şi
furnizează o serie de metode de căutare, sortare şi manipulare a
elementelor listei; implementează interfeţle IList<T>,
ICollection<T>, IEnumerable<T>, IList, ICollection<T>,
IEnumerable<T>
• Queue<T> - reprezintă o colecţie generică cu structură de coadă (FIFO) şi
Implementează interfeţele IEnumerable<T>, ICollection<T>,
IEnumerable<T>
• Stack<T> - reprezintă o colecţie generică cu structură de stivă (LIFO) şi
implementează interfeţele, ICollection<T>, IEnumerable<T>
Colecţii şi tipuri generice .NET
• HashSet<T> - reprezintă o colecţie generică de tip mulţime de valori şi
are la bază interfeţle ISerializable, IDeserializationCallback, ISet<T>,
ICollection<T>, IEnumerable<T>
• LinkedList<T> - reprezintă o listă dublu ȋnlănţuită şi implementează,
ICollection<T>, IEnumerable<T>, ISerializable, IDeserializationCallback
• Dictionary<TKey, TValue> reprezintă o colecţie de perechi
chei/valoare
• interface IComparer<T> defineşte o metodă care este utilizată pentru a
compara două obiecte
Utilizarea colecţiilor generice
Crearea unei liste de şiruri de caractere:
List<string> siruri = new List<string>();
Crearea unei liste de numere întregi :
List<int> intregi = new List<int>();
Crearea unei liste de obiecte definite de utilizator (Produs):
List<Produs> produse = new List<Produs>()
Accesul la elementele colecțiilor
utilizând LINQ
• LINQ (Language Integrated Query) – începînd cu versiunea .NET 3.5
reprezintǎ un set de extensii .NET care furnizeazǎ capabilitǎți de
interogare în cadrul imbajelor C# şi Visual Basic => o sintaxă algebrică
asemănătoare cu SQL
• LINQ extinde sintaxa limbajelor cu operatori de intorogare standard care
permit lucrul cu datele independent de sursa de date => şi accesul către
diferite surse de date realizat printr-o sintaxă unitară (independent de tipul
sursei de date)
– simple colectii – Linq to Objects
– baze de date – Linq to SQL
– XML - Linq to XML
• integrat direct in limbaj, cu verificare tipuri, suport Intellisense, debugger
Accesul la elementele colecțiilor
utilizând LINQ
• LINQ to Objects => admite ca sursǎ de date doar tipuri enumerabile ( care
implementeazǎ IEnumerable<T> )
• rezultatul interogǎrii este stocat într-o variabilǎ interogare a cǎrui tip poate
fi declarat sau nu; în acest ultim caz aceasta se declarǎ folosind var şi
compilatorul va detecta în mod automat tipul acesteia
• iterarea prin rezultatul interogǎrii se realizeazǎ utilizând foreach
• exista mai multe variante de exprimare: utilizând expresii de interogare
sau expresii lambda
• rezultatul este un array simplu care poate fi transformat într-o listă
utilizând ToList() sau într-un şir folosind ToString()
Accesul la elementele colecțiilor
utilizând LINQ
List<Produs> produse = new List<Produs>();
• variabila interogare cu tip specificat:
IEnumerable<Produs> var_interogare_linq =
from prod in produse
where prod.Producator == "Romania"
orderby prod.Nume
select prod;
sau
IEnumerable<Produs> var_interogare_linq =
from prod in produse
where prod.Producator == "Romania"
&& prod.Pret<=200
select prod;
Accesul la elementele colecțiilor
utilizând LINQ
• interogare utilizând variabila de interogare fǎrǎ tip specificat
var interogare = from prod in produse
orderby prod.Nume
group prod by prod.Categorie into gr
select gr;
if (librarie.Contine(literatura)) Console.WriteLine("Exista!");
else Console.WriteLine("Nu exista!");
if (librarie.Contine(tehnica.Titlu))
Console.WriteLine("Exista!");
else Console.WriteLine("Nu exista!");
librarie.Iesire("Dictionar Roman-Englez");
//apel Contine cu parametru string
if (librarie.Contine(dictionar.Titlu))
Console.WriteLine("Exista!");
else Console.WriteLine("Nu exista!");
Serializarea
• serializarea este procesul de conversie a stării unui obiect, adică a valorilor
proprietăților acestuia, într-o formă care poate fi stocată şi, eventual
transmisă
• termenul de serializare se foloseşte în limbajele orientate pe obiecte în
legătură cu persistenţa obiectelor (instanţelor); pentru ca un obiect să fie
persistent, el trebuie salvat pe o memorie nevolatilă pentru a putea fi
restaurat ulterior pe baza informaţiilor salvate.
• datele instanţei serializate sunt salvate în ordine, de obicei câmp cu câmp;
daca se doreşte serializarea mai multor instanţe, salvarea datelor acestora
se realizeaza în ordine, una dupa alta
• serializarea se face secvenţial, deci ordinea de salvare trebuie să fie
aceeaşi cu ordinea de citire pentru restaurare; nu se pot accesa înregistrări
individuale, deci serializarea nu se poate folosi pentru stocarea bazelor de
date
• deserializarea reprezinta operaţia inversă serializarii prin care datele
serializate în prealabil sunt inserate într-o instanţă (sau în instanţe) ale
clasei
Moduri de serializare
• se pot utiliza diferite standarde, dintre care cele mai cunoscute standarde
de industrie sunt bazate pe fişierele XML (Extensible Markup Language)
sau pe serializare JSON (JavaScript Object Notation); există, dar este mai
puţin actuală şi varianta de serializare binară (fişier bitmap)
• .NET pune la dispozitie clase specifice pentru operaţiile de
serializare/deserializare:
• XMLSerialization pentru serializarea XML => System.Xml.Serialization
• JsonSerializer pentru serializarea JSON => System.Text.Json
• BinaryFormatter pentru serializarea binarǎ =>
System.Runtime.Serialization.Formatters.Binary;
Serializarea XML
• se utilizează clasa XmlSerializer din spaţui de nume
System.Xml.Serialization
• în XML sunt serializabile doar câmpurile şi proprietǎţile publice
• dacǎ datele instanţelor nu sunt accesibile din câmpurile sau proprietǎţile
publice, ele nu vor fi iniţializate la deserializarea obiectelor => proprietățile
trebuie să aibă modificatori publici (get și set).
• pentru serializarea XML este necesar un constructor public, fǎrǎ parametri
• o clasă trebuie să aibă un constructor fără parametri pentru a fi serializată
XML cu XmlSerializer
• pentru a fi serializată XML, o clasă care implementează IEnumerable
(List<T>) trebuie să implementeze o metodă publică Add cu un parametru
care trebuie să fie coresspunzător (polimorfic) cu tipul returnat de
IEnumerator, respectiv proprietatea Current returnată de la metoda
GetEnumerator
O clasă serializabilă
public class Persoana
{
public string? Nume { get; set; }
public string? Prenume { get; set; }
public int? Varsta { get; set; }
public Persoana(string nume, string prenume, int virsta)
{
Nume = nume; Prenume = prenume; Varsta = virsta;
}
//constructor fǎrǎ parametri pentru serializare
public Persoana() { }
public override string? ToString()
{
return " Nume " + this.Nume + " Prenume "
+ this.Prenume + " Varsta " + this.Varsta;
}
}
O colecţie serializabilă
public class ColectiePersoane
{ public string Nume { get; set; }
public List<Persoana> ElemPersoane { get; set; }
public ColectiePersoane()
{
ElemPersoane= new List<Persoana>();
}
public void Add(Persoana persoana)
{
this.ElemPersoane.Add(persoana);
}
public override string? ToString()
{
string s = string.Empty;
foreach (Persoana p in ElemPersoane) s+=p.ToString()+ " ";
return s;
}
}
O colecţie serializabilă
string fisierXML = "persoane.xml";
ColectiePersoane colectie = new ColectiePersoane();
Persoana pers_01 = new Persoana("Popescu", "Dorina", 40);
Persoana pers_02 = new Persoana("Avramescu", "Claudia", 25);
Persoana pers_03 = new Persoana("Pantea", "Marius", 27);
colectie.Add(pers_01); colectie.Add(pers_02); colectie.Add(pers_03);
System.IO.TextWriter writer = new System.IO.StreamWriter(fisierXML);
//creare obiect xmlSerial cu parametru tipul obiectelor serializate
XmlSerializer xmlSerial = new XmlSerializer(typeof(ColectiePersoane));
//apel metoda de serializare
xmlSerial.Serialize(writer, colectie);
writer.Close();
//deserializare xml
System.IO.TextReader reader = new System.IO.StreamReader(fisierXML);
// metoda Deserialize returneazǎ o instanţǎ System.Object
colectie = (ColectiePersoane)xmlSerial.Deserialize(reader);
Console.WriteLine("Dupa deserializare XML!");
Console.WriteLine(colectie.ToString()); reader.Close();
Rezultatul serializării XML
<?xml version="1.0" encoding="utf-8"?>
<ColectiePersoane xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ElemPersoane>
<Persoana>
<Nume>Popescu</Nume>
<Prenume>Dorina</Prenume>
<Varsta>40</Varsta>
</Persoana>
<Persoana>
<Nume>Avramescu</Nume>
<Prenume>Claudia</Prenume>
<Varsta>25</Varsta>
</Persoana>
<Persoana>
<Nume>Pantea</Nume>
<Prenume>Marius</Prenume>
<Varsta>27</Varsta>
</Persoana>
</ElemPersoane>
</ColectiePersoane>
Serializarea XML
• pentru a serializa o clasǎ care implementeazǎ şi ICollection, cum este
clasa ColectieSerializabila care are ca şi clasǎ de bazǎ
CollectionBase, valorile care urmează să fie serializate sunt preluate
indexat, mai degrabă decât prin apelarea GetEnumerator, astfel trebuie
implementaţi şi urmǎtorii membri:
• metoda Add cu un parametru de acelaşi tip cu obiectul returnat de
proprietatea Current a metodei GetEnumerator
• un element de indexare care sǎ returneze acelaşi tip (polimorfic) cu
metoda Add definitǎ anterior; un astfel de element de indexare a fost
definit în cadrul colecţiei ColectieSerializabila
• aceşti membri permit procesului de serializare sǎ acceseze obiectele
colecţiei prin intermediul elementului de indexare şi sǎ deserializeze
obiectele prin metoda Add
O altă colecţie serializabilă
public class ColectieSerializabila: System.Collections.CollectionBase
{
public ColectieSerializabila() { }
//pentru serializare XML
public void Add(Persoana p)
{
this.InnerList.Add(p);
}
//pentru serializare XML
public Persoana this[int index]
{
get { return (Persoana)(this.InnerList[index]); }
set { this.InnerList[index] = value; }
}
O altă colecţie serializabilă
public void Sterge(Persoana p)
{
this.InnerList.Remove(p);
}
public override string? ToString()
{
string c = string.Empty;
foreach (Persoana p in this.InnerList) c+=p.ToString()+"\n";
return c;
}
}
O altă colecţie serializabilă
ColectieSerializabila persoane = new ColectieSerializabila();
//serializare xml
string fisierXML = "persoane.xml";
Persoana pers_01 = new Persoana("Popescu", "Dorina", 40);
persoane.Add(pers_01);
Persoana pers_02 = new Persoana("Avramescu", "Claudia", 25);
persoane.Add(pers_02);
Persoana pers_03 = new Persoana("Pantea", "Marius", 27);
persoane.Add(pers_03);
//afisare continut persoane inainte de serializare
persoane.ToString();
Console.WriteLine(persoane.ToString());
O altă colecţie serializabilă
//asociere obiect writer cu fisierul
System.IO.TextWriter writer = new System.IO.StreamWriter(fisierXML);
//creare obiect xmlSerial cu parametru tipul obiectelor serializate
XmlSerializer xmlSerial = new
XmlSerializer(typeof(ColectieSerializabila));
//apel metoda de serializare
xmlSerial.Serialize(writer, persoane);
writer.Close();
//deserializare xml
System.IO.TextReader reader = new System.IO.StreamReader(fisierXML);
// metoda Deserialize returneazǎ o instanţǎ System.Object
persoane = (ColectieSerializabila)xmlSerial.Deserialize(reader);
Console.WriteLine("Dupa deserializarea XML");
Console.WriteLine(persoane.ToString());
reader.Close();
O altă colecţie serializabilă
public void Sterge(Persoana p)
{
this.InnerList.Remove(p);
}
public override string? ToString()
{
string c = string.Empty;
foreach (Persoana p in this.InnerList) c+=p.ToString()+"\n";
return c;
}
}
Rezultatul serializării XML
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPersoana xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Persoana>
<Nume>Popescu</Nume>
<Prenume>Dorina</Prenume>
<Varsta>40</Varsta>
</Persoana>
<Persoana>
<Nume>Avramescu</Nume>
<Prenume>Claudia</Prenume>
<Varsta>25</Varsta>
</Persoana>
<Persoana>
<Nume>Pantea</Nume>
<Prenume>Marius</Prenume>
<Varsta>27</Varsta>
</Persoana>
</ArrayOfPersoana>
Controlul generării fişierelor XML
public class Persoana
{
[XmlElement("NumePersoana")]
public string? Nume { get; set; }
public string? Prenume { get; set; }
[XmlIgnoreAttribute]
public int? Varsta { get; set; }
….
}
Element root
<librarie>
Element Atribut
Atribut <carte> “categorie”
“limba”
<persoana>
<sex>masculin<sex>
<nume>Popescu</nume>
<prenume>Ion</prenume>
</persoana>
<xs:schema>
...
</xs:schema>
{"persoane":[
{"nume":"Popescu Ion", "email":"ipopescu@gmail.com"},
{"nume":"Ionescu Marian", "email":"mionescu@gmail.com"},
{"nume":"Avramescu Dan", "email":"davramescu@gmail.com"}
]
}
Echivalent XML
<persoane>
<persoana>
<nume> Popescu Ion</nume>
<email> ipopescu@gmail.com</email>
</persoana>
<persoana>
<nume> Ionescu Marian</nume>
<email> mionescu@gmail.com</email>
</persoana>
<persoana>
<nume> Avramescu Dan</nume>
<email> davramescu@gmail.com</email>
</persoana>
</persoane>
=> alternativa JSON este mult mai concisă decât XML
Serializarea JSON
• spațiul de nume System.Text.Json.Serialization oferă
funcționalităţi pentru serializarea și deserializarea din JavaScript Object
Notation (JSON) => clasa JsonSerializer
• la serializarea JSON, în mod implicit se vor serializa toate proprietățile
publice ale obiectului. dacă se doreşte ignorarea unor proprietăţi
individuale, există şi aici mai multe opțiuni, de exemplu varianta utilizării
atributului [JsonIgnore]
• implicit, deserializarea JSON utilizează constructorul fără parametri pentru
a crea obiectul deserializat, deci un astfel de constructor trebuie să existe;
pot fi setate eventual şi alte opţiuni pentru a se utiliza în procesul de
deserializare şi constructor cu parametri
Exemplu - serializarea JSON a unei liste
List<Persoana> persoane = new List<Persoana>();
Persoana pers_01 = new Persoana("Popescu", "Dorina", 40);
persoane.Add(pers_01);
Persoana pers_02 = new Persoana("Avramescu", "Claudia", 25);
persoane.Add(pers_02);
Persoana pers_03 = new Persoana("Pantea", "Marius", 27);
persoane.Add(pers_03);
string persoaneJSON =
JsonSerializer.Serialize<List<Persoana>>(persoane);
//deserializare JSON => reconstruire obiect List<Persoana>
List<Persoana> DinNoupersoaneJSON =
JsonSerializer.Deserialize<List<Persoana>>(persoaneJSON);
foreach (Persoana p in DinNoupersoaneJSON)
Console.WriteLine(p.ToString());
O altă colecţie serializabilă
public class ColectiePersoane
{
public List<Persoana> ElemPersoane { get; set; }
public ColectiePersoane()
{
ElemPersoane= new List<Persoana>();
}
public void Add(Persoana persoana)
{
this.ElemPersoane.Add(persoana);
}
// operatia de inmultire
Func<double, double, double> operatie2 = OperatiiMatem.Inmultire;
class Persoana
{
public string? Nume { get; set; }
public string? Prenume { get; set; }
public override string ToString()
{
return Nume + " " + Prenume;
}
Exemplu
public Persoana(string numeprenume)
{
try
{
string separator = "";
string[] tabel_separat =
numeprenume.Split(separator.ToCharArray());
Nume = tabel_separat[0]; Prenume = tabel_separat[1];
}
catch (Exception ex)
{
throw new ExceptieFormatNumeIncorect
("Format incorect la introducerea
numelui si prenumelui", ex);
}
}
}
Exemplu
private void but_Apasa_Click(object sender, RoutedEventArgs e)
{
try
{ lstBoxPersoane.Items.Add(new Persoana(txt_NumePren.Text));
}
catch (ExceptieFormatNumeIncorect exceptienume)
{
if (exceptienume.InnerException != null)
MessageBox.Show(exceptienume.Message + "\n" +
exceptienume.InnerException.Message);
else MessageBox.Show(exceptienume.Message);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
txt_NumePren.Text = "";
}
Atribute
• atributele sunt elemente (clase care pot fi scrise în C# ) care permit
adăugarea unor informaţii în format declarativ în cadrul programelor
• aceste informaţii sunt utilizate ulterior atît la execuţie cît şi în procesul de
proiectare a aplicaţiei (de exemplu de către uneltele de dezvoltare utilizate)
• atributele reprezintă un mecanism prin intermediul căruia se pot adăuga
metadate în programe (instrucţiuni de compilare, date despre datele,
clasele şi metodele utilizate în cadrul programului, etc.)
• sunt necesare deoarece multe din serviciile care sunt obţinute de pe urma
utilizării atributelor ar fi foarte dificil de obţinut prin scrierea de cod sursa
echivalent
• atunci cînd un program C# este compilat, acesta este convertit într-un
limbaj intermediar MSIL (MicroSoft Intermmediate Language) şi se crează
un fişier numit ansamblu care, în mod normal poate fi un executabil sau o
bibliotecă .dll
• după ce un atribut este asociat cu o entitate de program, atributul poate fi
interogat în timpul rulării utilizând o tehnică numită reflexie
Exemplu definire atribute
• clasa prin intermediul căreia se defineşte atributul ObsoleteAttribute
este definită în felul următor (spaţiul de nume System, în mscorlib.dll):
[System.AttributeUsage(System.AttributeTargets.Class |
System.AttributeTargets.Constructor |
System.AttributeTargets.Delegate |
System.AttributeTargets.Enum |
System.AttributeTargets.Event |
System.AttributeTargets.Field |
System.AttributeTargets.Interface |
System.AttributeTargets.Method |
System.AttributeTargets.Property |
System.AttributeTargets.Struct, Inherited=false)]
public sealed class ObsoleteAttribute : Attribute
Exemplu definire atribute
• se observă utilizarea modificatorului sealed prin intermediul căreia se
marchează faptul că din respectiva clasă nu pot fi derivate alte clase
• un atribut este un obiect care reprezintă date care se doresc asociate cu un
element din cadrul programului
• elementul căruia i se asociază un atribut reprezintă ţinta atributului respectiv
• atributele se aplică de regulă înaintea declaraţiilor de tipuri sau membri ai
unor tipuri, acestea reprezentînd implicit ţinta acestora
• se utilizează paranteze drepte pentru definirea atributelor
[ObsoleteAttribute]
[Obsolete]
Exemplu utilizare atribute
internal class DemoAtribute
{
[Obsolete]
public void PrimaMetodaDeprecated()
{
Console.WriteLine("Apel PrimaMetodaDeprecated() :");
}
[ObsoleteAttribute]
int i = 30;
System.Type type = i.GetType();
System.Console.WriteLine(type);
• clasa Type este una dintre cele mai importante în contextul mecanismului
de reflexie
• Common Language Runtime (CLR) crează un obiect Type pentru un anuit
tip, atunci cînd acest lucru este solicitat; ulterior, pot fi utilizate proprietăţile
şi metodele obiectului Type pentru a obţine informaţii asupra tipului
respectiv
Utilizarea reflexiei
using System.Reflection;