Boxing en unboxing
Krijg inzicht in de kosten van converteren naar object.
Boxing en unboxing is een gratis C# Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C# Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C# Academy bevat in totaal 4 lessen.
Wat is boxing?
Boxing verpakt een waardetype in een object, zodat het als referentietype kan worden behandeld. Met object o = 5; wordt de int op de heap geplaatst.
using System;
class Program
{
static void Main()
{
int n = 5;
object o = n; // boxing
Console.WriteLine("Boxed value: " + o);
}
}Waarom boxing gebeurt
Boxing gebeurt telkens wanneer je een waardetype toewijst aan een variabele van het type object (of aan een interface). De runtime reserveert een vak op de heap waarin een kopie van de waarde staat.
using System;
class Program
{
static void Main()
{
double d = 3.14;
object boxed = d; // boxing copies d into a heap object
Console.WriteLine(boxed);
}
}Wat is unboxing?
Unboxing haalt het waardetype met een expliciete cast weer uit het vak. Het type van de cast moet exact overeenkomen met het type dat is ingepakt.
using System;
class Program
{
static void Main()
{
object o = 42; // boxing
int n = (int)o; // unboxing
Console.WriteLine("Unboxed: " + n);
}
}Voor unboxing is het juiste type nodig
Je moet unboxen naar exact het oorspronkelijke type. Unboxen naar een ander type veroorzaakt InvalidCastException.
using System;
class Program
{
static void Main()
{
object o = 100;
try
{
long wrong = (long)o; // InvalidCastException at runtime
Console.WriteLine(wrong);
}
catch (InvalidCastException)
{
Console.WriteLine("Must unbox to int, not long");
}
}
}Boxing maakt een kopie
Bij boxing wordt de waarde gekopieerd. Als je het origineel daarna wijzigt, verandert de ingepakte kopie niet.
using System;
class Program
{
static void Main()
{
int n = 1;
object o = n; // box copies 1
n = 99;
Console.WriteLine("original=" + n + ", boxed=" + o);
}
}De kosten van boxing
Elk vak reserveert geheugen op de heap en verhoogt de belasting voor garbage collection. In intensief uitgevoerde lussen kan deze overhead de prestaties aanzienlijk verminderen.
using System;
class Program
{
static void Main()
{
// Each iteration boxes an int -> many heap allocations
object sumBox = 0;
for (int i = 0; i < 5; i++)
{
int current = (int)sumBox + i;
sumBox = current; // box again
}
Console.WriteLine("Result: " + sumBox);
}
}Boxing vermijden met generics
Generieke verzamelingen zoals List<int> slaan waardetypen op zonder boxing, in tegenstelling tot de oude niet-generieke ArrayList.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var list = new List<int>(); // no boxing
list.Add(1);
list.Add(2);
int first = list[0]; // no unboxing
Console.WriteLine("First: " + first);
}
}Boxing met interfaces
Als je een struct toewijst aan een interfacevariabele, wordt deze ook geboxed, omdat de interfacereferentie naar een object op de heap moet verwijzen.
using System;
class Program
{
static void Main()
{
int n = 7;
IComparable c = n; // boxing to interface
Console.WriteLine(c.CompareTo(10));
}
}Geboxte typen herkennen
Je kunt het type van een geboxed object tijdens runtime controleren met is voordat je het veilig unboxt.
using System;
class Program
{
static void Main()
{
object o = 3.5;
if (o is double d)
Console.WriteLine("It is a double: " + d);
else
Console.WriteLine("Not a double");
}
}Boxing bij het samenvoegen van tekenreeksen
Als je een waardetype met tekenreeksen samenvoegt, kan het worden geboxed. Interpolatie of ToString gebruiken is vaak duidelijker, hoewel boxing hier meestal verwaarloosbaar is.
using System;
class Program
{
static void Main()
{
int count = 3;
string msg = "Count is " + count; // count is converted
Console.WriteLine(msg);
}
}Alles bij elkaar
Boxing overbrugt de werelden van waarden en verwijzingen, maar kost geheugenreserveringen. Gebruik bij voorkeur generics om boxing te vermijden en unbox naar exact het juiste type met een veilige controle.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
object boxed = 256;
if (boxed is int value)
Console.WriteLine("Safely unboxed: " + value);
var noBox = new List<int> { 1, 2, 3 };
Console.WriteLine("Generic count: " + noBox.Count);
}
}Korte test
Test je begrip van boxing en unboxing.
Samenvatting
Boxing verpakt een waardetype in een object op de heap (bijvoorbeeld object o = 5;); unboxing haalt het er met een expliciete cast naar exact het oorspronkelijke type weer uit. Boxing kopieert de waarde en reserveert geheugen, waardoor de belasting voor GC toeneemt. Gebruik bij voorkeur generieke verzamelingen zoals List<int> om boxing te vermijden en gebruik is voor veilig unboxen.
using System;
class Program
{
static void Main()
{
object boxed = 42; // box
int n = (int)boxed; // unbox
Console.WriteLine(n);
}
}Leer C# met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 93
- Lessen
- 346
Veelgestelde vragen
Is de les “Boxing en unboxing” gratis?
Ja — de volledige tekst van “Boxing en unboxing” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C# Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C# Academy bevat in totaal 4 lessen.
Wat leer ik in “Boxing en unboxing”?
Krijg inzicht in de kosten van converteren naar object. Je oefent met C# Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C# Academy te beginnen?
Ervaring vooraf is niet nodig. C# Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Boxing en unboxing”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C# Academy?
Ja. Elke les over C# Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Waardetypen versus referentietypen
- Boxing en unboxing
- Impliciete en expliciete conversies
- De klasse Convert en parsen