Rezumat
Această pagină sintetizează conceptele acoperite în toate capitolele. Nu înlocuiește lectura capitolelor, ci servește ca referință rapidă în timpul exercițiului practic.
1. Clasa și obiectul
Clasă
Șablonul — descrie structura și comportamentul
Obiect
Instanța — un exemplar concret creat din șablon
Proprietate
O dată aparținând obiectului
Metodă
Un comportament aparținând obiectului
new
Operatorul care creează un obiect în memorie
O variabilă de tip clasă conține o referință către obiect, nu obiectul în sine. Atribuirea c2 = c1 nu copiază obiectul, ambele variabile pointează către același obiect din memorie.
2. Proprietăți și încapsulare
Câmp privat
Memoria internă a obiectului, inaccesibilă din exterior
Proprietate
Poarta de acces controlată la acea memorie
get
Rulează când citim valoarea
set
Rulează când scriem valoarea; value este valoarea nouă
Proprietate auto-implementată
{ get; set; } — sintaxă scurtă când nu e nevoie de validare
Encapsulare
Principiul că obiectul își controlează și protejează propria stare
Câmpurile sunt private, proprietățile sunt public. Validarea pusă în set rulează automat la orice atribuire, inclusiv din constructor.
3. Constructorul
Constructor
Metodă specială apelată automat la new, fără tip de retur
Parametrii constructorului
Forțează furnizarea datelor la creare
Validare în proprietăți
Rulează automat prin constructor, fără apel explicit
Supraîncărcare
Mai mulți constructori cu parametri diferiți
: this(...)
Apelează alt constructor din aceeași clasă
: base(...)
Apelează constructorul clasei de bază
Constructor implicit
Generat automat dacă nu există niciunul definit; dispare când definești primul
Dacă constructorul aruncă excepție, obiectul nu ajunge în memorie. Un obiect invalid nu ar trebui să existe.
4. Enumerații
enum
Tip cu mulțime fixă de valori cunoscute la compilare
Valoare implicită
Primul element are valoarea 0, restul în ordine
Verificare la compilare
Orice valoare în afara mulțimii produce eroare
switch pe enum
Mod natural de a trata fiecare caz în parte
.ToString()
Returnează numele valorii ca string
Enum.TryParse
Conversie sigură din string în enum
Enumerațiile înlocuiesc string-urile sau numerele magice cu un tip pe care compilatorul îl poate verifica.
5. Excepții
throw
Aruncă o excepție și oprește execuția curentă
ArgumentException
Parametru primit din exterior cu valoare inacceptabilă
InvalidOperationException
Operație imposibilă în starea curentă a obiectului
Propagare pe stivă
Excepția urcă prin apeluri până e prinsă sau programul se oprește
try/catch
Prinde excepția și permite continuarea programului
finally
Rulează indiferent dacă a apărut excepție sau nu
Constructor + excepție
Dacă constructorul aruncă excepție, obiectul nu există în memorie
Excepțiile nu sunt mesaje de eroare pentru utilizator. Sunt mecanismul prin care codul semnalează că ceva fundamental nu poate continua.
6. Moștenirea
Moștenire
Clasa derivată primește tot ce e public/protected din clasa de bază
: ClasaDeBaza
Sintaxa de declarare a moștenirii
: base(...)
Apelul constructorului clasei de bază
Relația "este un"
Testul conceptual pentru a valida o moștenire
Moștenire pe niveluri
O clasă derivată poate fi la rândul ei extinsă
O singură clasă de bază
C# nu permite moștenire multiplă din clase
sealed
Interzice moștenirea unei clase
Moștenirea exprimă relații reale din domeniu. Testul: dacă propoziția "X este un Y" are sens, X poate moșteni Y.
7. virtual și override
virtual și overridevirtual
Metoda poate fi înlocuită de clasele derivate
override
Înlocuiește intenționat o metodă virtual din clasa de bază
base.Metoda()
Apelează implementarea din clasa de bază înainte de a adăuga logică nouă
Legare dinamică
C# alege implementarea la runtime după tipul real al obiectului
Fără virtual
Legare statică — tipul variabilei decide, polimorfismul nu funcționează
sealed override
Permite suprascrierea la nivelul curent, o interzice mai departe
abstract
Nu există implementare implicită; clasa derivată este obligată să o definească
Fără virtual, apelul metodei pe o variabilă de tip bază ajunge mereu la implementarea clasei de bază, indiferent de tipul real al obiectului.
8. Polimorfismul
Polimorfism
Același apel produce rezultate diferite în funcție de tipul real al obiectului
Tipul real vs. tipul variabilei
C# caută implementarea pe tipul din memorie, nu pe tipul declarat
List<Bilet> cu obiecte mixte
Toate tipurile derivate sunt acceptate; fiecare răspunde cu propria logică
Extensibilitate
Tipuri noi adăugate ulterior funcționează fără a modifica codul existent
Polimorfism prin interfețe
Funcționează la fel; obiectele sunt văzute prin tipul interfeței
is/as
Pentru cazurile în care tipul concret chiar contează
Polimorfismul este motivul pentru care CasaBilete poate fi scrisă simplu și rămâne corectă indiferent câte tipuri de bilete adăugăm.
9. Interfețele
Interfață
Contract care impune ce metode trebuie să existe, fără implementare
interface
Cuvântul cheie pentru declarare
Implementare
Clasa declară cu : și definește toate metodele din interfață
Moștenire vs. interfață
Moștenire: "este un", cod reutilizat; Interfață: "poate face", contract pur
Oricâte interfețe
O clasă poate implementa mai multe interfețe simultan
Decuplare
Codul care consumă obiectele depinde de interfață, nu de tipul concret
Polimorfism prin interfață
Funcționează identic cu polimorfismul prin moștenire
Interfețele permit adăugarea de tipuri noi fără modificarea codului existent, atâta timp cât noile tipuri respectă contractele stabilite.
10. Genericele și where
whereParametru de tip <T>
Placeholder înlocuit cu un tip concret la apel
where T : Bilet
Constrângere: T trebuie să fie Bilet sau derivat din el
Fără where
Compilatorul nu știe nimic despre T; nu poate verifica proprietăți sau metode
OfType<T>()
Filtrează o colecție și returnează elementele de tipul T
Clasă generică
O clasă parametrizată cu un tip; exemplul clasic este List<T>
Beneficiul principal
O singură implementare pentru orice tip, fără duplicare de cod
Genericele permit scrierea de cod care funcționează cu orice tip fără să piardă verificările compilatorului.
11. LINQ
Where
Filtrează după o condiție
OfType<T>
Filtrează după tipul real al obiectului
Select
Transformă fiecare element
Sum
Suma unei valori numerice
Count
Numără elementele, opțional cu condiție
Min / Max
Valoarea minimă sau maximă
Average
Media aritmetică
OrderBy / OrderByDescending
Sortare crescătoare sau descrescătoare
ThenBy / ThenByDescending
Criteriu secundar de sortare
First / FirstOrDefault
Primul element, cu sau fără excepție la colecție goală
Single / SingleOrDefault
Exact un element, cu sau fără excepție
Take
Primele n elemente
ToList / ToArray
Materializează rezultatul într-o colecție concretă
Metodele LINQ pot fi înlănțuite. Rezultatul fiecăreia devine intrarea următoarei. ToList() la final materializează rezultatul într-o colecție concretă.
12. is și as
is și as(Tip)obiect
Cast explicit
Aruncă InvalidCastException
obiect as Tip
Conversie sigură
Returnează null
obiect is Tip
Verificare tip
Returnează false
obiect is Tip var
Verificare și extragere
Returnează false; variabila inaccesibilă
switch cu case Tip var
Ramificare pe tip
Merge pe default
Pattern matching cu is este varianta modernă și preferată. Ordinea ramurilor contează când tipurile sunt din aceeași ierarhie: tipurile mai specifice se verifică primele.
Cum se leagă toate
Last updated