Øvelse – Find referencetyper
- 8 minutter
Referencetyper omfatter matrixer, klasser og strenge. Referencetyper behandles anderledes end værdityper med hensyn til den måde, værdier gemmes på, når programmet kører.
I denne øvelse lærer du, hvordan referencetyper adskiller sig fra værdityper, og hvordan du bruger operatoren new til at knytte en variabel til en værdi i computerens hukommelse.
Sådan adskiller referencetyper sig fra værdityper
En værditypevariabel gemmer værdierne direkte i et lagerområde, der kaldes stakken. Stakken er hukommelse allokeret til den kode, der i øjeblikket kører på CPU'en (også kendt som stakrammen eller aktiveringsrammen). Når stakrammen er færdig med at blive udført, fjernes værdierne i stakken.
En referencetypevariabel gemmer værdierne i et separat hukommelsesområde, der kaldes heap. Heap er et hukommelsesområde, der deles på tværs af mange programmer, der kører på operativsystemet på samme tid. .NET Runtime kommunikerer med operativsystemet for at bestemme, hvilke hukommelsesadresser der er tilgængelige, og anmoder om en adresse, hvor værdien kan gemmes. .NET Runtime gemmer værdien og returnerer derefter hukommelsesadressen til variablen. Når din kode bruger variablen, søger .NET Runtime problemfrit efter den adresse, der er gemt i variablen, og henter den værdi, der er gemt der.
Du skal derefter skrive noget kode, der illustrerer disse idéer tydeligere.
Definer en referencetypevariabel
Slet eller brug linjekommentaroperatoren
//til at kommentere hele koden fra de forrige øvelser.Opdater din kode i Visual Studio Code Editor på følgende måde:
int[] data;Den forrige kode definerer en variabel, der kan indeholde en værdi af typen
intmatrix.På dette tidspunkt er blot en variabel,
datader kan indeholde en reference eller rettere en hukommelsesadresse for en værdi i heap. Da den ikke peger på en hukommelsesadresse, kaldes den en null-reference.Opret en forekomst af matrixen ved hjælp af
intnøgleordetnewOpdater din kode i Visual Studio Code Editor for at oprette og tildele en ny forekomst af matrix ved hjælp af
intfølgende kode:int[] data; data = new int[3];Nøgleordet
newinformerer .NET Runtime om at oprette en forekomst afintmatrixen og koordinerer derefter med operativsystemet for at gemme matrixstørrelsen for tre int-værdier i hukommelsen. .NET Runtime overholder og returnerer en hukommelsesadresse for den nyeintmatrix. Endelig gemmes hukommelsesadressen i variabeldataene. Matrixensintelementer er som standard værdien0, fordi det er standardværdien for enint.Rediger kodeeksemplen for at udføre begge handlinger på en enkelt kodelinje
De to kodelinjer i det forrige trin forkortes typisk til en enkelt kodelinje for begge at deklarere variablen og oprette en ny forekomst af matrixen
int. Rediger koden fra trin 3 til følgende.int[] data = new int[3];Selvom der ikke er noget output at observere, har denne øvelse forhåbentlig tilføjet klarhed over, hvordan C#-syntaksen er relateret til trinnene i processen til at arbejde med referencetyper.
Hvad er anderledes ved C#-strengdatatypen?
Datatypen string er også en referencetype. Du undrer dig måske over, hvorfor en new operator ikke blev brugt, da du erklærede en streng. Dette er udelukkende en bekvemmelighed, som designerne af C#.
string Da datatypen bruges så ofte, kan du bruge dette format:
string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);
Bag kulisserne oprettes der dog en ny forekomst af System.String , som initialiseres til "Hello World!".
Praktiske bekymringer ved hjælp af værdi- og referencetyper
-
Værditype (int): I dette eksempel
val_Aer ogval_Ber heltalsværdityper.
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}");
Du bør kunne se følgende output:
--Value Types--
val_A: 2
val_B: 5
Når val_B = val_A udføres, kopieres og gemmes værdien af val_A i val_B. Så når val_B er ændret, val_A forbliver upåvirket.
-
Referencetype (matrix): I dette eksempel
ref_Aer ogref_Bmatrixreferencetyper.
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]}");
Du bør kunne se følgende output:
--Reference Types--
ref_A[0]: 5
ref_B[0]: 5
Når ref_B = ref_A udføres, ref_B peger på den samme hukommelsesplacering som ref_A. Så når ref_B[0] ændres, ændres også, ref_A[0] fordi de begge peger på den samme hukommelsesplacering. Dette er en vigtig forskel mellem værdityper og referencetyper.
Resumé
- Værdityper kan indeholde mindre værdier og gemmes i stakken. Referencetyper kan indeholde store værdier, og der oprettes en ny forekomst af en referencetype ved hjælp af operatoren
new. Referencetypevariabler indeholder en reference (hukommelsesadressen) til den faktiske værdi, der er gemt i heap'en. - Referencetyper omfatter matrixer, strenge og klasser.
Tjek din viden
Feedback
Var denne side nyttig?
No
Har du brug for hjælp til dette emne?
Vil du prøve at bruge Ask Learn til at tydeliggøre eller guide dig gennem dette emne?