Wat zijn types?
In programmeertalen kunnen variabelen bestaan in twee categorieën van types: value types en reference types. Het verschil tussen deze twee zit in hoe de gegevens worden opgeslagen en gedeeld in het geheugen.
Een value type slaat een daadwerkelijke waarde op. Terwijl een reference type een verwijzing naar de locatie in het geheugen waar de waarde staat opslaat.
Casus
Denk aan het gebruik van een papieren agenda in vergelijking tot een online agenda. Wanneer je een wijziging maakt in de papieren agenda is het alleen daar te zien, niet in mogelijke kopieën die zijn gemaakt (Value). Als er een wijziging gemaakt is in de online agenda dan is dat te zien voor iedereen die er bij kan (Reference).
Hoe zitten types in elkaar?
Een variabele is standaard een van de twee types, welke van de twee het is heeft veel effect op hoe je er mee om kan gaan. Een veel gebruikt value type is de struct
. Dit is de basis voor veel datatypes, denk hier aan een integer, boolean of byte. Over het algemeen zijn dit datatypes met maar één gekoppelde waarde, met als uitzondering de -=STRUCT=-. Reference types zijn complexere datastructuren, denk hier aan een array, objecten of nog complexere datastructuren. Het moment dat het meer is dan alleen één waarde is het al een Reference type. Hier bij is string een unieke, dit is namelijk een reference type, maar kan behandeld worden als een value type in C#.
Voor het omgaan met de twee types is het belangrijk om de verschillen er tussen te weten. In de tabel hieronder is te zien hoe ze verschillende acties afhandelen.
Eigenschap | Value Types | Reference Types |
---|---|---|
Opslag | De waarde wordt direct opgeslagen. | Een verwijzing naar de waarde wordt opgeslagen. |
Toewijzing | Maakt een kopie van de waarde. | Beide variabelen delen dezelfde data. |
Wijzigingen | Beïnvloeden alleen de kopie. | Beïnvloeden de originele data. |
Onderstaande afbeelding geeft het ook mooi weer, bij de ‘pass by reference’ wordt de koffiekop doorgegeven maar als die gevuld wordt is ook het origineel gevuld. Bij de ‘pass by value’ wordt de originele koffiekop niet gevuld door de functie.
Figuur 1: Uitleg over pass by reference vs pass by value
Bij een vergelijking met een Reference type wordt er standaard gekeken naar de referentie. Dus ook al zijn de waardes van de variabel precies het zelfde, door het te vergelijken kan het resultaat zijn dat ze niet het zelfde zijn.
Codevoorbeeld
int getal1 = 5;
int getal2 = getal1;
getal1 -= 2;
Console.WriteLine(getal1 == getal2); // output: False
int[] getallen1 = {1,2,3};
int[] getallen2 = getallen1;
getallen1[0] = 5;
Console.WriteLine(getallen1.Equals(getallen2)); // output: True
int[] getallen3 = {5,2,3};
Console.WriteLine(getallen1.Equals(getallen3)); // output: False
In het voorbeeld is te zien dat het declareren van een value type met een andere value type alleen de waarde wordt gekopieerd. Terwijl er bij reference type de referentie wordt gekopieerd, waardoor de variabelen precies hetzelfde zullen zijn.
Hoe gebruik je types?
Over het algemeen is de keuze of er een value of reference type redelijk beperkt, aangezien dit gekoppeld is aan de gebruikte variabel type. Verder is het wel handig om bewust om te gaan met wanneer iets een value of reference type is. Door de nature van de verschillende types is er een duidelijk verschil in hoe acties zoals aanpassen en kopiëren gedaan moeten worden.
Volgende stap: Oefeningen types