Saturday, July 20, 2019 15:41

Tipuri prin valoare şi referință

Variabilele din C# pot fi clasificate în două tipuri principale: tipuri prin valoare și referință. Care este diferența dintre ele?

Tipurile de valoare sunt stocate într-o zonă specială, care se numește stivă de execuție (execution stack), iar valoarea lor este stocată şi accesată în mod direct. Iată lista completă a tipurilor de valoare: sbyte, byte, short, ushort, int, long, ulong, float, double, decimal, char, bool. Ca o caracteristică specifică a tipurilor prin valoare, memoria alocată pentru aceste variabile de către program este eliberată când domeniul lor de execuție se termină, sau când programul îşi încheie execuția. De exemplu, atunci când avem un bloc de cod, cum ar fi funcția Main, atunci când aceasta îşi termină execuția, toate variabilele de tip valoare stocate în stivă sunt eliberate (distruse).

Tipurile de referință nu dețin valori directe. Acestea păstrează de fapt o adresă (referință) în stiva de execuție a programului, și acea referință este cea care indică spre valoarea reală stocată în memoria dinamică (numită heap). Iată un exemplu a modului în care este reprezentată o variabilă de referință: 0x009F54A9. Spre deosebire de tipurile de valoare, tipurile de referință pot avea valori nule, iar ele pot indica numai obiecte de același tip. O altă caracteristică distinctă a tipurilor de referință este faptul că acestea alocă memorie dinamică pentru declarația lor. Acestea sunt gestionate în mod automat de un concept numit colector de gunoi (garbage collector), care eliberează automat memoria lor atunci când nu mai sunt utilizate. Din această cauză, tipurile de referință sunt un pic mai lente decât tipurile de valoare. Pentru că tipurile de referință sunt alocate și eliberate în mod dinamic și automat, este posibil ca dimensiunea lor să nu fie cunoscută dinainte. De exemplu, atunci când declarăm o variabilă de tip șir de caractere, care poate conține text, aceasta nu va ști dinainte lungimea textului pa care îl vom păstra în interiorul ei. Vă puteți imagina mult mai ușor tipurile de valoare și de referință folosind exemple din lumea reală. În cazul în care dorim să creem un obiect și numai un singur obiect, vom crea un tip de valoare. De exemplu, vom crea o sculptură, și atât. O așezăm pe un suport și cu asta, basta. Așa că tipurile de valoare sunt ușor de înțeles. Creăm un obiect și orice modificare alegem să facem se face direct pe acel obiect în sine. Pe de altă parte, să spunem că suntem un inginer, şi suntem angajați pentru a construi 300 de avioane. Ne apucăm să proiertăm pe fiecare în parte? NU! Proiectăm un model (o schiță), după care putem crea copii (numite referințe, în C#). Așa că atunci când se utilizează tipuri de referință, nu desfășurăm acțiuni sau folosim direct obiectul original (schița). În schimb, de fiecare dată când avem nevoie, vom crea o instanță (copie) a acesteia, și modificăm sau utilizăm acea copie.

Comments

comments

Tags: , ,

Leave a Reply