Oefening: referentietypen ontdekken
- 8 minuten
Verwijzingstypen omvatten onder meer matrices, klassen en tekenreeksen. Verwijzingstypen worden anders behandeld dan waardetypen met betrekking tot de manier waarop waarden worden opgeslagen wanneer de toepassing wordt uitgevoerd.
In deze oefening leert u hoe verwijzingstypen verschillen van waardetypen en hoe u de new operator gebruikt om een variabele te koppelen aan een waarde in het geheugen van de computer.
Het verschil tussen verwijzingstypen en waardetypen
Een waardetypevariabele slaat de waarden rechtstreeks op in een opslaggebied dat de stack wordt genoemd. De stack is toegewezen aan de code die op dat moment wordt uitgevoerd in de CPU (ook wel stackframe of activeringsframe genoemd). Wanneer het stackframe is uitgevoerd, worden de waarden in de stack verwijderd.
Met een variabele van het referentietype worden de waarden opgeslagen in een afzonderlijk geheugengebied dat de heap wordt genoemd. De heap is een geheugengebied dat op hetzelfde moment wordt gedeeld door veel toepassingen die in het besturingssysteem worden uitgevoerd. De .NET-runtime communiceert met het besturingssysteem om te bepalen welke geheugenadressen beschikbaar zijn en vraagt een adres op waar de waarde kan worden opgeslagen. De .NET-runtime slaat de waarde op en retourneert vervolgens het geheugenadres aan de variabele. Wanneer uw code de variabele gebruikt, vindt de .NET-runtime probleemloos het adres dat in de variabele is opgeslagen om de waarde op te halen die daar is opgeslagen.
Vervolgens gaat u code schrijven die deze ideeën duidelijker illustreert.
Een referentietypevariabele definiëren
Verwijder of gebruik de operator
//voor regelopmerking om alle code uit de vorige oefeningen als commentaar te geven.Werk uw code als volgt bij in de Visual Studio Code-editor:
int[] data;De vorige code definieert een variabele die een waarde van het type
intmatrix kan bevatten.Op dit punt is
dataniet meer dan een variabele die een verwijzing kan bevatten, of eigenlijk een geheugenadres van een waarde in de heap. Omdat het niet verwijst naar een geheugenadres, wordt het een null-verwijzing genoemd.Een exemplaar van een matrix maken met behulp van
inthetnewtrefwoordWerk uw code bij in de Visual Studio Code-editor om een nieuw exemplaar van een matrix te maken en toe te wijzen met behulp van
intde volgende code:int[] data; data = new int[3];Het
newtrefwoord informeert .NET Runtime om een exemplaar vaninteen matrix te maken en vervolgens te coördineren met het besturingssysteem om de matrixformaat voor drie int-waarden in het geheugen op te slaan. De .NET-runtime voldoet de voorwaarden en retourneert het geheugenadres van de nieuweint-matrix. Tot slot wordt het geheugenadres opgeslagen in de gegevens van de variabele. De elementen van deint-matrix worden standaard ingesteld op de waarde0omdat dit de standaardwaarde is van eenint.Het codevoorbeeld wijzigen om beide bewerkingen uit te voeren in één regel code
De twee regels code in de vorige stap worden doorgaans ingekort tot één regel code om de variabele te declareren en een nieuw exemplaar van de
intmatrix te maken. Wijzig de code uit stap 3, zodat deze overeenkomt met het onderstaande.int[] data = new int[3];Hoewel er geen uitvoer is om te observeren, heeft deze oefening hopelijk duidelijkheid toegevoegd aan de manier waarop de C#-syntaxis zich verhoudt tot de stappen van het proces voor het werken met referentietypen.
Wat is er anders aan het gegevenstype C#-tekenreeks?
Het gegevenstype string is ook een verwijzingstype. U vraagt zich misschien af waarom een new operator niet is gebruikt bij het declareren van een tekenreeks. Dit is een louter een gebruiksgemak dat door de ontwerpers van C# wordt geboden. Omdat het string gegevenstype zo vaak wordt gebruikt, kunt u deze indeling gebruiken:
string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);
Achter de schermen wordt echter een nieuw exemplaar gemaakt System.String en geïnitialiseerd op 'Hallo wereld!'.
Praktische overwegingen bij het gebruik van waarde- en referentietypen
-
Waardetype (int): In dit voorbeeld zijn
val_Aenval_Bgehele getalstypen.
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}");
U moet de volgende uitvoer zien:
--Value Types--
val_A: 2
val_B: 5
Wanneer val_B = val_A deze wordt uitgevoerd, wordt de waarde val_A gekopieerd en opgeslagen in val_B. Dus, wanneer val_B wordt gewijzigd, val_A blijft dit niet van invloed.
-
Verwijzingstype (matrix): in dit voorbeeld
ref_Azijnref_Bdit matrixreferentietypen.
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]}");
U moet de volgende uitvoer zien:
--Reference Types--
ref_A[0]: 5
ref_B[0]: 5
Wanneer ref_B = ref_A deze wordt uitgevoerd, ref_B verwijst deze naar dezelfde geheugenlocatie als ref_A. Dus, wanneer ref_B[0] wordt gewijzigd, ref_A[0] verandert ook omdat ze beide verwijzen naar dezelfde geheugenlocatie. Dit is een belangrijk verschil tussen waardetypen en referentietypen.
Samenvatting
- Waardetypen kunnen kleinere waarden bevatten en worden opgeslagen in de stack. Verwijzingstypen kunnen grote waarden bevatten en er wordt een nieuw exemplaar van een verwijzingstype gemaakt met behulp van de operator
new. Variabelen van het verwijzingstype bevatten een verwijzing (het geheugenadres) naar de werkelijke waarde die in de heap is opgeslagen. - Verwijzingstypen omvatten onder meer matrices, tekenreeksen en klassen.
Kennis testen
Feedback
Is deze pagina nuttig?
No
Hulp nodig bij dit onderwerp?
Wilt u Ask Learn gebruiken om iets te verduidelijken of u door dit onderwerp te leiden?