Exerciții - Descoperiți tipuri de referințe
- 8 minute
Tipurile de referințe includ matrice, clase și șiruri. Tipurile de referințe sunt tratate diferit de tipurile de valori referitoare la modul în care sunt stocate valorile atunci când aplicația execută.
În acest exercițiu, veți afla cum sunt diferite tipurile de referințe față de tipurile de valori și cum să utilizați new operatorul pentru a asocia o variabilă cu o valoare din memoria computerului.
Cum sunt diferite tipurile de referințe față de tipurile de valori
O variabilă de tip valoare stochează valorile direct într-o zonă de stocare denumită stivă. Stiva este alocată memoriei codului care rulează în prezent pe CPU (numit și cadru stivă sau cadru de activare). Când cadrul stivei s-a terminat de executat, valorile din stivă sunt eliminate.
O variabilă de tip de referință stochează valorile sale într-o regiune de memorie separată, numită heap. Heap este o zonă de memorie care este partajată în mai multe aplicații care rulează pe sistemul de operare în același timp. .NET Runtime comunică cu sistemul de operare pentru a determina ce adrese de memorie sunt disponibile și solicită o adresă unde poate stoca valoarea. .NET Runtime stochează valoarea, apoi returnează adresa memoriei variabilei. Atunci când codul dvs. utilizează variabila, .NET Runtime caută perfect adresa stocată în variabilă și preia valoarea stocată acolo.
În continuare veți scrie un cod care ilustrează aceste idei mai clar.
Definirea unei variabile de tip referință
Ștergeți sau utilizați operatorul de comentarii de linie
//pentru a comenta întregul cod din exercițiile anterioare.Actualizați codul în Visual Studio Code Editor după cum urmează:
int[] data;Codul anterior definește o variabilă care poate conține o valoare de tip
intmatrice.În acest moment,
dataeste doar o variabilă care ar putea conține o referință sau, mai degrabă, o adresă de memorie a unei valori în heap. Deoarece nu indică spre o adresă de memorie, se numește referință nulă.Crearea unei instanțe de
intmatrice utilizând cuvântulnewcheieActualizați codul în Visual Studio Code Editor pentru a crea și a atribui o instanță nouă de
intmatrice, utilizând următorul cod:int[] data; data = new int[3];Cuvântul
newcheie informează .NET Runtime să creeze o instanță deintmatrice, apoi să se coordoneze cu sistemul de operare pentru a stoca matricea dimensionată pentru trei valori int în memorie. .NET Runtime respectă și returnează o adresă de memorie a noiiintmatrice. În cele din urmă, adresa memoriei este stocată în datele variabilei. Elementeleintmatricei sunt implicite la valoarea0, deoarece aceasta este valoarea implicită a unuiint.Modificarea exemplului de cod pentru a efectua ambele operațiuni într-o singură linie de cod
Cele două linii de cod din pasul anterior sunt de obicei scurtate la o singură linie de cod pentru a declara variabila și pentru a crea o nouă instanță a matricei
int. Modificați codul de la pasul 3 la următorul.int[] data = new int[3];Deși nu există niciun rezultat de observat, sperăm că acest exercițiu a adăugat claritate la modul în care sintaxa C# se referă la pașii procesului pentru lucrul cu tipuri de referințe.
Ce este diferit în legătură cu tipul de date șir C#?
Tipul string de date este, de asemenea, un tip de referință. Poate că vă întrebați de ce un new operator nu a fost utilizat la declararea unui șir. Acest lucru este pur o comoditate oferit de designerii de C#.
string Deoarece tipul de date este utilizat atât de frecvent, aveți posibilitatea să utilizați acest format:
string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);
Cu toate acestea, în culise se creează o nouă instanță a System.String lui este creată și inițializată la "Hello World!".
Probleme practice în utilizarea tipurilor de valori și referințe
-
Tip de valoare (int): În acest exemplu
val_Așival_Bsunt tipuri de valori întregi.
int val_A = 2;
int val_B = val_A;
val_B = 5;
Console.WriteLine("--Value Types--");
Console.WriteLine($"val_A: {val_A}");
Console.WriteLine($"val_B: {val_B}");
Ar trebui să vedeți următoarea ieșire:
--Value Types--
val_A: 2
val_B: 5
Când val_B = val_A este executată, valoarea val_A este copiată și stocată în val_B. Deci, când val_B se schimbă, val_A rămâne neafectat.
-
Tip referință (matrice): În acest exemplu și
ref_Aref_Bsunt tipuri de referințe matrice.
int[] ref_A= new int[1];
ref_A[0] = 2;
int[] ref_B = ref_A;
ref_B[0] = 5;
Console.WriteLine("--Reference Types--");
Console.WriteLine($"ref_A[0]: {ref_A[0]}");
Console.WriteLine($"ref_B[0]: {ref_B[0]}");
Ar trebui să vedeți următoarea ieșire:
--Reference Types--
ref_A[0]: 5
ref_B[0]: 5
Atunci când ref_B = ref_A este executat, ref_B indică spre aceeași locație de memorie ca ref_A. Prin urmare, când ref_B[0] se modifică, se modifică, de asemenea, ref_A[0] deoarece ambele indică spre aceeași locație de memorie. Aceasta este o diferență esențială între tipurile de valori și tipurile de referințe.
Recapitula
- Tipurile de valori pot conține valori mai mici și sunt stocate în stivă. Tipurile de referințe pot conține valori mari și se creează o instanță nouă a unui tip de referință utilizând
newoperatorul. Variabilele de tip referință păstrează o referință (adresa memoriei) la valoarea reală stocată în heap. - Tipurile de referințe includ matrice, șiruri și clase.
Verificați-vă cunoștințele
Feedback
Această pagină a fost utilă?
Nu
Aveți nevoie de ajutor cu acest subiect?
Doriți să încercați să utilizați Întrebați Microsoft Learn pentru a clarifica sau primi îndrumări privind acest subiect?