Back to blog
References vs values: hoe C# met geheugen omgaat
Intermediate

References vs values: hoe C# met geheugen omgaat

David De Lombaerde David De Lombaerde · juli 10, 2026 · 8 min read

Het geheugen in twee zones

C# gebruikt twee geheugengebieden:

Value types: de kopie-wereld

Value types (zoals int, double, bool, struct) bewaren hun waarde rechtstreeks op de stack. Als je ze kopieert, maak je een echte kopie:

int a = 10;
int b = a;    // b is een KOPIE van a
b = 20;

Console.WriteLine(a);  // 10 — ongewijzigd!
Console.WriteLine(b);  // 20

Reference types: de verwijzings-wereld

Reference types (alle class-objecten) bewaren een verwijzing (adres) op de stack naar het object op de heap. Als je ze "kopieert", kopieer je alleen het adres:

class Punt { public double X; public double Y; }

Punt p1 = new Punt { X = 3, Y = 4 };
Punt p2 = p1;    // p2 wijst naar HETZELFDE object als p1!
p2.X = 99;

Console.WriteLine(p1.X);  // 99 — ook p1 is veranderd!

Echte kopie van een object maken

Voeg een kopieer-methode toe aan je klasse:

class Punt
{
    public double X { get; set; }
    public double Y { get; set; }

    public Punt Kopieer() => new Punt { X = this.X, Y = this.Y };
}

Punt p1 = new Punt { X = 3, Y = 4 };
Punt p2 = p1.Kopieer();  // echte kopie
p2.X = 99;

Console.WriteLine(p1.X);  // 3 — ongewijzigd

null: de lege referentie

Een reference type kan ook null zijn — een verwijzing naar niets. Dit is een veelvoorkomende oorzaak van fouten (NullReferenceException):

Punt? punt = null;

// Fout! Dit crasht:
// Console.WriteLine(punt.X);

// Veilige manier — controleer eerst:
if (punt != null)
    Console.WriteLine(punt.X);

// Of gebruik de null-conditionale operator:
Console.WriteLine(punt?.X);  // toont niets als punt null is

Strings zijn bijzonder

string is een reference type, maar gedraagt zich als een value type: een string is immutable (onveranderlijk). Elke bewerking geeft een nieuwe string terug:

string s1 = "AutoCAD";
string s2 = s1;
s2 = s2.ToUpper();

Console.WriteLine(s1);  // "AutoCAD" — ongewijzigd
Console.WriteLine(s2);  // "AUTOCAD"

In de volgende post leren we overerving en interfaces — het fundament van herbruikbare OOP-code.

Share this article

LinkedIn WhatsApp X

Comments

No comments yet — be the first!

Leave a comment

Sign in to skip moderation — anonymous comments are reviewed before appearing.